论文:https://github.com/layumi/AICIty-reID-2020/blob/master/paper.pdf
代码:https://github.com/layumi/AICIty-reID-2020
该文章是CVPR 2020 Vehicle ReID赛道的第一名方案。
1. 简介
本文作者旨在解决三个问题。
1) 如何设计一个有效的车辆 reid 网络;
2) 如何结合特定任务进一步提升网络性能;
3) 当有多个reid网络,如何进一步提升整体性能
2. 相关工作
车辆reid领域从人的reid领域和人脸识别领域汲取了很多经验,比如center loss,空间变换等;但是真实世界的车辆reid依然是个有难度的问题,因为有不同摄像头,车辆角度,光照条件等问题;
为了减少视角都reid识别的影响,有人提出了加入合成数据训练reid网络是有效的,zhou提出了合成多视角特征,Yao提出了图engine来获取不同视角和属性的增强数据。此外,GAN也常用于数据增强,不仅可以迁移不同域的数据样本,还可以生成特定属性条件的样本,因此,为了得到车辆的鲁棒特征本文尝试了不同的数据增强方法。
3. 本文方法
后续分别探索数据生成方法,表征学习,前向预测时:对训练好的模型提取特征和后处理方法
3.1 合成数据
风格变换:
不同于典型的车辆reid任务,比赛数据由真实数据和合成数据组成,观察发现尽管合成数据来源于真实世界,但是相比真实数据有明显的风格特征,一般称为domain gap。为了解决这个问题,使用了图像变换技术,本文使用的是CycleGAN-like framework[15],训练集使用真实数据和合成数据,目的是搭建真实数据和合成数据源之间的桥梁。训练后就可以将所有的合成数据沿着"合成——>真实"方向变换,从而得到更加真实的样本。减少真实数据和合成数据之间的gap
内容操作:
前面的风格变换网络依然没有改变图片的内容,比如车辆背景、车体颜色等。因此变换后的图片依然和原始合成图片很相似,这就限制了从合成数据中学习知识。所以这里尝试对图片内容操作生成新的数据。DG-net[39]是个新的框架,可以从不同视角生成样本,对于re-id任务有效。它利用了两个编码器分别得到appearance(外表)和structure(结构)信息,同时解码器基于appearance(外表)和structure(结构)信息负责生成图像。本文使用本次比赛提供的数据集训练DG-net, 然后使用训练好的DG-net生成新的图片,比如下图1右边,给定两张不同图片和目标图片特征,网络可以生成目标图片特征的新图。由于低分辨率图像特征较为模糊因此这里只使用训练集中高分辨率图。此外,为了保证输出的图像特征一致(比如相同的颜色等),针对所有的源图每次只选择一张target image。生成的图像只在fine-tuning步骤使用
复制&黏贴:
除了上述的数据增强方法,还探索了更直接的方法比如复制和黏贴来增强训练集,这样可以让模型“看”更多的背景信息,通过提取真实图像的前景车辆和合成图像的背景信息,对于前景的提取使用实例分割方法maskrcnn[8], 对于背景,使用deepfill v2[36]来对实例分割后的背景进行inpaiting,过程如下。
3.2 表征学习
网络结构:
借鉴现在流行的reid网络,包括ResNeXt101[32],ResNeXt10132x8lwsl[19]和ResNet50IBNa[33]. 利用了开源网络结构的变体如下:
-
通常re-id baseline用一个新的分类器模块替换ImageNet的原始分类层。新的分类器模块包含一个全连接层fc1,一个bn层和一个全连接层fc2。fc1将学习到的特征压缩到512维, fc2作为线性分类器输出分类预测。在推理时,提取fc2层之前的512维特征作为视觉表示(visual representation).。
-
本文探索了另一个复杂的网络结构,融合多尺度信息来增强图像的表征能力,网络结构如图3。网络结构参考resnet的backbone,block3和block4是resnet的最后两个block,x3是block3输出,x4是block4输出,GAP(global average pooling) GMP(global max poolng ) 这俩池化为了得到全局表征,AAP(adaptive average pooling) AMP(adaptive max poolng) 这俩池化都是输出2x2,X3经过GMP结果,X4经过GAP,X4经过GMP和X4经过AAP的结果使用ranking loss来训练, 目的是将同类样本拉近,异类样本推远。head block模块由BN层、leakly-relu层、卷积层、bn层和fc层组成,使用交叉熵损失来训练。
优化函数:
本文的损失函数使用交叉熵损失和ranking loss,ranking loss和triplet loss类似
负样本挖掘:
为了提升模型的表征能力,使用线下的负样本挖掘来微调模型。包含两步:负样本挖掘和训练。在负样本挖掘阶段,每个minibatch随机采样50%,最相似的负样本组成困难负样本训练triplet。该结果可以获取更有难度且十分接近决策边界的训练样本,从而有效的帮助模型学习。第二步是使用ranking loss来训练
辅助信息学习:
发现reid模型很容易混淆相同方向的不同id样本。为了解决这个问题,提出了一个方向分类模型用来预测每辆车的方向,同时在后处理阶段抑制方向近似的车辆对。方向分类模型简单有效,使用
3.3 后处理
图像alignment:
模型融合:使用[38]方法进行模型融合,
query expansion和reranking: