ReID?
ReID是图像检索的子任务,它主要的目的是:利用计算机视觉技术对特定行人进行跨视域匹配和检索。所谓跨视域即是图片来自于不同的摄像头,这样可以用于智能视频监控(如无人超市)、刑侦(追捕嫌疑人)、交管(追踪车辆等)等等应用场景。如上图,需要检索到同一个人(查询图像query)在各个摄像头下图片集(候选行人库gallery)的相关图片。

困难点
困难点主要在于ReID任务的跨视域特性有:

  • 摄像头分辨率不同
  • 拍摄角度不一 致
  • 光照条件不同
  • 背景变化大
  • 人体属于非刚性目标,外观会因姿态、遮挡、光照、背景、行人错位等等的干扰,如上图
  • 行人数据集采集标注困难

ReID的实现流程图
时间中需要完成包括行人检测和再识别两部分任务,即下图的person detection和后面的person reID,研究上主要侧重于识别的部分(查询图像query集和候选行人库gallery集都是经过detector裁剪好的行人框)。

识别部分分为feature extraction和similarity measurement,即特征提取和相似度度量。

  • 特征提取:学习在不同摄像头下图片中的行人特征
  • 相似度度量 :比较特征以排序检索

依据流程,数据集实际分为了训练集、验证集、Query、Gallery四个部分。即在训练集上进行模型的训练,得到模型后对Query与Gallery中的图片提取特征计算相似度,对于每个Query在Gallery中找出前N个与其相似的图片。

├── Market/
│   ├── bounding_box_test/          /* Files for testing (candidate images pool),19732张
│   ├── bounding_box_train/         /* Files for training,12936张
│   ├── gt_bbox/                    /* Files for multiple query testing,3368张,对应query,在评估时使用
│   ├── gt_query/                   /* We do not use it
│   ├── query/                      /* Files for testing (query images),3368张查询,会到test中寻找

数据集实例如上,值得注意的是训练集的人和测试集的人没有重复的。比如market里面有751名个人用于训练,另外有750个人用于测试。

如果Gallery中没有Query怎么办?
这种情况实际中很可能会存在,但或许ReID的目的不是为了精确的找到Query,而是返回一个候选列表帮助人工筛选,这样不存在也可能很快发现。

single shot 和muti shot
single shot是指gallery中每个人的图像为一张(N=1),而muti shot是指gallery中每个人的图像为N>1张图像,同样的Rank-1下,一般N越大,得到的识别率越高。

query = qf.view(-1,1)
# print(query.shape)
score = torch.mm(gf,query) # Cosine Distance
score = score.squeeze(1).cpu()
score = score.numpy()
# predict index
index = np.argsort(score)  #from small to large
index = index[::-1]

主要流行的解决方法
主要有三种,基于表征,加入局部信息,引入生成对抗。

  • 基于预测。即两张图片输入网络,预测其“相同”或者“不同”。
  • 基于分类。即一张图片输入网络,分类映射其该图片的任务ID。
  • 基于三元组。即给出正例负例图片对,重点拉开不同类图片之间的差距。
  • 基于局部身体部件。提取局部特征增大信息量,还可以解决部分遮挡问题。
  • 基于水平分块。分块后可以对齐局部以减缓分辨率问题和局部的不稳定。
  • 基于注意力机制。这种方法是加强局部信息的终极版,自行关注重要区域,还可以引导学习区域性信息。
  • 基于行人姿态生成。输入图片得到行人姿态,引入姿态信息加强。
  • 基于图像风格转换。主要解决各个场景的风格不一致问题,使用GAN来跨域迁移风格生成,用于数据增广是很好的。

来自中文综述论文

卢健,陈旭,罗毛欣,王航英. 深度学习行人再识别研究综述.

实际上应该还有很多其他的方法,比如人体属性,骨架Graph等等,还有涉及无监督和跨模态的任务等等。


Trick合集
fastreid是一个集成了超级多实现的开源代码:https://github.com/JDAI-CV/fast-reid

  • pre-processing:有改变大小,翻转,随机擦除补0替换等等的对图片的预处理操作,以增强图片的鲁棒性。
  • backbone:基础的提取特征单元,也实现了流行的resnet,resnest,resnext等等,即插即用。
  • aggregation:聚合特征,其中gem是介于avg和max的一种方法
  • head:用于做特征规约,减少参数数量
  • loss:除了一般的交叉熵,三元组loss,还实现了arcloss和circleloss等比较新的函数
  • 训练阶段其他trick:学习率递减,网络参数热身,便于fine-turn网络等等的代码
  • distance metric:将得到的特征进行比对,实现了普通的欧几里德,余弦,还有对于size不一样的情况的DSR算法
  • post-processing:主要是两个trick,一是rerank,即把检索出来的图片也再检索一次,如果被检索图片也能检索到原query,则rank靠前。二是查询扩大,即用所有的检索结果的均值再检索一遍。这两种都是对rank性能的后处理。
  • evaluation:对reid性能的评价,如CMC和ROC等等。
    这个开源代码做的很工程,任何部分都是可拆卸,可拼装的,非常方便。

当前一些sota方法的实现与表现
多蹲蹲顶会和开源就好…

  • code:https://github.com/layumi/Person_reID_baseline_pytorch/tree/master/leaderboard
  • 视频:https://www.bilibili.com/video/BV1Mx411871F
  • 超全随笔:https://www.cnblogs.com/orangecyh/category/1570883.html
  • 知乎讨论:https://www.zhihu.com/question/46943328
  • 论文泛读:https://blog.csdn.net/u013982164/article/details/79608100
  • https://blog.csdn.net/weixin_41427758/article/details/81187997

简单注释一下基模型的代码:

class ClassBlock(nn.Module):def __init__(self, input_dim, class_num, droprate, relu=False, bnorm=True, num_bottleneck=512, linear=True, return_f = False):super(ClassBlock, self).__init__()self.return_f = return_fadd_block = [] #图像特征抽象if linear: #多个mlpadd_block += [nn.Linear(input_dim, num_bottleneck)]else:num_bottleneck = input_dimif bnorm: #bn层add_block += [nn.BatchNorm1d(num_bottleneck)]if relu: #激活函数add_block += [nn.LeakyReLU(0.1)]if droprate>0: #dropoutadd_block += [nn.Dropout(p=droprate)]add_block = nn.Sequential(*add_block) #把多个mlp串起来add_block.apply(weights_init_kaiming) #然后应用kaiming初始化classifier = [] #分类器网络classifier += [nn.Linear(num_bottleneck, class_num)] #也是mlp得到分类ID数目classifier = nn.Sequential(*classifier)classifier.apply(weights_init_classifier)self.add_block = add_block #特征抽取self.classifier = classifier #映射到IDdef forward(self, x):x = self.add_block(x) #先得到特征if self.return_f: #再分类f = xx = self.classifier(x)return x,felse:x = self.classifier(x)return x

这个基方案可以搭得更深就是了如 AlexNet, VGG16, ResNet and DenseNet等等,还想注释一下PCB。

PCB(Part-Based Convolutional Baseline)将行人图片均匀划分为6个部件并提取特征,用6个分类的损失函数进行模型训练。这么做的意义是能够基于行人结构分割的先验知识驱使,比如part1就是行人的头部。

class PCB(nn.Module):def __init__(self, class_num ):super(PCB, self).__init__()self.part = 6 # 切成6份model_ft = models.resnet50(pretrained=True)#用resnet50提特征self.model = model_ftself.avgpool = nn.AdaptiveAvgPool2d((self.part,1))self.dropout = nn.Dropout(p=0.5)# remove the final downsampleself.model.layer4[0].downsample[0].stride = (1,1)self.model.layer4[0].conv2.stride = (1,1)# 定义6分类for i in range(self.part):name = 'classifier'+str(i)setattr(self, name, ClassBlock(2048, class_num, droprate=0.5, relu=False, bnorm=True, num_bottleneck=256))def forward(self, x): #逐层前向就行x = self.model.conv1(x)x = self.model.bn1(x)x = self.model.relu(x)x = self.model.maxpool(x)x = self.model.layer1(x)x = self.model.layer2(x)x = self.model.layer3(x)x = self.model.layer4(x)x = self.avgpool(x)x = self.dropout(x)part = {}predict = {}# 6个部分的特征 batchsize*2048*6for i in range(self.part):part[i] = torch.squeeze(x[:,:,i])name = 'classifier'+str(i)c = getattr(self,name)predict[i] = c(part[i])# sum prediction#y = predict[0]#for i in range(self.part-1):#    y += predict[i+1]y = []for i in range(self.part):y.append(predict[i])return y

当然还有一些更复杂的模型咯,更多的论文都可以参考上面的那个开源。

数据集
现有的数据集都不是很大,ID和摄像头都不是很多。

评价指标
一般使用rank-n,即搜索结果中最靠前(置信度分数最高)的n张图有正确结果的概率。
例如: lable ID为行人0001,在100个样本中搜索。

  • 如果识别结果是0001、0051、0013、0004、0015……,则此时rank-1的正确率为100%;rank-2的正确率也为100%;rank-5的正确率也为100%;
  • 如果识别结果是0051、0001、0013、0004、0015……,则此时rank-1的正确率为0%;rank-2的正确率为100%;rank-5的正确率也为100%;

怎么真实应用?
真实场景中的情况,和公共数据集的数据是不一样的,往往是需要从原视频/图像的一整张大图中,先做检测找出小人,然后才在所建立的gallery里面进行查询和检索的。

Person Re-Identification(ReID行人重识别)相关推荐

  1. ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目

    利用ReID和目标检测对视频进行检测,可以对视频中的人进行重识别,支持更换数据集可以做车辆重识别等.可应用于图像.视频检索,行人跟踪等 在以前学习ReID的时候,是跟着下面视频学习的,该论文和代码也可 ...

  2. 云从的多粒度网络(MGN)的结构设计与技术实现-ReID行人重识别

    云从的多粒度网络(MGN)的结构设计与技术实现-ReID 1.简介 全局特征和局部特征的结合是提高人的再识别(re-ID)任务识别性能的一种有效方法.以前的基于部分的方法主要集中在定位具有特定预定义语 ...

  3. REID计算机网络,什么是行人重识别(ReID)?为什么要ReID?

    原标题:什么是行人重识别(ReID)?为什么要ReID? 什么是Re-ID? 行人重识别(Person Re-identification,也称行人再识别,简称为ReID),是利用计算机视觉技术判断图 ...

  4. 行人重识别(ReID)概述

    什么是Re-ID? 行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.广泛被认为是一个图像检 ...

  5. 行人重识别-REID

    行人重识别-REID 一.REID 二.为什么使用REID 三.REID应用场景 四.REID研究形式 五.REID存在的挑战 一.REID 行人重识别-REID(person re-identifi ...

  6. 行人重识别技术(Re-ID)概述、研究现状以及相关数据集下载

    ReID技术概述 什么是ReID 一般流程 Re-ID特点 研究现状 难点 数据集 reid常用数据集以及下载链接 评价指标 实现思路 研究方式 基于表征学习 基于度量学习 基于局部特征 全局特征 切 ...

  7. 行人重识别基础(一)

    行人重识别概述 为什么要研究Re-ID 什么是Re-ID Re-ID系统 Re-ID系统的构成 如何构建Re-ID系统 如何评估Re-ID系统 常用数据集 评估指标 参考文献 为什么要研究Re-ID ...

  8. 行人重识别(ReID) ——基于深度学习的行人重识别研究综述

    转自:https://zhuanlan.zhihu.com/p/31921944 前言:行人重识别(Person Re-identification)也称行人再识别,本文简称为ReID,是利用计算机视 ...

  9. 行人重识别0-01:DG-Net(ReID)-论文翻译,详细解说(1)

    以下链接是个人关于DG-Net(行人重识别ReID)所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论技术.若是帮助到了你什么,一定要记得点赞! ...

最新文章

  1. Xamarin.iOS提供没有匹配的配置文件
  2. Nilearn中的基本操作和查看
  3. iOS保存model数据(自定义Model 可以存放到本地)
  4. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
  5. 利用计算机可以对物体的运动情况,2018-2019学年高中物理第05章曲线运动专题5.3实验:研究平抛运动情景分组训练新人教版必修2.docx...
  6. 阮一峰的JavaScript 的 this 原理
  7. android运营商获取本机号码_一键登录已成大势所趋,Android端操作指南来啦!
  8. myeclipse查询mysql出来的汉字是乱码
  9. 默认select选中其中一个option的值
  10. Autodesk Eagle入门之-线宽操作
  11. 以管理员身份打开cmd窗口
  12. 定位position-relative
  13. JupyterLab教程:程序员的笔记本神器v2.0
  14. bzoj1778 驱逐猪猡 [高斯消元+概率DP]
  15. 最新emoji表情代码大全_周六最美早晨好问候语图片大全 早晨好图片祝福 最新早上好问候动态表情图片...
  16. CSS translation
  17. 想靠“免费”搅局智能家居,小度添添智能健身镜凭什么?
  18. 基于PHP+MySQL的在线投票系统设计与实现
  19. Redis安装和入门
  20. MySql 查询有课的学生的学号,姓名和所学的课号及成绩

热门文章

  1. docker 命令大全
  2. 获取项目服务器ip,java获取服务器ip地址
  3. 全球与中国云监控软件市场深度研究分析报告(2021)
  4. 简述运用计算机思维解决问题的步骤,计算思维能力主要包括问题及问题求解过程的符号表示、逻辑思维与抽象思维、形式化证明、建立模型和模型计算、利用计算机技术等能力 答案:√...
  5. Jasper(1)——入门
  6. VB-Excel编程经历*
  7. 启动计算机加载状态监控器,状态监控器显示脱机。
  8. 《面向对象程序设计》课程设计
  9. CIDEr 评价指标
  10. js使用rgb和argb