一篇讲Person Re-ID的论文,与人脸识别(认证)有非常多相通的地方。

文章链接: 《In Defense of the Triplet Loss for Person Re-Identification》

Github链接:https://github.com/VisualComputingInstitute/triplet-reid 眼下还没有放出代码,作者说等论文录用了就放出来。

Introduction

Re-ID和图像检索有点类似。

这样来看,Google的FaceNet利用Triplet Loss训练的高度嵌入的特征,似乎非常适合做这样大范围的高速比对。 可是,非常多的研究文献表明常见的classification或者结合verification Loss比Triplet Loss似乎更适合这个任务。

他们通常将CNN作为特征提取器,后面再接专门的測度模型。

可是这两种Loss有着明显的缺点:

Classification Loss: 当目标非常大时,会严重添加网络參数,而训练结束后非常多參数都会被摒弃。

Verification Loss: 仅仅能成对的推断两张图片的类似度,因此非常难应用到目标聚类和检索上去。由于一对一对照太慢。

可是 Triplet Loss还是非常吸引人啊: 端到端。简单直接。 自带聚类属性; 特征高度嵌入。

为什么Triplet训不好呢或者说不好训呢?

首先须要了解,hard mining在Triplet训练中是一个非常重要的步骤。 没有hard mining会导致训练堵塞收敛结果不佳,选择过难的hard又会导致训练不稳定收敛变难。此外,hard mining也比較耗时并且也没有清楚的定义什么是 “Good Hard”。

文章的贡献主要有两个方面:

(1) 设计了新的Triplet Loss,并和其他变种进行了对照。

(2) 对于是否须要 pre-trained模型,进行了实验对照分析。

Triplet Loss

这一小节主要介绍几种Triplet 变种。

Large Margin Nearest Neighbor loss

比較早的Triplet形式(參考文献[1])。 \(L_{pull}\) 表示拉近属于同一目标的样本; \(L_{push}\) 表示拉远不同目标的样本。

由于是近期邻分类。所以同一类其中可能有多个cluster,并且固定的cluster中心也比較难以确定。

FaceNet Triplet Loss

Google的人脸认证模型FaceNet(參考文献[2]), 不要求同类目标都靠近某个点,仅仅要同类距离大于不同类间距离即可。

完美的契合人脸认证的思想。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1emZhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="500" height="100" alt="float" align="center">

Batch All Triplet Loss

FaceNet Triplet Loss训练时数据是按顺序排好的3个一组3个一组。

假如batch_size=3B,那么实际上有多达 \(6B^2-4B\)种三元组组合,仅仅利用B组就非常浪费。

所以我们能够首先改变一下数据的组织方式:\(batch\ size = K\times B\),即随机地选出K个人。每一个人随机地选B张图片。

这样总共会有 \(PK(PK-K)(K-1)\)种组合,计算loss时就依照下式统计全部可能。

Batch Hard Triplet Loss

Batch All Triplet Loss看起来一次能够处理非常多的三元组。可是有一点非常尴尬:数据集非常大时训练将会非常耗时。同一时候随着训练深入非常多三元组由于非常easy被分对而变成了“没用的”三元组。

怎么办? Hard Mining. 可是。过难得三元组又会导致训练不稳定,怎么办? Mining Moderate Hard.

作者定义了以下的“较难”的Triplet Loss。之所以是“较难”,是由于仅仅是在一个小的Batch里面选的最难的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1emZhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="500" height="220" alt="float" align="center">

其中 \(x_j^i\) 表示第 \(i\) 个人的第 \(j\)张图片。

Lifted Embedding Loss

文献[3]针对3个一组3个一组排列的batch。提出了一种新的Loss:将anchor-positive pair之外的全部样本作为negative,然后优化Loss的平滑边界。

文章针对 \(batch\ size = K\times B\)的形式对上式稍作改进:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1emZhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="500" height="230" alt="float" align="center">

Distance Measure

非常多相关工作中,都使用平方欧式距离 \(D(a,b) = |a-b|_2^2\) 作为度量函数。 作者尽管没有系统对照过其他度量函数。可是在实验中发现非平方欧氏距离 \(D(a,b) = |a-b|_2\) 表现的更为稳定。 同一时候。使用非平方欧氏距离使得margin 这个參数更具有可读性。

Soft-margin

之前的非常多Triplet Loss都採用了截断处理,即假设Triplet三元组关系正确则Loss直接为0。 作者发现,对于Re-ID来说,有必要不断地拉近同类目标的距离。

因此,作者设计了以下的soft-margin函数:

\(s(x) = ln(1+e^x)\)

Experiments

多种Triplet Loss性能对照

(1) 没有Hard Mining的 \(L_{tri}\)往往模型效果不好,假设加上简单的offline hard-mining(OHM)。则效果非常不稳定,有时候非常好有时候全然崩掉。

(2) Batch Hard形式的 \(L_{BH}\)总体表现好于 Batch All形式的 \(L_{BA}\)。

作者推測,训练后期非常多三元组loss都是0,然后平均处理时会把仅剩的实用的信息给稀释掉。为了证明该猜想,作者计算平均loss时仅仅考虑那些不为0的,用 \(L_{BA\neq 0}\)表示。发现效果确实会变好。

(3) 在作者的Re-ID实验中。Batch Hard + soft-margin的效果最好。可是不能保证在其他任务中这样的组合依旧是最好的,这须要很多其他的实验验证。

To Pretrain or not to Pretrain?

TriNet表示来自pre-trained model,LuNet是作者自己设计的一个普通网络。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1emZhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="700" height="100" alt="float" align="center">

从上面的表格来看,利用pre-trained model确实能够获得更好一点的效果,可是从头開始训练的网络也不会太差。

特别的,pre-trained model往往体积较大模式固定,不如自己设计网络来的灵活。同一时候。pre-trained model往往有其自己的固定输入。我们假设改动其输入非常可能会得到相反的效果。例如以下表:

Trick

(1) 没有必要对输出特征进行归一化。

(2) 假设使用了hard mining, 单纯的看loss变化往往不能正确把握训练的进程。作者推荐观察一个batch中的有效三元组个数,或者全部pair间的距离。

(3) 初始margin不宜过大;

參考文献

[1] K. Q. Weinberger and L. K. Saul. Distance Metric Learning for Large Margin Nearest Neighbor Classification. JMLR,10:207–244, 2009

[2] F. Schroff, D. Kalenichenko, and J. Philbin. FaceNet: A Unified Embedding for Face Recognition and Clustering. In CVPR, 2015

[3] H. O. Song, Y. Xiang, S. Jegelka, and S. Savarese. Deep Metric Learning via Lifted Structured Feature Embedding. In CVPR, 2016

Re-ID with Triplet Loss的更多相关文章

  1. triplet loss 在深度学习中主要应用在什么地方?有什么明显的优势?

    作者:罗浩.ZJU链接:https://www.zhihu.com/question/62486208/answer/199117070来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  2. Tutorial: Triplet Loss Layer Design for CNN

    Tutorial:  Triplet Loss Layer Design for CNN Xiao Wang  2016.05.02 Triplet Loss Layer could be a tri ...

  3. 怎样在caffe中添加layer以及caffe中triplet loss layer的实现

    关于triplet loss的原理.目标函数和梯度推导在上一篇博客中已经讲过了.详细见:triplet loss原理以及梯度推导.这篇博文主要是讲caffe下实现triplet loss.编程菜鸟.假 ...

  4. 论文笔记之: Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function

    Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function CVPR 2 ...

  5. Paper Reading: In Defense of the Triplet Loss for Person Re-Identification

    In Defense of the Triplet Loss for Person Re-Identification  2017-07-02  14:04:20   This blog comes ...

  6. Facenet Triplet Loss

    Triplet Loss 在人脸识别中,Triplet loss被用来进行人脸嵌入的训练.如果你对triplet loss很陌生,可以看一下吴恩达关于这一块的课程.Triplet loss实现起来并不 ...

  7. triplet loss

    因为待遇低,因为工作不开心,已经严重影响了自己的工作积极性和工作效率,这几天发觉这样对自己实在是一种损失,决定提高工作效率,减少工作时间. 说说最近做的tracking, multi-object t ...

  8. Triplet Loss(转)

    参考:https://blog.csdn.net/u013082989/article/details/83537370 作用:用于对差异较小的类别进行区分

  9. face recognition[Euclidean-distance-based loss][FaceNet]

    本文来自<FaceNet: A Unified Embedding for Face Recognition and Clustering>.时间线为2015年6月.是谷歌的作品. 0 引 ...

随机推荐

  1. Objective-C中NSString与int和float的相互转换

    NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString ...

  2. 微信小程序 - switchTab传值

    “众所周知,switchTab是不能携带参数的” 我们有几种方式解决呢?(最好的解决方法是利用全局变量,这样可以避免因缓存造成的数据错误) 1. 通过全局变量(需要用到的页面都要引用它) 点击下载示例 ...

  3. 谈谈node(1)

        node的出现,给了全栈工程师,一个绝佳的机会.   node给我们带来的是更低的硬件成本来完成更高需求以及用户体验感,一台8G内存服务器如果用传统架构,那么最多可驱使4000台同时访问,如果 ...

  4. kinect v1+ ubuntu 配置问题

    从github上下载openni 以及 SensorKinect. install 之后 启动openni下的例子 NiViewer发生错误. Open failed: Failed to set U ...

  5. java8 map flatmap

    map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素.这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和ma ...

  6. 1、配置JAVA的环境变量

    想要成功配置Java的环境变量,那肯定就要安装JDK,才能开始配置的. 想要成功配置Java的环境变量,那肯定就要安装JDK,才能开始配置的. 安装JDK 向导进行相关参数设置.如图:   正在安装程 ...

  7. LoadRunner脚本关联动态数据的最简单方法

    为什么要关联动态数据呢?举个例子,在对我们平台的工作流性能测试时, 在待办任务里面选择一条记录执行发送操作,LoadRunner VuGen会详细记录下来流程发送操作的细节,但在回放脚本的时候会有问题 ...

  8. Linux磁盘分区及链接文件的特点

    系统分区 传统的分区fdisk 最大支持2T的硬盘分区 对存储,多分区使用的parted 主分区:最多只能有4个 扩展分区 最多只能有1个 主分区加扩展分区最多有4个 不能写入数据,只能包含逻辑分区 ...

  9. 【微信小程序】 引用公共js里的方法

    一个小程序页面由四个文件组成,一个小程序页面的四个文件具有相同路径与文件名,由此我们可知一个小程序页面对应着一个跟页面同名的js文件.可是当有些公共方法,我们想抽离出来成为一个独立公共的js文件.我们 ...

  10. .net完整的图文验证

    摘自:http://blog.csdn.net/durongjian/article/details/4336380 一.创建ValidaeCode类库工程: 1.创建ValidaeCode类库工程, ...