0%

One_Example_reID

0. 前言

这篇文章主要的任务也是为了解决re-ID中需要全部标签的问题,核心思想只对一个摄像头下的全部行人各取一张图片(对于没有出现的行人,从其他摄像头下取一张),然后通过训练模型,聚类给假标签,逐步识别出所有图片。

关于这篇文章的作者也多提几句。

关于行人重识别(person re-ID),我看到的多是悉尼科技大学的郑良团队,所以简单介绍一下郑良团队的成员。

  • 郑良:主页github,2015年清华博士毕业,有学生郑哲东,钟准,孙奕帆。
  • 郑哲东:主页, github,悉尼科技大学博三。
  • 钟准:主页, github(鸣人),厦门大学交换生博四。
  • 孙奕帆:主页github,清华博二。
  • 林雨恬:主页github,很漂亮也很厉害的一个小姐姐.
  • Wu Yu:主页github知乎,悉尼科技大学博一。

人家牛逼,虚心学习。

[-] 2019-03-29

看到一个大神廖星宇的github,中国科学技术大学,应用数学研究生,旷世科技工程师,他对re-id的研究的浓缩,我觉得就已经可以秒杀90%的论文了.

1. Introduction

person re-ID 有监督模型,半监督模型。作者采用的是 one-shot image-based setting,也就是每个行人只有一个样例。

具体来说,作者将数据集分为三部分:labeled data, selected pseudo-labeled data and index-labeled data,其中 labeled data 和 selected pseudo-labeled data 用分类损失,index-labeled data 用 exclusive loss。exclusive loss 的目标是尽可能地使图片之间都离得比较远。

作者主要的改进点在于提出了 exclusive loss 和 label estimation

作者的另一篇相关文章是在视频上做的

2. The progressive model

2.1 Framework overview

训练模型分为两步:在三个数据集上训练CNN模型—>在 unlabeled data 上选择一些数据放到 pseudo-labeled data 上。

2.2 Preliminaries

  • labeled data set $\mathcal{L}$
  • unlabeled data set $\mathcal{U}$
    • pseudo-labeled data set $\mathcal{S}^t$
    • index-labeled data set $\mathcal{M}^t$

2.3 The joint learning method

The Exclusive Loss: index-labeled data set $\mathcal{M}^t$,

令$||v_i||=\tilde{\phi}(\theta;x_i)$是$x_i$的归一化后的特征,因此可以将最大化欧氏距离近似为最小化cos距离。

其中,V是所有数据的归一化特征,更高的$\tau$导致softer probability distribution.在更新时,先计算当前数据与所有数据的cos距离,在反向传播时,$v_i=1\2*(v_i+\tilde{\phi}(x_i)$并且归一化。

The cross-entropy loss:labeled data set $\mathcal{L}$ and pseudo-labeled data set $\mathcal{S}^t$

不再陈述

The total loss:

2.4 The effective sampling criterion

没有采用分类损失,而是利用最近邻赋予假标签并且假标签的真实性为与最近邻真值的距离,每次取$mt = m{t-1}+p\cdot n_u$

验证集是另外一个re-ID的训练集。

整体算法如下:

2.5 补充公式

Joint Detection and Identification Feature Learning for Person Search

定义:n个数据,每个数据表示成向量,即L-2归一化向量$V=\{vi\}{i=1}^{n}$,则新向量$x$属于$v_i$类的概率定义为:

其中,$\tau$更高,概率分布更平缓,设为0.1.

这里有两种含义。

第一种,$v_i$有标签,但$V$的类别多,属于同一类的数据较少,$x$不属于$V$,$x$有标签t,那么n个数据的概率最大值为x的标签,目标应该是最大化x属于t类的概率,其目的是为了分类更加准确。

第二种,$v_i$没有标签,$x=v_k$属于$V$,目标是最大化x属于第k个元素的概率,最大也就是1,此时$x=v_k$与其他向量$v_j$都正交,其目的是为了令各个向量都离得比较远,也就是作者的目的。作者这里没有用正交来做损失函数,而是用了softmax,很厉害。

3. code

3.1 数据集加载

两个文件 ./reid/datasets/duke.py ./reid/utils/data/dataset.py

./reid/datasets/duke.py

1
2
3
class Duke(Dataset):
def download(self):
# 预处理数据集,使其变成统一形式,从而使用load进行加载

./reid/utils/data/dataset.py

1
2
3
4
5
6
class Dataset(object):
def load(self, verbose=True):

def _check_integrity(self):
# 检查文件的完整性 images meta.json splits.json