当前位置: 首页 > news >正文

ReID网络:MGN网络(4) - Loss计算

1. MGN Loss

MGN采用三元损失(Triplet Loss)。

三元损失主要用于ReID算法,目的是帮助网络学习到一个好的Embedding信息。之所以称之为三元损失,主要原因在于在训练中,参与计算Loss的分别有Anchor、Positive和Negative三方。

2. Triplet Loss原理

Triplet Loss的任务是帮助网络训练出来一个能够准确区分不同类Embedding信息的网络。如图所示,Anchor与Positive属于同一类,与Negatine属于不同类。我们的目的就是学习一个网络,该网络能够将Anchor与Positive的距离拉近,同时将与Negative的距离推远

记Anchor与Positive的距离为d(a, p),Anchor与Negative的距离为d(a, n)。我们尽可能地希望L = d(a, p) - d(a, n)尽可能小。

更具体的,我们希望L=max(d(a, p) - d(a, n)+margin, 0)尽可能小,但是取非0损失。margin为一个大于0的常数。

计算Loss的时候,通常会遇到3种情况。

eazy triplet: d(a, p) +margin< d(a, n),这种情况属于理想状态,不需要计算损失并优化。很好理解,A与P的距离加上Margin还要小于A与N的距离,这样自然是不需要进一步优化的。

hard triplet: d(a, n) < d(a, p),即有没有margin作为隔离缓冲区,A与N的距离都小于A与P的距离,此时产生损失,用于反向优化网络。

semi-hard triplet: d(a, p) < d(a, n)<d(a, p) +margin,这种情况下,我们也认为需要进行优化处理。

3. Triplet公式推导

三元损失主要是用于帮助学习更好的Embedding信息,至于Embedding,大家可以认为是对应于某一个感兴趣内容的特征序列信息。

前面讲到,我们计算Triplet Loss时,会用到Anchor、Positive和Negative,此处Anchor和Positives属于同一类,Anchor和Negatives不属于同一类。对于特征损失,直观的,我们需要计算特征距离D(Anchor, Positives)和D(Anchor, Negatives)。三元损失使得Anchor和同类样本间(Positives)的距离最小化,同时使得Anchor和不同类样本(Negatives)的距离最大化。

三元损失是以一个Anchor为参照,的与其同类(相同ID,称为Positive)的样本之间距离最小化,同时与其不同类(不同ID,称为Negative)样本之间的距离最大化。因此,Triplet-Loss的数学表达式如下。

进一步,损失函数描述如下。

对margin的理解

Margin本身并不神秘,只是添加了作为一个缓冲地带。保证A与P的距离更小,A与N的距离更大。同时,Margin的引入还解决了D(A, P)与D(A, N)相同的问题。如前面所述,损失可以表示为

如果不添加Margin,就转换成了L = max(d(a, p) - d(a, n), 0)。

搜索positive和negative样本

那么,我们如何搜索那些事positive,哪些是negative样本呢?

首先我们需要确认的是,我们对于训练数据的读入,以遵循一定的规则的。比如我们需要导入4个不同ID的Person, 同时每一个ID都取4张图像。也就是说,我们一共取16幅图像用于训练,包含4个ID,及四个不同的Person,每个ID(Person)包含4幅不同时空的图像。如此一来,我们在一个训练iteration中,用于训练的既有Positive,又有Negative。

4. WGN中的Triplet Loss

计算Triplet Loss时,首先需要计算出每一个特征与其他特征之间的欧氏距离。如图所示,为WGN提供的Triplet Loss计算代码。

输入inputs的shape为shape(batch_size, feat_dim),其中feat_dim为特征维数。第10行是先给batch中的各图片执行平方计算,并将平方和扩充为shape(batch_size, batch_size)。

计算距离

第11行是计算一个batch中不同图片的特征求和。即实现如下操作。

第13行和14行执行计算平方差,开方操作和阶段操作,名副其实的欧式距离了。

搜索Positive和Negative

从第16行开始,我们就需要搜索Positive和Negative样本了。

第16行明显是在针对计算每一张训练的image找与其属于同一类(同一个ID)的目标。

第18、19、20行就是遍历每一张训练图片,将自身作为Anchor,找到与其同类(Positive)的最远距离,找到与其不同类(Negative)的最近距离。

最后式计算一个MarginRankingLoss。至于MarginRankingLoss,大家可以取搜一下,讲解随处可见,此处不做赘述了。其Loss计算表达式如下。

其中,y取值为1或-1。

http://www.lryc.cn/news/147574.html

相关文章:

  • CountDownLatch、Semaphore详解——深入探究CountDownLatch、Semaphore源码
  • windows生成ios证书的方法
  • 【小沐学Unity3d】3ds Max 骨骼动画制作(Physique 修改器)
  • 生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能
  • IOS打包上架AppStore被驳回信息记录
  • 【Python自学笔记】Python好用的模块收集(持续更新...)
  • 在springboot中配置mybatis(mybatis-plus)mapper.xml扫描路径的问题
  • c++搜索剪枝常见方法与技巧
  • YOLO V5 和 YOLO V8 对比学习
  • 【Git】(六)子模块跟随主仓库切换分支
  • 开源的经济影响:商业与社区的平衡
  • 数据库复习整理
  • 开始MySQL之路——MySQL安装和卸载
  • pxe网络装机
  • 【数据库事务】
  • Apache Tomcat
  • python类
  • SpringBoot + layui 框架实现一周免登陆功能
  • 如何使用Unity制作一个国际象棋
  • 下岗吧,Excel
  • 黑马点评环境搭建导入
  • 交换机端口安全
  • 【力扣】63. 不同路径 II <动态规划>
  • 【Linux】JumpServer 堡垒机远程访问
  • WebGPT VS WebGPU
  • 【Flutter】Flutter 使用 collection 优化集合操作
  • 【核心复现】基于合作博弈的综合能源系统电-热-气协同优化运行策略(Matlab代码实现)
  • 【设计模式】Head First 设计模式——抽象工厂模式 C++实现
  • pdf怎么转换成jpg图片?
  • 远程访问Linux的DataEase数据可视化分析,有哪些推荐的工具?