度量学习---综述

article/2025/11/10 5:06:34

introduction

度量学习的对象通常是样本特征向量的距离,度量学习的目的是通过训练和学习,减小或限制同类样本之间的距离,同时增大不同类别样本之间的距离。

度量学习 (Metric Learning) == 距离度量学习 (Distance Metric Learning,DML) == 相似度学习
是人脸识别中常用的机器学习方法,由Eric Xing在NIPS 2002提出。既可基于监督学习的,也可以基于非监督学习。

与经典识别网络的区别
经典识别网络有一个bug:必须提前设定好类别数,例如softmax loss。
这也就意味着,每增加一个新种类,就要重新定义网络模型,并从头训练一遍。

比如我们要做一个门禁系统,每增加或减少一个员工(等于是一个新类别),就要修改识别网络并重新训练。很明显,这种做法在某些实际运用中很不科学。

科普一下在训练和测试人脸识别分类器的时候经常被提到的Open-set 和Close-set:—
close-set,就是所有的测试集都在训练集中出现过。所以预测结果是图片的ID,如果想要测试两张图片是否是同一个,那么就看这两张图片的预测ID是否一样即可。
open-set,就是测试的图片并没有在训练集中出现过,那么每张测试图片的预测结果是特征向量,如果想要比较两张图片的人脸是否属于同一个人,需要测试图像特征向量的距离。

理想的Open-set就需要度量学习,人脸识别学习到的特征应当在特定的度量空间中,满足同一类的最大类内距离小于不同类的最小类间距离。然后再使用最近邻检索就可以实现良好的人脸识别和人脸验证性能。
然而softmax loss仅仅能够使得特征可分,还不能够使得特征具有可判别性,所以需要对softmax loss进行改造。

因此,Metric Learning作为经典识别网络的替代方案,可以很好地适应某些特定的图像识别场景。一种较好的做法,是丢弃经典神经网络最后的softmax层,改成直接输出一个feature vector,去特征库里面按照Metric Learning寻找最近邻的类别作为匹配项。

基本流程
一般的度量学习包含以下步骤:

  • Encoder编码模型:用于把原始数据编码为特征向量(重点如何训练模型)
  • 相似度判别算法:将一对特征向量进行相似度比对(重点如何计算相似度,阈值如何设定)

关键问题

  • 网络设计:代表有孪生神经网络(Siamese network)
  • hard negative mining:找出难以区分的样本,更利于训练收敛。
  • pairs weighting/pair-based loss functions:改进loss函数,促使网络优化, 使具有相同标签的样本在嵌入空间中尽量接近 ,具有不同标签的样本在嵌入空间中尽量远离。

损失函数

度量学习(metric learning)损失函数
常用度量学习损失函数
度量学习 度量函数 metric learning deep metric learning 深度度量学习
『深度概念』度量学习中损失函数的学习与深入理解
浅谈人脸识别中的loss 损失函数

baselineSoftmax loss
基于距离的算法Triplet loss, center loss
基于角度的算法angular loss

基本loss概述

1. Softmax loss
在这里插入图片描述
在这里插入图片描述
这种方式只考虑了能否正确分类,却没有考虑类间距离。所以提出了center loss 损失函数。
2. Center loss
在这里插入图片描述
在这里插入图片描述
center loss 考虑到不仅仅是分类要对,而且要求类间有一定的距离。上面的公式中 C y i C_{y_{i}} Cyi表示某一类的中心, X i \mathcal{X}_{i} Xi表示每个人脸的特征值。作者在softmax loss的基础上加入了 L C L_{C} LC,同时使用参数 λ \lambda λ来控制类内距离,整体的损失函数如下:
在这里插入图片描述
在这里插入图片描述
3. Triplet Loss
在这里插入图片描述
三元组损失函数,三元组由Anchor, Negative, Positive这三个组成。从上图可以看到,一开始Anchor离Positive比较远,我们想让Anchor和Positive尽量的靠近(同类距离),Anchor和Negative尽量的远离(类间距离)。
在这里插入图片描述
表达式左边为同类距离 ,右边为不同的类之间的距离。使用梯度下降法优化的过程就是让类内距离不断下降,类间距离不断提升,这样损失函数才能不断地缩小。

Triplet Loss和triplets挖掘

更多原理与细节请参考文章:
https://omoindrot.github.io/triplet-loss
中文翻译:Tensorflow实现Triplet Loss
对应tensorflow代码:https://github.com/omoindrot/tensorflow-triplet-loss

如何将triplet应用于分类:
https://github.com/adambielski/siamese-triplet

networks.py
EmbeddingNet
— base network for encoding images into
embedding vector
ClassificationNetwrapper for an embedding network,adds a fully connected layer and log softmax for classification
SiameseNet — wrapper for an embedding network, processes pairs of
inputs TripletNet - wrapper for an embedding network, processes triplets of inputs

triplet网络模型:
https://github.com/SpikeKing/triplet-loss-mnist

Triplet Loss的核心是锚示例、正示例、负示例共享模型,通过模型,将锚示例与正示例聚类,远离负示例。
Triplet Loss Model的结构如下:
输入:三个输入,即锚示例、正示例、负示例,不同示例的结构相同;
模型:一个共享模型,支持替换为任意网络结构;
输出:一个输出,即三个模型输出的拼接。
在这里插入图片描述
在这里插入图片描述

为什么不用softmax?
谷歌的论文FaceNet: A Unified Embedding for Face Recognition and Clustering最早将triplet loss应用到人脸识别中。他们提出了一种实现人脸嵌入和在线triplet挖掘的方法,这部分内容我们将在后面章节介绍。

在监督学习中,我们通常都有一个有限大小的样本类别集合,因此可以使用softmax和交叉熵来训练网络。但是,有些情况下,我们的样本类别集合很大,比如在人脸识别中,标签集很大,而我们的任务仅仅是判断两个未见过的人脸是否来自同一个人。

Triplet loss就是专为上述任务设计的。它可以帮我们学习一种人脸嵌入,使得同一个人的人脸在嵌入空间中尽量接近,不同人的人脸在嵌入空间中尽量远离。

定义损失

Triplet可以理解为一个三元组,它由三部分组成:

  • anchor在这里我们翻译为原点
  • positive同类样本点(与原点同类)
  • negative异类样本点

针对三元组中的每个元素(样本),训练一个参数共享或者不共享的网络,得到三个元素的特征表达(embedings)
在这里插入图片描述

Triplet loss的目标:

  • 使具有相同标签的样本在嵌入空间中尽量接近
  • 使具有不同标签的样本在嵌入空间中尽量远离

值得注意的一点是,如果只遵循以上两点,最后嵌入空间中相同类别的样本可能collapse到一个很小的圈子里,即同一类别的样本簇中样本间的距离很小,不同类别的样本簇之间也会偏小。因此,我们加入间隔(margin)的概念——跟SVM中的间隔意思差不多。只要不同类别样本簇简单距离大于这个间隔就阔以了。

我们要求,在嵌入空间d中,三元组(a,p,n)的损失函数为:
L = max ⁡ ( d ( a , p ) − d ( a , n ) + margin ⁡ , 0 ) L=\max (d(a, p)-d(a, n)+\operatorname{margin}, 0) L=max(d(a,p)d(a,n)+margin,0)
最小化该L,则d(a,p)→0, d(a,n)>margin。

Triplets挖掘

基于前文定义的Triplet loss,可以将三元组分为一下三个类别:

  • easy triplets:可以使loss = 0的三元组,即容易分辨的三元组
  • hard triplets:d(a,n)<d(a,p)的三元组,即一定会误识别的三元组
  • semi-hard triplets:d(a,p)<d(a,n)<d(a,p)+margin的三元组,即处在模糊区域(关键区域)的三元组
    在这里插入图片描述
    图中,a为原点位置,p为同类样本例子,不同颜色表示的区域表示异类样本分布于三元组类别的关系.
    显然,中间的Semi-hard negatives样本对我们网络模型的训练至关重要。

N-pair loss

Sohn, K.: Improved deep metric learning with multi-class n-pair loss objective. In:
NIPS. (2016)
Improved Deep Metric Learning with Multi-class N-pair Loss Objective论文N-pair loss解读与实现
pytorch代码:1、https://github.com/ChaofWang/Npair_loss_pytorch/blob/master/Npair_loss.py
2、https://github.com/leeesangwon/PyTorch-Image-Retrieval/blob/public/losses.py
tensorflow代码(多种度量学习loss函数):https://github.com/tensorflow/tensorflow/blob/r1.10/tensorflow/contrib/losses/python/metric_learning/metric_loss_ops.py

Angular Loss

【2017_ICCV】Deep Metric Learning with Angular Loss
tensorflow代码:https://github.com/geonm/tf_angular_loss
pytorch代码:https://github.com/leeesangwon/PyTorch-Image-Retrieval/blob/public/losses.py
SphereFace论文学习:该文提到的A-softmax loss就是Angular Loss的源泉

  • 提出了Angular Loss,用角度关系作为相似性度量。- 之前的方法主要用距离进行相似性度量,距离度量在尺度变化时比较敏感,并且对于不同的intra-class采用相同的margin也不合适,Angular Loss自带旋转不变和尺度不变。
  • 优点:
    • 引入尺度不变,提高了目标对于特征差异的鲁棒性;
    • 增加了三阶几何限制,捕获了triplet triangles的附加局部结构;
    • 收敛更好。

文章列表

Improved Deep Metric Learning with Multi-class N-pair Loss Objective论文N-pair loss解读与实现

CVPR2019 Ranked List Loss for Deep Metric Learning | 论文分享

距离和相似度度量方法


http://chatgpt.dhexx.cn/article/ZtpmsAJ0.shtml

相关文章

Deep metric learning 深度度量学习 总结

最近的工作用是深度度量学习的改进&#xff0c;这里将DML进行一个总结。 根据个人的理解&#xff0c;开篇用一句话介绍一下度量学习&#xff1a; “不同于分类学习&#xff0c;度量学习是通过学习数据之间的相似性程度来获得一个更有意义或者说更具可分性的特征空间。” Tra…

度量学习方法总结

目录 一.距离度量 闵可夫斯基距离 欧式距离&#xff08;Euclidean Distance&#xff09;&#xff1a; 标准化欧氏距离 (Standardized Euclidean distance ) 曼哈顿距离(ManhattanDistance) 切比雪夫距离&#xff08;Chebyshevdistance&#xff09; 马氏距离 马氏距离代…

度量学习

度量学习&#xff08;Metric Learning&#xff09; 度量&#xff08;Metric&#xff09;的定义 在数学中&#xff0c;一个度量&#xff08;或距离函数&#xff09;是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空间。 度量学习&#xff08;Metric Learni…

度量学习(Metric learning、损失函数、triplet、三元组损失、fastreid)

定义 Metric learning 是学习一个度量相似度的距离函数:相似的目标离得近,不相似的离得远. 一般来说,DML包含三个部分&#xff0c; 如下图.。 1&#xff09;特征提取网络&#xff1a;map embedding 2&#xff09;采样策略&#xff1a;将一个mini-batch里的样本组合成很多个sub…

度量学习Metric Learning

度量学习 (Metric Learning) 距离度量学习 (Distance Metric Learning&#xff0c;DML) 相似度学习 度量学习 是指 距离度量学习&#xff0c;Distance Metric Learning&#xff0c;简称为 DML&#xff0c;是人脸识别中常用传统机器学习方法&#xff0c;由Eric Xing在NIPS 2…

度量学习(Metric Learning)基础概念

一、什么是度量学习&#xff1f; 度量学习 (Metric Learning) 距离度量学习 (Distance Metric Learning&#xff0c;DML) 相似度学习。 在数学中&#xff0c;一个度量&#xff08;或距离函数&#xff09;是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空…

度量学习——总结

传统方法 User guide: contents — metric-learn 0.6.2 documentation 深度学习 基于深度学习的度量学习方法大都由两个部分组成&#xff1a;特征提取模块和距离度量模块。距离度量模块的任务是使同一类样本间的距离更靠近&#xff0c;而不同类样本间的距离更远离。这一模块…

ffmpeg命令分析-r

本系列 以 ffmpeg4.2 源码为准&#xff0c;下载地址&#xff1a;链接&#xff1a;百度网盘 提取码&#xff1a;g3k8 之前的文章分析 FFMpeg 工程的 do_video_out() 函数的时候&#xff0c;建议不关注 delta0&#xff0c;delta&#xff0c;nb0_frames&#xff0c;nb_frames 等变…

使用FFmpeg命令处理音视频

文章目录 前言一、ffprobe相关命令1.使用ffprobe查看音频文件的信息2.使用ffprobe查看视频文件的信息 二、ffplay相关命令1.基本的ffplay命令2.音视频同步命令 三、ffmpeg相关命令1.ffmpeg通用参数2.ffmpeg视频参数3.ffmpeg音频参数4.ffmpeg示例 总结 前言 FFmpeg是一套可以用…

ffmpeg-命令行详解

前言 ffmpeg是一个多媒体开发库&#xff0c;提供了关于音频和视频的工具。这个项目的官网是这里。 下载地址 ffmpeg提供了方便地控制台命令&#xff0c;可以在下载页面下载。三个平台&#xff08;windows&#xff0c;linux&#xff0c;macos&#xff09;都有打包好的可执行文…

ffmpeg命令分析-b:v

本系列 以 ffmpeg4.2 源码为准&#xff0c;下载地址&#xff1a;链接&#xff1a;百度网盘 提取码&#xff1a;g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接&#xff1a;百度网盘&#xff0c;提取码&#xff1a;nl0s 。 命令如下&#xff1a;…

FFmpeg命令详解

命令格式 功能 FFmpeg命令是在ffmpeg.exe可执行文件环境下执行&#xff0c;ffmpeg.exe用于音视频的转码&#xff0c;加水印&#xff0c;去水印&#xff0c;视频剪切&#xff0c;提取音频&#xff0c;提取视频&#xff0c;码率控制等等功能。 最简单的命令 ffmpeg -i input.a…

FFmpeg命令行转码

本文主要了解FFmpeg进行音视频编码转换。主要学习如下几个知识点&#xff1a; FFmpeg使用libx264进行H,264(AVC)软编码&#xff0c;使用libx265进行H.265(HEVC)软编码使用FFmpeg在MacOS环境下硬编码了解音频编码&#xff0c;MP3&#xff0c;AAC的参数设置编码 FFmpeg软编码H.…

ffmpeg命令行使用

查看视频信息 ffmpeg -i 视频名字视频名字这里输入前几个字符按 tab 键可以自动补全 返回结果&#xff1a; 红框之内的内容没什么用 编码器 &#xff1a;encoder : Lavf57.25.100 持续时间&#xff1a;Duration: 00:14:20.58, start: 0.000000, bitrate: 381 kb/s Duratio…

ffmpeg录屏命令

1.gdigrab抓屏 ffmpeg -f gdigrab -i desktop -q:v 0.01 -vcodec mpeg4 -f mp4 out.mp4-i 输入设备 -vcodec 视频编码格式 -f 视频封装格式 缺点只能录制视频&#xff0c;不能录制音频 2.dshow 下载安装screen capture recorder https://sourceforge.net/projects/screencap…

FFMPEG常用命令行

目录 命令格式&#xff1a; 1.获取视频信息 2.转视频/音频格式 视频格式转换 音频格式转换 3.音视频分离 4.图像处理 5.视频旋转 6.视频倒放&视频加速&视频减速 7.视频合并&#xff08;两个10秒的视频合并为20秒&#xff09;&#xff1a; 8.视频拼接&…

FFmpeg命令介绍

FFmpeg 简介轶闻常用命令视频相关音频相关录制命令 简介 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。使用C语言进行开发&#xff0c;采用LGPL或GPL许可证&#xff0c;可前往Github下载其源码。它提供了录制、转换以及流化音…

ffmpeg命令大全

ffmpeg命令大全 FFMPEG 目录及作用FFMPEG基本概念FFMPEG 命令基本信息查询命令主要参数视频参数音频参数录制录屏 分解与复用滤镜简单滤镜复杂滤镜 直播相关 前言 FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理&#xff0c;也可以使用它…

音视频ffmpeg——ffmpeg 命令大全

ffmpeg 命令参数 ffmpeg信息查询命令 ffmpeg 控制命令 主要参数&#xff1a; ◼ -i 设定输入流 ◼ -f 设定输出格式(format) ◼ -ss 开始时间 ◼ -t 时间长度 音频参数&#xff1a; ◼ -aframes 设置要输出的音频帧数 ◼ -b:a 音频码率 ◼ -ar 设定采样率 ◼ -ac 设定…

常见FFmpeg命令行全面分析

FFmpeg多媒体库支持的命令行调用分为三个模块&#xff1a;ffmpeg、ffprobe、ffplay。其中ffmpeg命令行常用于音视频剪切、转码、滤镜、拼接、混音、截图等&#xff1b;ffprobe用于检测多媒体流格式&#xff1b;ffplay用于播放视频。详情可查阅FFmpeg官方文档&#xff1a;ffmpeg…