行人再识别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. petite-vue源码剖析-逐行解读@vue-reactivity之effect

    当我们通过effect将副函数向响应上下文注册后,副作用函数内访问响应式对象时即会自动收集依赖,并在相应的响应式属性发生变化后,自动触发副作用函数的执行. // ./effect.ts export ...

  2. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  3. 技术分享 | WEB 端常见 Bug 解析

    对于 WEB 产品来说,有一些常见的 Bug,本章节挑选一些比较典型的 Bug 进行举例介绍. UI Bug 页面展示的时候,需要根据长度的边界值去设计用例进行验证.   一般来说都会有超长内容的验证 ...

  4. python基础-基本数据类型(三)

    一.散列类型 散列类型用来表示无序的集合类型 1.集合(set) Python中的集合与数学符号中的集合类似,都是用来表示无序不重复元素的集合. 1.1 集合的定义 集合使用一对{}来进行定义,集合中 ...

  5. 利用QEMU+GDB搭建Linux内核调试环境

    前言 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试. 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qe ...

  6. mysql中的date、datetime、timestamp你还不知道怎么使用吗

    在后端开发中经常会碰到涉及数据库的场景,不知道屏幕前的你有这样的疑惑没有,每每在遇到时间.日期字段总是让人头疼,分不清到底是选date还是datetime,亦或是timestamp,真是抓耳挠腮啊,怎 ...

  7. Node.js躬行记(20)——KOA源码分析(下)

    在上一篇中,主要分析了package.json和application.js文件,本文会分析剩下的几个文件. 一.context.js 在context.js中,会处理错误,cookie,JSON格式 ...

  8. sa-token 配置 CORS

    return new SaServletFilter() ... .setBeforeAuth(r -> { // 前置函数,在认证函数每次执行前执行 // 设置一些安全响应头之类的玩意 SaH ...

  9. [codeforces] 暑期训练之打卡题(三)

    每个标题都做了题目原网址的超链接 Day21<Alphabetic Removals> 题意: 给定一个字符串,要求按照字典序按照出现的前后顺序删除 k 个字母 题解: 记录字符串中各个字 ...

  10. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...