In Defense of the Triplet Loss for Person Re-Identification 

2017-07-02  14:04:20  

This blog comes from: http://blog.csdn.net/shuzfan/article/details/70069822

Paper:  https://arxiv.org/abs/1703.07737

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]), 不要求同类目标都靠近某个点,只要同类距离大于不同类间距离就行。完美的契合人脸认证的思想。

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看起来一次可以处理非常多的三元组,但是有一点很尴尬:数据集非常大时训练将会非常耗时,同时随着训练深入很多三元组因为很容易被分对而变成了“无用的”三元组。

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

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

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

Lifted Embedding Loss

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

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

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是作者自己设计的一个普通网络。

从上面的表格来看,利用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

 
 
 

Paper Reading: In Defense of the Triplet Loss for Person Re-Identification的更多相关文章

  1. Re-ID with Triplet Loss

    一篇讲Person Re-ID的论文,与人脸识别(认证)有非常多相通的地方. 文章链接: <In Defense of the Triplet Loss for Person Re-Identi ...

  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. triplet loss 在深度学习中主要应用在什么地方?有什么明显的优势?

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

  4. CVPR 2016 paper reading (2)

    1. Sketch me that shoe, Qian Yu, Feng Liu, Yi-Zhe Song, Tao Xiang, Timothy M. Hospedales, Cheng Chan ...

  5. 论文笔记之: 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 ...

  6. Paper Reading: Stereo DSO

    开篇第一篇就写一个paper reading吧,用markdown+vim写东西切换中英文挺麻烦的,有些就偷懒都用英文写了. Stereo DSO: Large-Scale Direct Sparse ...

  7. Facenet Triplet Loss

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

  8. CVPR 2016 paper reading (3)

    DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations, Ziwei Liu, Pin ...

  9. triplet loss

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

随机推荐

  1. Unicode字符需要几个字节来存储?

    0)学习笔记: 我们常说的这句话“Unicode字符是2个字节”这句话有毛病 Unicode目前规划的总空间有17个平面, 0x0000---0x10FFFF,每个平面有 65536 个码点. Uni ...

  2. 区块链公链分片技术(sharding)方案,配思维导图

    区块链公链分片技术(sharding)方案,配思维导图 分片技术(sharding)方案 以太坊分片思路 其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之 ...

  3. springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢?

    springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢? 看错误信息有提示:  Descript ...

  4. Spring SpringBoot和SpringCloud的关系

    Spring SpringBoot和SpringCloud的关系 Spring Cloud 是完全基于 Spring Boot 而开发,Spring Cloud 利用 Spring Boot 特性整合 ...

  5. linux学习笔记---grep

    先来讲讲grep(搜索过滤) 1.命令格式: grep [option] pattern file 2.命令参数: -a 不要忽略二进制的数据 -A<显示行数>          除了显示 ...

  6. Django之MVC和MTV

    一. MVC MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列表). ...

  7. Mysql初级第二天(wangyun)

    SQL 1.LIKE 操作符 SELECT 列名称 FROM 表名称 WHERE 列 LIKE 值('N%'/'%N%'/'%N','N_') SELECT 列名称 FROM 表名称 WHERE 列 ...

  8. php 接收blob数据流,base64数据流 转为 blob二进制数据流

    php正常接收参数的方式如下:$_GET$_POST$_REQUEST 但是如果跨语言接收请求参数的话,可能会出现一系列的问题,其他语言的http请求可能是基于数据流的概念来传递参数的,如果按照常规处 ...

  9. linux中权限对文件和目录的意义

    1.权限对文件的意义: 读:可查看文件的内容 写:可修改文件的内容(但不能删除文件) 执行:可执行文件 2.权限对目录的意义: 读:可以查看目录下的内容,即可以读取该目录下的结构列表 写:可修改目录下 ...

  10. request 模块详细介绍

    request 模块详细介绍 request Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装 ...