Online Instance Matching Loss的理解

来自港中文联合检测和识别的端到端行人重识别论文,使用OIM损失训练网络,下面是我对OIM损失的个人理解,记录以备查阅。

检测结果有3种proposals:有标记的身份,无标记的身份和背景。

假设训练集有L个目标人物,D是提取的特征维度。

使用两个辅助结构,LUT(Lookup Table)和CQ(Circular Queue)。

1、LUT用来储存所有的有标记身份的特征向量


用V来表示LUT,


用X表示mini-batch sample提取的特征,

,M是mini-batch的size,

那么mini-batch sample与所有有标记身份之间的相似度(cosine similarity)可以用下式来表示,

扫描二维码关注公众号,回复: 12442946 查看本文章


(我要提一下,图上V的转置是L×D的,但是代码里却是D×L的,所以X也是M×D的,然后d是X与V的转置的积。)

接下来,如果sample的目标身份是t,就把LUT的第t列更新为

然后将vt归一化到单位L2范数。

2、Circular Queue用来储存在最近mini-batch种检测到的无标记身份。


队列大小设置为Q=5000,用U表示,


同样可以计算sample与无标记身份的距离,


3、目标函数和求导

网络用concat层把两个距离合并成一个通道数5000+5532(分别是Q和L)的概率,这样可以得到两个softmax概率分布,

x∈id_i的概率:

x∈ith无标记身份的概率:

τ在代码中设为0.1,所以网络结构中在labeled matching和Unlabeled matching层后面分别用Power层乘以10(/0.1=*10)。

OIM的目标是最大化期望的对数似然,求导如下图(不想打公式了,字迹潦草凑合看吧)。



4、代码中的细节

怎样划分有标记和无标记,其实很简单,一开始看不懂源码中反向传播函数什么意思,后来知道了,关键是了解数据流怎么获取到传递的。首先从train_net.py开始生成imdb和roidb,跟踪函数到factory.py,imdb调用一个构造函数构造对象psdb,然后跟踪到psdb.py是psdb类的实现,其中一个函数生成roidb。首先读取Images.mat,得到所有图片对应的bbox,同时pid_label数组都初始为-1,然后读取Train.mat,Train.mat的结构是pid,img_name,bbox,如果一个pid出现在的img_name中的对应的bbox和之前读的对应的img_name的所有bbox中有一个匹配上,就把pid_label的对应值更新为Train.mat中的pid(这里用了enumerate方法使Train.mat的pid字符串映射为序号,所以最后这个pid_label成为roidb的一部分,用于和LabeledMatching以及UnlabeledMatching层计算相似度,在这两个层的Forward和backward函数中都用到了判断是否为-1的条件,具体再看代码吧,我这就是记录下想法,有时间再好好完善吧。


参考:Joint Detection and Identification Feature Learning for Person Search CVPR2017

猜你喜欢

转载自blog.csdn.net/neu_yj/article/details/79822591