【ReID】表征学习和度量学习

article/2025/11/10 21:16:59

文章目录

  • 1.表征学习
    • 1.1分类损失
    • 1.2验证损失
    • 1.3表征学习总结
  • 2.度量学习
    • 2.1 Introduction
    • 2.2 对比损失
    • 2.3 三元组损失
    • 2.4 改进三元组损失
    • 2.5 四元组损失
    • 2.6 TriHard loss
    • 2.7 Triple loss with adaptive weights
    • 2.8 度量学习总结
  • 3. 总结

表征学习和度量学习是行人重识别最基本的两种方法,目前几乎所有的行人重识别算法都是基于表征学习或度量学习进行拓展的。

1.表征学习

表征学习的方法没有直接在训练网络的时候考虑图片间的相似度, 而是把行人重识别任务当做分类问题或者验证问题来看待。

1.1分类损失

分类损失又称ID损失:利用行人的ID作为训练标签来训练模型,每次只需要输入一张图片。(例如market1501有751个类别,那最后一层输出神经元就有751个,损失函数即定义为分类错误率)
只有ID损失的网络称为ID Embedding网络(IDE网络)。IDE网络是ReID领域最基础的一个网络模型,类似于程序语言设计中的Hello world。特征层后接一个全连接层改变输出维度(与类别数匹配),经过Softmax激活函数计算交叉熵损失。 测试阶段使用倒数第二层的特征向量进行检索,分类FC层丢弃。
可以同时连接几个属性分类损失,增强ReID特征的性能。每一个属性损失都是一个分类的交叉熵。可以等效于一个multi-task的网络。测试阶段将所有分类FC丢弃,只使用ReID特征。

1.2验证损失

验证损失:输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人,等效于二分类问题(是或否)。
每次输入一对(两张)图片,进入同一个Siamese网络(连体网络)提取特征。融合两个特征信息计算一个二分类损失(验证损失)。训练阶段可以和ID损失一起使用。测试阶段输入两张图片,直接判断该两张图片是否属于一个行人。

1.3表征学习总结

1)通过构造网络来直接得到鲁棒的ReID特征,不直接学习图片之间的相似性
2)通常需要额外的FC层来辅导特征学习,测试阶段FC层会被丢弃
3)ID损失的FC层维度与ID数量一致,当训练集太大时网络巨大,训练收敛很难
4)验证损失测试的时候需要输入一对图片,识别效率很低
5)表征学习通常而言训练比较稳定,结果易复现
6)表征学习的分布式训练通常比较成熟

2.度量学习

度量学习旨在通过神经网络学习出两张图片的相似度。在行人重识别问题上, 表现为同一行人的不同图片间的相似度大于不同行人的不同图片。表征学习和度量学习最大的区别在于:前者没有距离度量函数,后者得loss function则是在距离度量函数的基础上进行考虑的。

2.1 Introduction

度量学习旨在学习出两张图片的相似性。定义一个映射:
f ( x ) : R F → R D f(x):{\mathbb{R}^F} \to {\mathbb{R}^D} f(x):RFRD
其中, R F {R}^F RF 为图像空间, R D {R}^D RD为特征空间, f ( x ) f(x) f(x)为我们要学习的网络模型。
将图片从原始域映射到特征域, 之后再定义一个距离度量函数:
D ( x , y ) : R D × R D → R D(x,y):{\mathbb{R}^D} \times {\mathbb{R}^D} \to \mathbb{R} D(x,y):RD×RDR
通过这个距离度量函数来计算两个特征向量之间的距离。最后通过最小化网络的度量损失, 来寻找一个最优的映射 f ( x ) f(x) f(x) , 使得相同行人两张图片(正样本对)的距离尽可能小, 不同行人两张图片(负样本对)的距离尽可能大。这个映射 f ( x ) f(x) f(x) , 就是我们训练得到的深度卷积网络。
欧氏距离:
d I 1 , I 2 = ∥ f I 1 − f I 2 ∥ 2 {d_{{I_1},{I_2}}} = {\left\| {{f_{{I_1}}} - {f_{{I_2}}}} \right\|_2} dI1,I2=fI1fI22
余弦距离:
d I 1 , I 2 = 1 − f I 1 ⋅ f I 2 ∥ f I 1 ∥ 2 ∥ f I 2 ∥ 2 {d_{{I_1},{I_2}}} = 1 - \frac{{{f_{{I_1}}} \cdot {f_{{I_2}}}}}{{{{\left\| {{f_{{I_1}}}} \right\|}_2}{{\left\| {{f_{{I_2}}}} \right\|}_2}}} dI1,I2=1fI12fI22fI1fI2
距离函数是连续的,所以可以训练一个End-to-End 的网络模型。

度量学习就是使相同ID的图片在特征空间内尽量靠近,不同ID的图片在特征空间内尽量远离(类似于聚类)。
假设有 i , j i,j i,j两张图片,它们通过神经网络学习到的特征向量为 x ^ i , x ^ j {\hat x_i},{\hat x_j} x^i,x^j,这两个特征向量之间的距离为:
D M ( x ^ i , x ^ j ) = ( x ^ i − x ^ j ) T M ( x ^ i − x ^ j ) {D_M}({\hat x_i},{\hat x_j}) = {({\hat x_i} - {\hat x_j})^T}M({\hat x_i} - {\hat x_j}) DM(x^i,x^j)=(x^ix^j)TM(x^ix^j)
传统的度量学习就是在 x ^ i , x ^ j {\hat x_i},{\hat x_j} x^i,x^j固定的前提下选取合适的方阵 M M M ,但是现在的深度学习正好反过来。深度学习中,如果使用欧氏距离,则方阵 M M M 就是单位矩阵,我们不需要再学习方阵 M M M ,而是通过学习不同的网络参数来获得更好的特征向量(传统度量学习中特征向量是不变的,因为网络参数固定)。
另一方面,从数学的角度看,方阵 M M M如果对称的话,则一定可以分解成 M = A T A M = {A^T}A M=ATA的形式,如果不对称,也可以找到符合 M ≈ A T A M \approx {A^T}A MATA的近似解,这就相当于将矩阵A放在了网络参数中进行学习。

度量学习的损失函数类型有很多,其中比较经典的有以下几种:
对比损失(Contrastive loss),三元组损失(Triplet loss),改进三元组损失( lmproved triplet loss),四元组损失(Quadruplet loss),TriHard loss。

2.2 对比损失

损失函数形式为
L c = y d I a , I b 2 + ( 1 − y ) ( α − d I a , I b ) + 2 {L_{\text{c}}} = yd_{{I_a},{I_b}}^2 + (1 - y)(\alpha - {d_{{I_a},{I_b}}})_ + ^2 Lc=ydIa,Ib2+(1y)(αdIa,Ib)+2
其中 d I 1 , I 2 = ∥ f I 1 − f I 2 ∥ 2 {d_{{I_1},{I_2}}} = {\left\| {{f_{{I_1}}} - {f_{{I_2}}}} \right\|_2} dI1,I2=fI1fI22 ( z ) + {(z)_ + } (z)+ 表示 max ⁡ ( z , 0 ) \max (z,0) max(z,0)。对于该损失函数,可以这么理解:每次输入一对(两张)图片,拉近正样本对(y=1)间距离趋于0,推开负样本对(y=0)间距离大于 α \alpha α

2.3 三元组损失

选三张图片:anchor(锚点),positive(与原点属于同类别的正样本),ngative(与原点属于不同类别的负样本)。
我们希望:
d a , p + α < d a , n {d_{a,p}} + \alpha < {d_{a,n}} da,p+α<da,n
所以损失函数形式为:
L t = ( d a , p − d a , n + α ) + {L_t} = {({d_{a,p}} - {d_{a,n}} + \alpha )_ + } Lt=(da,pda,n+α)+
即正样本对的距离应比负样本对的距离小 α \alpha α
三元组损失有一个缺点:它更关注相对距离,不考虑绝对距离。换句话说,它控制的是 d a , p − d a , n {d_{a,p}} - {d_{a,n}} da,pda,n,而不是 d a , p {d_{a,p}} da,p

2.4 改进三元组损失

为了改善三元组损失的缺陷,又提出了改进三元组损失:
L t = d a , p + ( d a , p − d a , n + α ) + {L_t} = {d_{a,p}} + {({d_{a,p}} - {d_{a,n}} + \alpha )_ + } Lt=da,p+(da,pda,n+α)+
此时, d a , p {d_{a,p}} da,p 的值也会影响损失函数的值。

2.5 四元组损失

输入四张图片,一个anchor,一个正样本,两张负样本,共3个ID。
L t = ( d a , p − d a , n 1 + α ) + + ( d a , p − d n 1 , n 2 + β ) + {L_t} = {({d_{a,p}} - {d_{a,n1}} + \alpha )_ + } + {({d_{a,p}} - {d_{n1,n2}} + \beta )_ + } Lt=(da,pda,n1+α)++(da,pdn1,n2+β)+
损失函数中,第一项为正常的三元组损失,第二项为弱推动的三元组损失( β \beta β通常小于 α \alpha α )。此外,四元组损失的第二项也在一定程度上解决了三元组损失不考虑绝对距离的缺陷。

2.6 TriHard loss

难样本挖掘:传统的度量学习方法是随机采样组成元祖样本,但是这样采集的样本通常是一些非常容易识别的样本,不利于训练表达能力强的ReID网络。为了解决这个问题,提出了TriHard loss(有时也称Hard loss)。
TriHard loss(Triplet loss with hard example mining)的核心思想是:对于每一个训练batch挑选P个ID的行人,每个行人,随机挑选K张不同的图片,即一个batch含有P×K张图片。之后对于batch中的每一张图片a,我们可以挑选一个最难的正样本和一个最难的负样本和a组成一个三元组。首先我们定义和a为相同ID的图片集为A,剩下不同ID的图片集为B,则TriHard损失表示为:
L t h = 1 P × K ∑ a ∈ b a t c h ( max ⁡ p ∈ A d a , p − min ⁡ n ∈ B d a , n + α ) + {L_{th}} = \frac{1}{{P \times K}}\sum\limits_{a \in batch} {{{(\mathop {\max }\limits_{p \in A} {d_{a,p}} - \mathop {\min }\limits_{n \in B} {d_{a,n}} + \alpha )}_ + }} Lth=P×K1abatch(pAmaxda,pnBminda,n+α)+
这个定义其实有点类似于聚类中簇间最大相似度(簇间最小距离),即将两簇之间距离最近的样本间距作为簇间距,使得簇间距满足模型要求。

2.7 Triple loss with adaptive weights

三元组损失选取的样本通常是一些非常容易识别的样本,而TriHard loss选取样本过于极端。针对这个缺陷,有人提出了自适应权重的Triplet loss,该损失函数考虑到了所有的样本对,并根据距离赋予不同的权重。其函数形式为:
L 3 = [ m + ∑ x p ∈ P ( a ) w p d ( x a , x p ) − ∑ x n ∈ N ( a ) w n d ( x a , x n ) ] + w p = e d ( x a , x p ) ∑ x ∈ P ( a ) e d ( x a , x ) , w n = e − d ( x a , x n ) ∑ x ∈ N ( a ) e − d ( x a , x ) \begin{array}{c} {L_3} = {[m + \sum\limits_{{x_p} \in P(a)} {{w_p}d({x_a},{x_p}) - } \sum\limits_{{x_n} \in N(a)} {{w_n}d({x_a},{x_n})} ]_ + }\\ {w_p} = \frac{{{e^{d({x_a},{x_p})}}}}{{\sum\limits_{x \in P(a)} {{e^{d({x_a},x)}}} }},{\rm{ }}{w_n} = \frac{{{e^{ - d({x_a},{x_n})}}}}{{\sum\limits_{x \in N(a)} {{e^{ - d({x_a},x)}}} }} \end{array} L3=[m+xpP(a)wpd(xa,xp)xnN(a)wnd(xa,xn)]+wp=xP(a)ed(xa,x)ed(xa,xp),wn=xN(a)ed(xa,x)ed(xa,xn)

自适应权重损失根据样本对之间的距离计算自适应权重。对于正样本对,距离越大,权重越大;对于负样本对,距离越大,权重越小。

2.8 度量学习总结

• 通过构造网络来直接学习图片之间的相似性
• 不需要额外的FC层来辅导特征学习
• 网络大小与训练集规模无关,但是数据采样器时间消耗会增加
• TriHard Loss为目前业界度量学习的标杆
• 度量学习通常而言训练比较随机,需要一定的训练经验
• 度量学习的分布式训练不太成熟,通常需要自己实现部分代码

3. 总结

在这里插入图片描述
表征学习的趋势是得到每个ID间的分界面;度量学习类似于聚类,将相同ID的样本聚合在一起,不同ID的样本尽量分开。

在这里插入图片描述

可以结合表征学习和度量学习联合训练,但是测试阶段表征学习的FC层还是要丢弃。


http://chatgpt.dhexx.cn/article/7hqsmVTR.shtml

相关文章

度量学习---综述

introduction 度量学习的对象通常是样本特征向量的距离&#xff0c;度量学习的目的是通过训练和学习&#xff0c;减小或限制同类样本之间的距离&#xff0c;同时增大不同类别样本之间的距离。 度量学习 (Metric Learning) 距离度量学习 (Distance Metric Learning&#xff0…

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 设定…