零基础实战行人重识别ReID项目-基于Milvus的以图搜图
目录
第一阶段,ReID的基本概念
1.1 ReID定义
1.2 技术难点
1.3 常用数据集
1.4 评价指标
1.5 实现思路
1.6 具体方案
第二阶段:复现算法
2.1 PCB的骨干网络
2.2 PCB的流程
2.3 PCB的细节
2.4 PCB-RPP
2.5 算法复现
第三阶段:工程化落地
3.1 业务逻辑
3.2 Milvus
3.3 以图搜图
3.4 效果展示
加入学习小组
零基础学习ReID,复现主流的ReID算法,并进行工程化落地。
学习目标:掌握ReID的算法原理、实现方案,动手搭建网络模型,在数据集上复现算法。
学习内容:阅读相关资料、论文、开源代码,复现算法,工程化落地。
如果你也在学习ReID,欢迎加入免费学习小组,加入方式见文末。
第一阶段,ReID的基本概念
包括 ReID的定义、常用数据集、评价指标、实现思路
推荐一个视频教程:https://edu.csdn.net/huiyiCourse/detail/788,可下载配套PPT
这个博客对视频进行了总结:https://blog.csdn.net/ctwy291314/article/details/83618646
1.1 ReID定义
全称Person Re-Identification,主要解决跨摄像头跨场景下行人的识别与检索。该技术可以作为人脸识别技术的重要补充,可以对无法获取清晰拍摄人脸的行人进行跨摄像头连续跟踪,增强数据的时空连续性。
1.2 技术难点
相机拍摄角度,图片模糊不清楚,室内室外环境变化,行人更换服装饰配,冬季夏季风格差异,白天晚上光线差异等。
1.3 常用数据集
Market1501 http://liangzheng.com.cn/Project/project_reid.html 网站挂了,联系我提供下载地址
DukeMTMC-reID https://github.com/sxzrt/DukeMTMC-reID_evaluation#download-dataset
CUHK03 http://www.ee.cuhk.edu.hk/~xgwang/CUHK_identification.html
1.4 评价指标
Rank1:首位命中率
mAP:平均精度均值
CMC:累计匹配曲线
参考:https://zhuanlan.zhihu.com/p/40514536
https://blog.csdn.net/qq_38451119/article/details/83000061
1.5 实现思路
a.检索图经过网络抽取图片特征(Feature) ;
b.底库里的所有图片全部抽取图片特征(Feature) ;
c.将检索图与地库图的特征计算距离(例如欧式距离) ;
d.根据计算距离进行排序,排序越靠前表示是相似率越高。
1.6 具体方案
方案 | 性能 | 对应论文 |
方案一:表征学习 基于SoftmaxLoss(分类损失)与 ContrastiveLoss(对比损失) |
Rank1: 79.51% mAP: 59.87% |
Z.Zheng,L.Zheng,andY.Yang. A discriminatively learned cnn embedding for person re-identification. arXiv preprint arXiv:1611.05666, 2016. |
方案二:度量学习 基于Triplet Loss(三元损失) |
Rank1: 84.92% mAP: 69.14% |
A.Hermans, L. Beyer, and B. Leibe. In defense of the triplet loss for person re-identification. arXiv preprint arXiv:1703.07737, 2017. F. Schroff, D. Kalenichenko, and J. Philbin. FaceNet: A Unified Embedding for Face Recognition and Clustering. In CVPR, 2015. 1, 2, 3, 5 |
方案三:局部特征学习 3.1 基于局部区域调整 |
Rank1: 80.31% mAP: 57.53% |
L. Zhao, X. Li, J. Wang, and Y. Zhuang. 2017. Deeply-learned part-aligned representations for person re-identication. In CVPR. |
3.2 基于姿态估计局部特征调整 |
Rank1: 84.14% mAP: 63.41% |
C. Su, J. Li, S. Zhang, J. Xing, W. Gao, and Q. Tian. 2017. Pose-driven Deep Convolutional Model for Person Re-identication. In CVPR. |
3.3 PCB | Rank1: 93.8% mAP:81.6% | Y. Sun, L. Zheng, Y. Yang, Q. Tian, and S. Wang. Beyond part models: Person retrieval with refined part pooling. arXiv preprint arXiv:1711.09349, 2017. |
第二阶段:复现算法
2.1 PCB的骨干网络
选取上述的PCB方案,搭建网络,训练模型。
PCB使用修改版的ResNet-50作为骨干网,下图是ResNet不同层数的网络结构,
图片来自ResNet论文: Deep Residual Learning for Image Recognition
ResNet论文中指出,Downsampling is performed by conv3 1, conv4 1, and conv5 1 with a stride of 2.
所以,原始的ResNet-50 的下采样倍数为2^5 = 32倍,即输入的图像到输出的特征图缩小了32倍。
而PCB论文中指出,输入尺度为384x128(高比宽为3:1),经过骨干网络后,输出的特征图尺度为24x8,
所以下采样比例为16,因此,ResNet-50中 conv5_1的stride需要由2改为1.
2.2 PCB的流程
结合下图,介绍PCB的流程:
1.输入图像,尺度为 高384 x 宽128 x 通道3,送入修改后的ResNet-50,输出特征图T,尺度为 高24 x 宽8 x 通道2048
2.将T在高的维度上等分为6份,分别执行平均池化,得到向量g,尺度为 6 x 1 x 1 x 2048
3.对向量g执行1x1卷积,得到向量h,尺度为6 x 1 x 1 x 256
4.对每个向量h送入 256 x 751 全连接层的分类训练
疑问:得到6个分类向量后,行人分类是怎么处理的?
参考论文中的这么一段:
2.3 PCB的细节
训练阶段,输入图像,得到T、g、h,再经过全连接层得到6个1x751的向量,对这6个1x751的向量分别计算分类损失再累加。
测试阶段,输入图像,得到6个1x2048的g向量,然后对其进行拼接,得到一个1x12288的向量,(或者使用拼接后的h向量 1x1536) 用这个与特征库中的向量进行匹配,找到距离最近的作为检索结果。
用代码来解释最为直观:
参考项目:https://github.com/layumi/Person_reID_baseline_pytorch
项目的中文版解析:https://zhuanlan.zhihu.com/p/50387521
从train.py中的第215行可以看出,训练阶段,对6个全连接层的结果分别计算softmax,进行累加后,作为分类的预测值,
从第220行可以看出,对6个部分分别计算交叉熵损失,再将6个损失值累加,得到最终的loss
从test.py的第158行可以看出,提取特征时,取的是上述流程图中的g,即尺度为6x2048的特征向量
在实现细节上,代码中分别对6个分片除以它们的2范数,目的是降低不同维度上取值范围的差异性(可以理解为归一化)。
2.4 PCB-RPP
论文里还提出了PCB的改进策略:RPP - Refined Part Pooling
T中直接进行了6等分,但被强行分到同一个区域内的向量可能并不相似,特别是位于分界线两侧的那些向量。
RPP的目标就是对每个区域内的向量进行重新分配。通过计算f与g之间的余弦距离,找到与f最相近的g,将该 f 划分到对应的 g 区域内,划分结果如下图中右侧所示。
RPP通过一个线性层紧接着一个softmax激活层,对每个 f 向量进行区域分类。
得到分类之后的T,再对属于同一分区的f计算均值,得到6个分区的平均值向量g,后续结果与PCB流程相同。
RPP的流程如下:
论文提供了两个变种的方案:
Variant 1. 将所有h向量平均,得到单个h向量,送入全连接层进行分类训练;测试阶段,将g或h进行拼接,再进行分类。
Variant 2. 网络结构不变,只是将全连接层进行权值共享。
以及IDE ( 论文 Person reidentification: Past, present and future中的方案,本文对其进行了相应的改进)
并给出了不同方案的测试结果:
2.5 算法复现
推荐一个网站:https://www.paperswithcode.com/
专门用于查找论文复现的项目代码,比如PCB的搜索结果:
PCB的训练过程已在百度AI Studio上使用PaddlePaddle进行复现,源码:
https://aistudio.baidu.com/aistudio/projectdetail/468702
第三阶段:工程化落地
3.1 业务逻辑
基于PCB-RRP封闭环境下的ReID工程化落地的业务逻辑:
1.加载ResNet-50预训练网络模型,修改分类数目,在Market-1501数据集上继续训练网络;
2.对Market-1501数据集中的751个行人分别计算特征向量,存储备用;
3.获取一个行人的图片,提取特征向量,然后与751个特征进行比较,找到与之距离最小的1个或多个特征对应的原图作为备选结果。
其实上述的场景已经很接近于以图搜图了,只不过数据集是封闭的,而且量也不大。
虽然不是大规模的数据,但也可以借此机会感受一下以图搜图的完整流程。
3.2 Milvus
这里隆重介绍一款开源的特征向量相似度搜索引擎 Milvus https://www.milvus.io/cn/
3.3 以图搜图
官方提供了【基于 Milvus 和 VGG 实现以图搜图】项目的源码:
https://github.com/milvus-io/bootcamp/blob/master/solutions/pic_search/README.md
内置了VGG网络用于提取图像特征,用户只需要提供训练集和待测试的图片即可,特征提取、匹配过程对用户完全透明。
架构如图所示:
如需使用其他网络模型、修改图像resize后的尺寸,则需要修改源代码:
webserver / src / preprocessor/ vggnet.py
修改网络后,需要提供预训练模型文件,
位于webserver / data / models / 路径下:
可参考官网的博客:
【Milvus带你实现轻松搭建以图搜图系统】https://zilliz.blog.csdn.net/article/details/103884272
3.4 效果展示
本人使用Market-1501的bounding_box_test文件夹中19732张图片作为底库,使用query文件夹中的图片进行检索,效果如下:
Milvus提供的以图搜图解决方案中,使用的骨干网络是VGG-16,图片需要resize为224*224再送入进行特征提取,展示框的宽高比是1 : 1,导致图像有点变形。
而Market-1501数据集中的图片都是细长条状的,因此目前默认环境还不太符合实际应用场景。
修改展示界面中图像的宽高比:
bootcamp/solutions/pic_search/webclient/src/containers/Setting.tsx
通过网页中的关键字找到对应的位置:
通过对应的容器名,找到对应的配置参数:
修改benchImage中的width和height,即可修改待检索图片的展示效果。
可以改为:
width: "auto",
height:"250px",
而第126行、第127行的像素值,是预览框的尺寸,这个跟最后的展示没有关系,不需要改。
搜索结果宽高比的修改:
bootcamp/solutions/pic_search/webclient/src/components/Gallary.tsx
将child中的width和maxHeight分别改为:
width: "auto",
//maxHeight: "100%", 注释掉
height:"100%",
重新构建镜像:
# 构建镜像
$ docker build -t pic-search-webclient .
效果如下:
后续工作:在界面中显示搜索结果的图片名称、修改骨干网络的输入尺度、修改提取特征的骨干网络。
加入学习小组
关注公众号,回复 “组队”,加入免费学习小组
零基础实战行人重识别ReID项目-基于Milvus的以图搜图相关推荐
- 深度学习行人重识别ReID最新综述与展望
点击我爱计算机视觉标星,更快获取CVML新技术 今天 arXiv 新出论文 Deep Learning for Person Re-identification: A Survey and Outlo ...
- REID计算机网络,什么是行人重识别(ReID)?为什么要ReID?
原标题:什么是行人重识别(ReID)?为什么要ReID? 什么是Re-ID? 行人重识别(Person Re-identification,也称行人再识别,简称为ReID),是利用计算机视觉技术判断图 ...
- 行人重识别-REID
行人重识别-REID 一.REID 二.为什么使用REID 三.REID应用场景 四.REID研究形式 五.REID存在的挑战 一.REID 行人重识别-REID(person re-identifi ...
- opengl深度缓冲获得的深度图精度太低_深度学习行人重识别ReID最新综述与展望...
点击上方"计算机视觉life",选择"星标" 快速获得最新干货 arXiv 新出论文 Deep Learning for Person Re-identific ...
- 大白话解读行人重识别-ReID之DG-Net
综述参考: from:ReID综述(上)https://www.leiphone.com/news/201712/4Mvj2NBIxCN5bQZI.html from:ReID综述(下)https:/ ...
- 下一个视觉「杀手级应用」来了,依图行人重识别ReID性能创纪录
人脸识别之后的下一个风口是什么? 对于这个问题,业界似乎早已有了共识.从 AI 的人脸识别能力超越人类以来,学术界和产业界的目光逐渐转向另一个更具科研意义和应用价值的课题--行人重识别(Person ...
- 行人重识别(ReID) ——技术实现及应用场景
导读 跨镜追踪(Person Re-Identification,简称 ReID)技术是现在计算机视觉研究的热门方向,主要解决跨摄像头跨场景下行人的识别与检索.该技术能够根据行人的穿着.体态.发型等信 ...
- 行人重识别(ReID) ——数据集描述 DukeMTMC-reID
数据集简介 DukeMTMC 数据集是一个大规模标记的多目标多摄像机行人跟踪数据集.它提供了一个由 8 个同步摄像机记录的新型大型高清视频数据集,具有 7,000 多个单摄像机轨迹和超过 2,700 ...
- 行人重识别(ReID)概述
什么是Re-ID? 行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.广泛被认为是一个图像检 ...
最新文章
- 在Oracle VM VirtualBox中如何安装64位虚拟机系统
- mysql grant 主机名_MySQL GRANT:用户授权
- 计算机教师资格证报考科目,还在纠结报考教师资格证该选哪个科目呢?看完这篇,你不再迷茫...
- 写在那个毕业五年的日子
- 一个不错的机器视觉库 SimpleCV: a kinder, gentler machine vision library
- .net core中的高效动态内存管理方案
- Win32汇编基础1
- 【原创】3大主流的移动应用方式APP开发姿势解读
- 苹果设备plist编辑器plist editor Pro V2.1绿色版
- 使用eeupdate修改机器网卡mac地址
- 学海无涯!我总结了所有面试题,含答案解析
- 中南大学复试上机: 彩色气球
- 图像学习一:图像的旋转
- awl多线程SYN***
- 完美解决api-ms-win-crt-runtime-l1-1-0.dll详细步骤
- 20190926CF训练
- 基于springboot+jsp的服装穿搭信息管理系统
- FRM P1B4笔记:Valuation and Risk Models
- 集成钉钉机器人消息通知
- OpenHarmony HDF LED驱动开发 基于小熊派Micro
热门文章
- aliez歌词_aliez歌词歌词是什么意思 aliez是什么意思
- 2022 rog 枪神6p Ubuntu20.04 AX211无线网卡 驱动无效
- Json-glib的使用
- 如何以安全模式启动计算机,如何在Windows 10中以安全模式启动计算机
- Java 2.3(将英尺转换成米)编写程序,读入英尺数,将其转换为米数并显示结果。一英尺等于0.305米。下面是运行示例:
- 用python把txt文件转excel文件
- 计算机来源与发展历程
- 支付宝小程序选择手机本地视频
- 十年寒窗,高考加油!
- 批处理(bat)if 命令详解