GAN提高人体重识别准确率

论文地址https://arxiv.org/abs/1701.07717内容简介

这篇文章的主要贡献是只使用原始数据集进行半监督学习,提高行人重识别的Baseline。这里有两个挑战:

怎么从原始数据集中获得更多的训练数据

怎么使用生成的没有标签的新数据

本文提出的解决方法是:使用GAN进行新数据的生成,使用LSRO(label smoothing regularization for outliers) 方法利用没标签的新数据。

具体实现

作者使用真实数据集训练一个DCGAN模型,然后用DCGAN作为数据生成工具,生成没有标签的数据。然后用真实数据和生成的没有标签的数据进行分类训练。这里作者的分类模型是resnet50。求损失函数采用作者提出的LSRO方式,如上面公式,如果当前数据是生成的数据,即 那么损失函数采用 这种形式,即认为生成的数据属于每一个类的概率是相同的 ,(K是总类别数量)。如果当前的数据是真实数据,即 那么采用 损失函数。

说明一下公式是如何推导出来的:

如上图,公式(1)(3)(3)是交叉熵损失函数,LSR为了使标签更平滑,修改了q(k)函数,使得那些非ground truth类别也会分配到一个较低的分值.如公式(4),这里 取值一般是0.1

公式(5)是(1)和(4)整合得到.

以上是作者提到的LSR方法.后来作者以此为灵感提出了LSRO方法:如果训练数据一共有K类,那么生成的图片属于每个类的概率是 .可以写成下图中(6)式

结合(1)(2)(6)可以写出(7)式.

实验 & 结果

1)作者将LSRO和两个已有的方法(All in one 和 Pseudo label)进行比较。 All in one方法不同于LSRO方法,他将生成模型产生的图片当做一个新的类别

Pseudo方法不同于LSRO方法,他将网络的softmax输出的最大概率值所对应的分类当做是生成图片的标签。

作者主要使用Market-150这个数据库进行实验,只使用了在Market-150数据库上由dcgan生成的图片.

除此之外,作者还用到了DukeMTMC-reID和CUB-200-2011对他们的方法进行了评估。

实现细节:

1)使用Tensorflow和DCGAN包训练GAN模型,训练数据被resize到128X128大小,并随机翻转。训练30个epochs。生成数据时随机输入100维的向量,将大小resize到256X256并且用CNN训练(使用LSRO方法)

2)CNN re-ID baseline采用ResNet50。

修改ResNet50的全连接层,使得输出类别为751,702,1367.分别对应Market-1501,DukeTMC-reID和CUHK03的类别数。所有训练图片被resize到256x256然后随机裁剪到224x224并随机翻转。同时在全连接层之前加入dropout层,dropout rate在CUHK03数据集上设置为0.5,在Market-1501和DukeMTMC-reID数据集上设置为0.75。梯度下降的冲量(momentum)设置为0.9,初始学习率为0.002,40个epoch后到0.0002。训练到第50个epoch结束。在测试过程中,作者提取了最后一个卷积层中的2048维特征。采用余弦距离来计算两幅图像的相似度进行排名。

LSRO与All in one、Pseudo label对比

在Market-1501上rank-1:accuracy=78.06%, mAP = 56.23%

在CUHK03上rank-1:accuracy=73.1%, mAP = 77.4%

然后作者又在这篇论文的基础上加上GAN生成的图片和LSRO方法,发现也work的很好,达到了最好的效果。

在Market-1501上rank-1 accuracy=83.97%, mAP=66.07%

在在CUHK03上rank-1 accuracy = 84.6%, mAP = 87.4%

如下图:

思考:

一开始并没有弄清行人重识别的概念,一直按照分类的思想去理解,论文有很多不能理解的地方,后来查阅资料,还有数据集了解到行人重识别一般指图像检索而不是图像分类。

reID主要解决的是下图中红框所提到的内容:

欢迎关注:)

本文来自企鹅号 - 算法入门媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3907
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

3792
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

2258
来自专栏xingoo, 一个梦想做发明家的程序员

AOV网络拓扑排序

这个算法,主要是为输出一个无环图的拓扑序列 算法思想: 主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入...

2005
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

4327
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

702
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1322
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1574
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

1402
来自专栏刘君君

JDK8的HashMap源码学习笔记

3638

扫码关注云+社区