Re-ID----读“ Bag of Tricks and A Strong Baseline for Deep Person Re-identification”

2024-01-05 06:50

本文主要是介绍Re-ID----读“ Bag of Tricks and A Strong Baseline for Deep Person Re-identification”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

贡献

(1)提供了Re-ID训练的一些标准技巧。

(2)仅仅使用全局特征就得到了很高的准确率。

(3)设计了新的neck structure——BNNeck。

(4)评估了图片大小和batch大小对Re_ID的影响。

 

作者给定的基准

 

  1. 使用的网络RestNet50。
  2. 使用imagenet上的预训练参数,并且把预训练模型的FC层维度改为ID数。
  3. 选用P个人的K张图片作为batch(P×K)。
  4. 改变图片像素大小到256×128, (?)把十个像素值置零然后分撒到图像中。
  5. 每张图片有0.5的机率翻转。
  6. 把图片的像素值映射到[0,1]之间的32为浮点数,通过减去[g 0.485, 0.456, 0.406

],除以[0.229, 0.224, 0.225]来标准化RGB通道。

  1. 模型输出特征及预测的概率。
  2. 特征用来计算三元组损失,概率用来计算交叉熵。三元组损失的margin是0.3。
  3. 使用Adam优化函数,最初的学习率被设置为0.00035,之后在第40epoch和第120epoch  的时候减小0.1。总共有120个epoch。

 

一些训练技巧

一些不用改变模型结构的技巧,基本的网络结构如下:

 

 

预热学习率

学习率对模型的影响很大。标准的基准使用很大并且恒定的学习率。而预热策略能让模型有更好的表现:使用10个epoch来线性地增加学习率,之后在第40和70epoch的时候减少。(具体的函数和图像如下图)

     

 

随机擦出增长

人物有时候会被物体挡住。为了解决这个问题,提高模型的泛化能力,提出了一种新 的数据增长方法——随机擦除增长(REA)。具体来说:一张图片被改变的机率是,不 改变的机率是。然后,被擦出的区域记做:,它的大小是。而被擦除部 分和整体的大小的比记做(在被限定的范围内是随机的)。为了决定独一无二的 区域,初始化一个点P(只要从这个点发展的区域在图片内,否则重新再选)。

示例如下:

 

 

标签顺滑

IDE是行人重识别的标准。它的最后一层输出的是预测的概率。而交叉熵的算法如下:

,即这是我们所说的ID损失。

防止行人重识别模型的过拟合十分重要,LS(标签顺滑)就可以解决预防问题。它改变了交叉熵的q的函数映射:

被设置为0.1。这样可以使模型不太过切合训练集,提高了模型的表现。

最后一步

更高的分辨率可以丰富特点的粒度。一篇文章,去掉了网络中spatial downsampling 的操作,进而增加了特点的大小。为了方便把该操作记做stride。ResNet50 的最后一步为2,如果输入的图片是256×128,则输出的大小为8×4。但是如果 把步长改为1(从2),就可以得到16×8的大小。这个操作只是小小地增加 了计算的花费,但是不会增加任何参数。但是,更高的分辨率带来的是意义重大的提升。

BNNeck:

大多数工作是把ID损失和三元组损失结合在一起训练模型,两个损失同时约束同一个特征空间。但是,这两个损失的目标在嵌入空间不一样。ID损失构造了几个超平面来把嵌入空间分割成不同的子空间。在这种情况下,余弦距离比欧式距离更适合来计算优化函数的损失在推理阶段。另一方面,三元组损失使类内更加紧密,类间更加分离(在欧式距离上)。因为三元组损失不能提供类间优化约束,致使类间距离有时候比类内距离更小。二者结合的办法可以使模型学习更多不同的空间。但是,ID损失是余弦距离,三元组损失是欧式距离。如果我们同时用它们来优化特征向量,目标可能不一致。则在训练阶段,可能出现的现象就是,一个损失在减小,而另一个损失可能不变或者增大。

为了克服上述问题,作者设计了一个叫做BNNeck的结构:

 

即只是在特征层之后,在FC层之前增加了一个标准化层。BN层之前的特征记做,之后的记做。在训练阶段两者分别用来计算三元组损失和ID损失。标准化平衡了的每个维度。特征高斯分布在,超空间的表面上。这种融合使ID损失更容易融合。此外,BNNeck减少了ID损失在上的约束,意味者同时ID损失更少的约束使三元组损失更容易融合。第三,标准化使同一个人的特征分布更加紧密。

因为超空间几乎是关于坐标原点对称的。BNNeck去除了FC分类器的偏置,进而使超平面通过坐标轴原点。(使用Kaiming初始化FC层)

在训练阶段,使用来做行人重识别,余弦函数比欧式距离表现更好。实验表明大的三元组边界可以使模型表现得更好。

 

中心损失:

三元组损失的算法:

其中的操作数分别是正对间的距离,负对间的距离,三元组损失的边界,[]+代表取非负。但是三元组损失的算法只考虑了,正负之间的距离而忽略了它们的绝对距离,它是随意地被两个人决定的,在整个过程中很难保证正对间的距离一定小于负对间的距离。

中心损失同时计算每个类的中心深度特征,并且惩罚中心特征和相应类之间的特征,弥补了三元组损失的不足,中心损失的算法计算如下:

(y代表标签,c代表类的深度中心特征)

公式有效地描述了类内的变化。最小中心距离增加了类内的紧凑度。作者的模型计算损失如下:

(其中是权重)

 

 

实验结果

罗浩,在Market1501和DukeMTMC上评估了模型,rank1和mAP用度量评估来报告。为了防止过拟合甚至还用了交叉域来展示实验结果。

每个技巧的影响

 

                 

这些技巧和在其他的文章里报告的一样,BNNeck比其它技巧更加多的提高了模型的表现。最后,这些技巧在Market1501上的表现是94.5%rank1, 85.9%mAP;在Duke上是86.4%rank1和76.4%mAP。此外,如此的提升只是增加了BN层而并没有增加训练时间。

分析BNNeck:

这个部分评估BNNeck前后两个不同特征(用欧式距离和余弦距离度量)。作者观察到,在BNNeck之前的特征上,余弦距离度量比欧式距离更好。ID损失可以约束,被几个超平面清晰地划分。余弦距离可以度量两个特征向量的角度,所以余弦距离可以比欧式距离更好地度量。然而,更近三元组损失,同时被ID损失约束。两种度量在的表现上相同。

总之,BNNeck提升了模型的表现,选择余弦度量在推理阶段。

 

每个技巧的影响

为更多地探索有效性,使用交叉域看结果:

        

总的来看,预热策略,标签顺滑,BNNeck都显著地增加了模型在交叉域的表现。改变步长和中心损失对表现没有很大的影响。然而,REA在交叉域甚至还对模型有害(可能是由于过拟合)。

 

和世界先进水平的对比

 

罗浩的模型世界先进水平进行了对比。所有的问题被分成了不同的种类。金字塔在两个模型上有惊人的表现。然而,它链接本地21个不同规模的特点。如果只用全局特征,它有94.5%的rank1和85.9%mAP在Market1501. BFE和本文有相似的表现,但是它结合了两个分支的特征。只用全局,本文打败了AWTL。k-reciprocal reranking方法增加了表现,使本文达到了94.1%和89.1%的mAP在两个数据集上。这是这两个数据集上所达到的最大结果。

 

补充实验

                                                 

观察之前的工作,在不同的batch大小和图片大小。

                       

batch的大小对结果的影响

移除了中心损失以便观察结果。没有观察到明显的影响,一个轻微的趋势是大的batch表现更好。每个人的张数有利于正对,人的个数有利于负对。

图片大小的影响

                                   

没有使用中心损失,P=16,K=4,四个模型在数据集上的表现很相似。初步结论是图片大小并没有太多影响。

总结和展望

和人脸识别达到的水平还有一定距离。将来的工作如用L2标准化。此外,世界先进水平的如,PCB, MGN还有AlignedReID在本文的基础上是否会有效果。

 

 

这篇关于Re-ID----读“ Bag of Tricks and A Strong Baseline for Deep Person Re-identification”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572012

相关文章

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最优预览尺寸以及打印相机参数信息 二、Camera 工具类 CameraIdResult.java public class CameraIdResult {

集群环境下为雪花算法生成全局唯一机器ID策略

雪花算法是生成数据id非常好的一种方式,机器id是雪花算法不可分割的一部分。但是对于集群应用,让不同的机器自动产生不同的机器id传统做法就是针对每一个机器进行单独配置,但这样做不利于集群水平扩展,且操作过程非常复杂,所以每一个机器在集群环境下是一个头疼的问题。现在借助spring+redis,给出一种策略,支持随意水平扩展,肥肠好用。 大致策略分为4步: 1.对机器ip进行hash,对某一个(大于

在实现回显功能模块的时候,把ID设置成全局变量了

在hsapprove.jsp中: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><script type="text/javascript">function edittodayhs(hsid){//alert(hsid);//

PL/SQL工具创建Oracle数据库表,实现id字段的自动递增

通过PL/SQL工具,创建Oracle数据库表,如何实现字段ID自动递增; Oracle的自增需要依靠序列和触发器共同实现 比如:先创建一个表 create table test (id int primary key, name varchar2(10)); 创建一个序列 create sequence test_seq increment by 1 start with 1  min

2015多校联合训练第一场Tricks Device(hdu5294)

题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数,总边数-最短边数就是第二个答案 第一个答案就是在最短路里面求最小割,也就是求最大流,然后根据最短路在建个新图,权为1,跑一边网络流 模板题,以后就用这套模板了 #include <iostream>#include <cstdio>#incl

分布式项目中使用雪花算法提前获取对象主键ID

hello,大家好,我是灰小猿! 在做分布式项目开发进行数据表结构设计时,有时候为了提高查询性能,在进行数据库表设计时,会使用自增ID来代替UUID作为数据的主键ID,但是这样就会有一个问题,数据的自增ID应该如何获取到下一个ID并且插入到库中呢? 如果你使用的是mybatisPlus,可以使用自带的自增注解加在id字段上即可,这样在数据入库时就可以自动给数据赋值自增的主键ID, 但是对于不

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并'导出数据集'. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename := 'Test.hdict'” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev

013.Python爬虫系列_re正则解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

《长得太长也是错?——后端 Long 型 ID 精度丢失的“奇妙”修复之旅》

引言 在前后端分离的时代,我们的生活充满了无数的机遇与挑战——包括那些突然冒出来的让人抓狂的 Bug。今天我们要聊的,就是一个让无数开发者哭笑不得的经典问题:后端 Long 类型 ID 过长导致前端精度丢失。说到这个问题,那可真是“万恶之源”啊,谁让 JavaScript 只能安全地处理 Number.MAX_SAFE_INTEGER(也就是 9007199254740991)以内的数值呢?

练习实践-git工具-id:1-git 工具的基础命令

参考来源: csdn技能树-git https://fishc.com.cn/forum-334-1.html fishc论坛的扩展阅读 git能做什么? 进行版本控制,版本记录、版本回退; 需求场景:一个新的开发项目,随着功能的增加,代码量、相关文件数量也在逐渐增多…… 这样开发就会遇到一个问题:当需要修改一些代码的时候,不得已要删除另外一些代码。第二天脑袋突然被门框给夹了一下,又想恢复回