行人再识别Re-ID面临两个特殊的问题:

1)源数据集和目标数据集类别完全不同

2)相机造成的图片差异

因为一般来说传统的域适应问题源域和目标域的类别是相同的,相机之间的不匹配也是造成行人再识别数据集数据分布不同的主要原因之一,如何在域适应中有效利用相机信息还没有一个很好的解决方案。

在这篇论文中,作者主要就是想解决这两个问题。提出了Hetero-Homogeneous Learning (HHL)算法。具体的解决方法如下:

相机差异: 通过目标域中未标注的图片和对应的风格转换图片学习(Homogeneous Learning)

域连通性:将源域/目标域图片视为目标域/源域的负匹配(Hetero Learning)

简要概括:算法先从挑选一张图片,为了实现相机不变性,利用StarGAN生成一系列不同相机风格的图片,与原始图片一起组成正样本,因为训练图片来自于同一个域,这称为Homogeneous Learning。为了实现域连通性则通过采样自源域和目标域的图片进行训练,因为源域和目标域的ID不重叠,很自然地形成了一个负样本对,因其来自不同域被称为Hetero Learning,网络输入是一个triplet。

网络结构如下:

网络包含两个支路,一个是从源样本学习计算的分类交叉熵损失,另一个是相似度学习的triplet损失,是来学习前面介绍的相机不变性和域连通性,通过有标注的源样本,无标注的目标样本和相机风格转换的样本来学习。

Baseline:

作者使用在ImageNet上进行预训练的ResNet50作为骨干网络,去除了最后的1000维的全连接层,增加了两个新的全连接,第一个叫做“FC-1024”,后面接着batchnorm,ReLU和Dropout。第二个叫做“FC-#ID”,输出维度等于类别数。使用了交叉熵损失作为网络监督:

以上就是上图的第一条支路,它的目标是对于给定类别的图片训练出对ID敏感的嵌入(IDE),就是把行人再识别当作分类任务来做。

其实对于同源数据,IDE就能表现得挺不错了,但是IDE的泛化性很差,换到不同的目标数据集上效果将大打折扣。因此作者就引入了上面提到了HHL,也就是第二条支路。

在第二条支路中,“FC-#ID”被替换成了128维的全连接,并且交叉熵损失改成了triplet损失。交叉熵损失用于分类学习。triplet损失用于相似度学习。

相机不变性:

对于相机不变性有一个很直观的理解,就是同一个人不管用哪个相机拍摄的图片,网络都应该识别得出来。本着这一思想,可以想到使用GAN把一张图片转换成多个相机的风格。

如果了解Re-ID肯定知道2018 CVPR就有很多用CycleGAN做了这一研究的,作者这里使用的是StarGAN。CycleGAN只能实现两两之间的转换而StarGAN则可以实现一到多个域之间的转换,关于StarGAN的解读可以移步。StarGAN的生成效果如下:

作者选择的是目标域的图片,目标域存在了C个相机,作者对于每个图片学习生成了C种转换(其中有对应自己相机风格的一张)。目标域的原始图片表示为xit,生成图片表示为xit*,后者的数量是前者的C倍。相机不变性的三元损失公式如下:

其中triplet样本的形成规则如下:
1.先从目标域挑选一张原始图片作为anchor
2.随机挑选anchor的StarGAN合成图片作为正例

3.随机再从目标域挑选一张原始图片作为负例(这一假设严格来说是不合理的,因为每个人都有多张图片,可能就会采样到与anchor中人物相同的,但是因为数据集中负样本对数目远远大于正样本,作者用实验证明了这一假设影响不大)。

域连通性:

在行人再识别中不同域有着不同的个体,于是源域与目标域很自然地就形成了负样本对。作者使用这个特性进行域连通性学习,这样一来网络可以把原始域图片和目标域图片投影到一个共同空间,综合考虑两者之间的关系。

这里的triplet样本组织规则为:

1.首先从源域挑选一张图片作为anchor

2.再利用源域标签,再挑选一张与anchor人物相同的作为正例

3.最后从目标域随机采样一张作为负例

损失函数公式为:

 HHL:

在这篇论文中作者认为对于一个有效的行人无监督域适应系统(UDA)来说,相机不变性与域连通性是互补的。因此作者提出来在训练批中使用单个的loss来联合学习这两个方面。公式化如下:

最后与交叉熵损失结合形成总体损失,交叉熵损失提供了仅在源域上学习到的一个基础的区分能力,实验证明了它不可或缺。

HHL论文及代码理解(Generalizing A Person Retrieval Model Hetero- and Homogeneously ECCV 2018)的更多相关文章

  1. StarGAN论文及代码理解

    StarGAN的引入是为了解决多领域间的转换问题的,之前的CycleGAN等只能解决两个领域之间的转换,那么对于含有C个领域转换而言,需要学习C*(C-1)个模型,但StarGAN仅需要学习一个,而且 ...

  2. Context Encoder论文及代码解读

    经过秋招和毕业论文的折磨,提交完论文終稿的那一刻总算觉得有多余的时间来搞自己的事情. 研究论文做的是图像修复相关,这里对基于深度学习的图像修复方面的论文和代码进行整理,也算是研究生方向有一个比较好的结 ...

  3. [ZZ]计算机视觉、机器学习相关领域论文和源代码大集合

    原文地址:[ZZ]计算机视觉.机器学习相关领域论文和源代码大集合作者:计算机视觉与模式 注:下面有project网站的大部分都有paper和相应的code.Code一般是C/C++或者Matlab代码 ...

  4. linux io的cfq代码理解

    内核版本: 3.10内核. CFQ,即Completely Fair Queueing绝对公平调度器,原理是基于时间片的角度去保证公平,其实如果一台设备既有单队列,又有多队列,既有快速的NVME,又有 ...

  5. 10K+,深度学习论文、代码最全汇总!

    我们大部分人是如何查询和搜集深度学习相关论文的?绝大多数情况是根据关键字在谷歌.百度搜索.想寻找相关论文的复现代码又会去 GitHub 上搜索关键词.浪费了很多时间不说,论文.代码通常也不够完整.怎么 ...

  6. (转) AI突破性论文及代码实现汇总

    本文转自:https://zhuanlan.zhihu.com/p/25191377 AI突破性论文及代码实现汇总 极视角 · 2 天前 What Can AI Do For You? “The bu ...

  7. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    秦鼎涛  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...

  8. 『TensorFlow』通过代码理解gan网络_中

    『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 上篇是一个尝试生成minist手写体数据的简单GAN网络,之前有介绍过,图片维度是28*28*1,生成器的上采样使 ...

  9. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

随机推荐

  1. 新华三Gen10服务器进SSA查看、配置阵列

    1.开机自检进F10 2.F10后选择[smart storage administrator](跳到第5步)或选择第一项IP[intelligent provisioning] 3.选择执行维护 4 ...

  2. 解决PLSQL developer 乱码问题

    今天打开 PLSQL developer 登录数据库后,查看数据的时候,发现表里面的中文数据全部变成了 ???  这样的东西,  打开表看表的 中文描述信息 , 一样 显示问号. 什么鬼啊?  第一次 ...

  3. Nacos在企业生产中如何使用集群环境?

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 由于在公司,注册中心和配置中心都是 ...

  4. plicp 点云迭代最近邻点配准法

    输入参数 点云A的极坐标集合 点云A对应Lidar所在pose 点云B的极坐标集合 点云B对应Lidar所在pose Features 根据两个点云的弧度关系确定找点的起始位置 根据两个点云的弧度关系 ...

  5. 常用的Linux 系统备份、恢复命令

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 删库跑路的事常常听说,不过,这只能是个调侃的话题,真正的工作中可不能这么干,否则,库是删了,路怕是跑不了了. 所以,备份很重 ...

  6. Web安全学习笔记 SQL注入上

    Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...

  7. 消息队列,IPC机制(进程间通信),生产者消费者模型,线程及相关

    消息队列 创建 ''' Queue是模块multiprocessing中的一个类我们也可以这样导入from multiprocessing import Queue,创 建时queue = Queue ...

  8. 面试突击49:说一下 JUC 中的 Exchange 交换器?

    Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法: exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程 ...

  9. 167. Two Sum II - Input array is sorted - LeetCode

    Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...

  10. js算法-计算素数暴力算法