【深度学习笔记1】——行人重识别之必备知识与深度学习入门小经验


笔者第一次写blog。请大佬们多多提携,如有错误欢迎提出并多多海涵哟~

一. 行人重识别基础知识

1.gallery和probe:

gallery是候选行人库(一般就是数据集里的test集),probe是待查询输入,也叫查询图像(query)。

2.single shot 和multi shot:

代表一个重识别系统既可以输入图片(single-shot)也可以输入视频(multi-shot)。(这和目标检测的single shot与multi shot不同哦,目标检测指的是网络结构呢~)

3.rank-n:

搜索结果中最靠前(置信度最高)的n张图有正确结果的概率。
举例:待检测的lable为m1,如果识别结果是m2、m1、m3、m4、m5……,则此时rank-1(包含m2)的正确率为0%;rank-2(包含m2,与正确的m1)的正确率为100%;rank-5(包含m2、m1、m3、m4、m5)的正确率也为100%;

4.precision(准确率) 和 recall(召回率):

其实和机器学习的概念是一样的,现在来回顾一下:

真实情况预测结果预测结果
——正例反例
正例TPFN
反例FPTN

简单记忆方式:T和F代表预测正确与否,P和N代表预测值是正例还是反例。
例如:TP为预测为正例(P)并且预测正确(T)则处在左上角位置。而TN为预测值是反例(N)并且预测正确(T)则处在右下角位置,真实情况它就是反例呀。

准确率P和召回率R分别定义为:
P = T P T P + F P P = \frac{TP}{TP+FP} P=TP+FPTP

R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP
准确率Precision = 提取出的正确信息条数 / 提取出的信息条数
召回率Recall = 提取出的正确信息条数 / 样本中的信息条数

这两者是一对矛盾的度量,准确率可以认为是”宁缺毋滥”,适合对准确率要求高的应用,例如商品推荐,网页检索等。召回率可以认为是”宁错杀一百,不放过1个”,适合类似于检查走私、逃犯信息等。

5.AP和mAP:

AP衡量的是模型在单个类别上判断结果的好坏(效果好坏),mAP衡量的是模型在所有类别上的好坏。(这个指标很重要呀,好多CV任务中都有它)

6.F-Score:

Precision和Recall是对立关系的,一般情况下,Precision高,Recall就低;Recall高,Precision就低。所以在实际中常常需要根据具体情况做出取舍,例如一般的搜索情况,在保证召回率的条件下,尽量提升精确率。很多时候我们需要综合权衡这2个指标,这就引出了一个新的指标F-score。这是综合考虑Precision和Recall的调和值。
F − S c o r e = ( 1 + β 2 ) ⋅ ( P r e c i s i o n ⋅ R e c a l l β 2 ⋅ P r e c i s i o n + R e c a l l ) 2 F-Score=(1+\beta^2)· (\frac{Precision·Recall}{\beta^2·Precision+Recall} )^2 FScore=1+β2)(β2Precision+RecallPrecisionRecall)2
β \beta β=1时,称为F1-score,这时,精确率和召回率都很重要,权重相同。当有些情况下,我们认为精确率更重要些,那就调整 β \beta β的值小于1,如果我们认为召回率更重要些,那就调整 β \beta β的值大于1。

7.CMC:

CMC曲线全称是Cumulative Match Characteristic (CMC) curve,也就是累积匹配曲线。CMC曲线是 算top-k的击中概率,主要用来评估闭集中rank的正确率。具体含义是指:在候选行人库(gallery)中检索待查询(probe)的行人,前 r 个检索结果中包含正确匹配结果的比率。例如:横坐标的1代表rank1的识别率(和上面的rank-n对应的)以此类推,2代表rank2的识别率。
在这里插入图片描述

二. 行人重识别的四大类loss

1.Distance loss:

主要包括有:Center loss, coupled clusters loss,structured loss,quadruplet loss,Triplet loss,以及他们的各种改进版本,这些loss 不仅可以用在ReID上其他任务比如人脸检测中也可运用
包含的内容很多,无法一一叙述,大家需要详细去了解。附上优秀师兄对其中triplet loss和quadruplet loss的讲解:
https://blog.csdn.net/qq_28659831/article/details/80805291
但读懂这些loss最基本的就是要了解距离的不同度量方式。在ReID出现最多的有以下几种。

1)余弦距离(Consine distance)

(1) 余弦相似度(Consine similarity)
在这里插入图片描述

(2) 余弦距离(Consine distance)在这里插入图片描述
由图可知,相比欧氏距离dist(A,B),余弦距离更加注重两个向量在方向上的差异。欧氏距离衡量的是空间各点的绝对距离。欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。并且欧式距离与余弦距离是可以相互转换的,公式如下:
在这里插入图片描述
在代码中可以这么写:

original_dist = 2. - 2 * original_dist   # change the cosine similarity metric to euclidean similarity metric

代码摘自re-ranking代码,转换距离的部分。

2)杰卡德距离(Jaccard distance)

(1)杰卡德相似系数
两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标(余弦距离也可以用来衡量两个集合的相似度)。
在这里插入图片描述
注:经常用于CV任务,与目标检测中的IOU指标类似哦。大家要熟记哦。
(2)杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),可以用如下公式来表示:
在这里插入图片描述
注:re-ranking论文运用到了杰卡德距离进行重排序。

3)马氏距离(Mahalanobis distance)

是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。 在ReID任务中作为基础的距离度量。
在这里插入图片描述

2.Identification loss:

在论文中简称ID loss。这个和分类任务中的loss类似,也用softmax loss。但也存在着缺点,当目标很大时,会严重增加网络参数,而训练结束后很多参数都会被摒弃。
很多工作都是融合了ID loss 和 Triplet loss 来进行训练的,但是这种loss函数的目标并不协调,对于 ID loss,特别是行人重检测, consine距离比欧式距离更加适合作为优化标准,而 Triplet loss 更加注重在欧式空间提高类内紧凑性和类间可分性。因此两者关注的度量空间不一致,这就会导致一个可能的现象就是当一个loss减小时另一个在震荡或增大。

3.Verification loss:

和ID loss相似,成对的判断两张图片的相似度,因此很难应用到目标聚类和检索上去。因为一对一对比速度太慢了。

4.Attribute loss:

对于不同的属性做分类。比如帽子,衣服颜色。精细比较,能一定程度提升效果,但是这种做法太麻烦。

三. 行人重识别的代码一些难点(pytorch)

刚开始看reid代码觉得比起简单的分类任务难多了,因为reid有很多复杂的矩阵运算。torch运算不熟悉很头疼呀。
举几个例子:

1.pattern = re.compile(r’([-\d]+)_c(\d)’)#正则
pid, _ = map(int, pattern.search(img_path).groups())#复杂语句

注释
正则表达式compile()函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
以Market-1501为例,文件命名规则如下:“0001_c1s1_001051_00.jpg”,"0001_c1s1_001051_00.jpg"做如下解释:行人身份_摄像头编号&拍摄到的序列的编号_帧数号_边框号。因此写正则匹配式r([-\d]+)_c(\d),匹配并获取行人身份号和摄像头编号,得到的结果为:(行人ID号,摄像机编号)。其中r代表省略转义字符,比如我们匹配信息item\n 时,如果没有r,我们要将正则表达式写成re.compile(‘item\n’);但是,当我们加上了r时,我们的正则表达式写成re.compile(r’item\n’)就可以了。([-\d]+)和(\d),括号()内的都是需要返回的内容,\d代表匹配得到数字,+代表匹配前一个字符1次或无限次,_c表面两数字间要有_c的匹配形式。

2.distmat.addmm_(1, -2, qf, gf.t())

注释
首先:torch.addmm(beta=1, mat, alpha=1, mat1, mat2, out=None) → Tensor
对矩阵mat1和mat2进行矩阵乘操作。矩阵mat加到最终结果。如果mat1是一个 n×m张量,mat2 是一个 m×p张量,那么out和mat的形状为n×p。 alpha和 beta分别是两个矩阵 mat1@mat2和mat的比例因子,即, out=(beta∗mat)+(alpha∗mat1@mat2)。在代码中也就是1 ∗ * distmat-2 ∗ * qf ∗ * gf.t()
注:对类型为 FloatTensor 或 DoubleTensor 的输入,beta和 alpha必须为实数,否则两个参数须为整数。

暂且就这么多啦,之后学习到了再分享呢。
可以看下罗老师ReID的综述对ReID进行更深入了解:
https://zhuanlan.zhihu.com/p/31921944?edition=yidianzixun&yidian_docid=0HxdUMNG
以及看看现在ReID涨点的Trick:(这篇论文是把近几年用到的Trick来个大综合,大家可以拿去涨点呀)
https://arxiv.org/abs/1903.07071
之前还看到用在图像分类中的trick总结,亲试可用:
https://mp.weixin.qq.com/s?__biz=MzI4MjA0NDgxNA==&mid=2650722499&idx=1&sn=b489bb77ba12be14df197fdc77893b22&chksm=f3958022c4e20934aee7516645a415a379275423b1805da63e7419766ad38460e1f8cd18fc6d&mpshare=1&scene=23&srcid=0303HrF8UEJNThmdJNHWNSqd#rd
慢慢发现Tricks虽然好,但也不能乱加。最近在做医学图像分类,疯狂堆叠tricks点反而爆跌。。。可能我需要玄学的力量吧。

参考文献

https://blog.csdn.net/mingtian715/article/details/53488094
https://blog.csdn.net/Chen_yuazzy/article/details/81002507
https://blog.csdn.net/qq_38451119/article/details/83000061
http://www.cnblogs.com/chaosimple/archive/2013/06/28/3160839.html
https://zhuanlan.zhihu.com/p/60546887


Shuting He, master student

Foresight Control Center

College of Control Science & Engineering

Zhejiang University

Email: shuting_he@zju.edu.cn

  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值