m13
行人重识别ReID:给一个人,去一堆图片里面找哪个出现了这个人,适用于框架相似的细粒度识别
【Learning Relation...2020CVPR】
0、数据处理
图片原来的命名方式:人编号_c摄影机编号_图片编号
训练:数据集是bounding_box_train下的所有图片,其中有遮挡的图片较少,每个图片的真实标签在它的名字中,但是由于真实标签的邻居之间间隔太大,为了方便计算,标签又重新编了一次,从0开始,一个个挨着往后重新编,batchsize = p * k,p是1个batch4个人,k是1个人4张图,模型恢复为results/models里面的最新的保存模型,准备在其基础上继续训练,模型名字中的_编号就是第几次保存的模型,也等于第几epoch次训练模型,一次epoch设置为训练了200次,每过一个epoch就将模型的各个模块分别保存,更新学习率,再训练,训练的效果用日志做记录
把给定的图片 采用 双线性插值 resize 放大到 image_size=【256,128】;以0.5的概率水平翻转图像;四周 pad 黑色(图片大小也变);随机裁剪 到 image_size=【256,128】;用均值和标准差归一化张量;随机选择一个矩形区域然后擦掉像素(用指定的值代替原值),该操作的概率是probability=0.5
预测:从 /pre-trainedModels/ 下读取作者早就训练好的 119 次 的模型,缩放为固定大小和归一化,batchsize=128,测试集有 bounding_box_test 和 query(大部分都是遮挡的图片),两者分别测试,输出评估指标
1、【模型定义】关键点特征提取
对于 1 张图,图像一边通过pose Estimator 得到概率矩阵,这个矩阵中在图像的 14个关键点处概率值更大
pose Estimator 采用了HRnet(属于 single-person pose estimation,http://human-pose.mpi-inf.mpg.de/#results),该网络将4个多分辨率子网并行连接,从而得到丰富的高分辨率表征,输出 k(厚度) x w x h 的热度图,k是关键点个数,第 1 张图中显示了对第1个关键点的预测概率值(置信度),第1个关键点处的值会比较接近1,其他地方接近 0 ,一张特征图上的值全加起来 = 1,hrnet还输出13个关键点的置信度

图像另一边通过 CNN(resnet50) 得到特征图
对于局部特征点,把热度图视为特征图的每个像素的权值,用 热度图 x 特征图 计算全图的特征加权值,可以得到 13 个局部点特征,全局点特征 = 特征图平均池化+最大池化
利用预测每个关键点属于哪个人来制造1阶段损失函数loss1:将13个点的置信度通过softmax,全局点的置信度置为1,得到新的14个关键点置信度,分别让 14 个关键点特征分别通过一层神经网络输出所属分类,计算loss1 = 每个关键点的分类损失 * 关键点的置信度 + triplet loss
triplet loss : 取图节点的全局特征向量作为图片的代表,将batch 分为 16组,把每组的 triplet loss 加起来,针对第一组(A,P,N)的 triplet loss:
A是第0张图片,P是同属于第0张图片的人,但是与第0张图片最远(此处要计算向量特征的距离,这个不是事先给定的,是模型推测的)的图片,N是不属于第0张图片的人,但是与第0张图片最近的图片:

所以当 A与P的距离 比 A与N的距离小很多的时候,代表能把同类图片预测到一个小簇,则没损失
2、【模型定义】局部特征关系整合,实现关键点特征之间的交互,同时抑制无意义特征(有遮挡)的消息传递,即去掉遮蔽点的影响
定义有向带权图:图有14个点,假定索引是0-13,13是全局点,0是头,1和2是两个肩...其中全局点指向各个关键点,头部分的几个点互相连接,腿部分的几个点相互连接,图节点向量初始化为一阶段输出的关键点向量,边权重初始化为1,用邻接矩阵描述边
定义自适应方向图卷积(ADGC,不同于 gcn ):

上面分支是所有图节点向量,下面是全局点的图节点向量, 全局点经过repeat 变成维度相等之后,做相减再取绝对值得到每个图节点的差异特征,再用边的两个端点向量特征做差得到边的特征,该特征经过bn和全连接层映射为一个新的边权重(实际是先计算所有边的权重,再用原来的邻接矩阵A生成mask,用mask屏蔽点原来不存在的边,即图中的A->),然后得到新的邻接矩阵,即图中的方形X框,该矩阵的作用是降低遮挡点对于正常点的聚合作用,利用该矩阵左乘初始的14个图节点向量矩阵,再经过相同维度的全连接层+relu,加上经过相同维度的全连接层的初始的图节点向量矩阵,得到新的图节点向量特征(实际代码中没有图中最下面的一条线,没有concat,左上角不是Vlocal,而是Vall,左上角没有repeat)
新的图节点向量特征再通过一层自适应方向图卷积得到新的图节点向量特征,作为第三阶段的图节点向量特征
对14个图节点向量,制作2阶段损失函数 loss2 = 每个关键点的分类损失 * 关键点的置信度 + triplet loss
3、【模型定义】图匹配:根据图节点向量,计算两个图之间的相似度,判断是否都属于同一个类(人)
由于是一个batch进行计算的,假定batchsize = 16,此时得到了16张图的节点向量特征,通过 hard-negetive 方法组成 16组,每组3个样本:【A,P,N】
hard-negetive 方法:每个图片用它的全局特征向量来代表,通过余弦相似度计算两两图片之间的相似度,利用相似度来分组
第1组是【第0张图片,第2张图片(与第0张图片是同一个人但是最不像他),第11张图片(与第0张图片不是同一个人但是最像他)】
第2组是【第1张图片,第0张图片(与第1张图片是同一个人但是最不像他),第7张图片(与第1张图片不是同一个人但是最像他)】
...
第16组...
针对第一组(其他组类似):将A和P进行图匹配,假设上面是A,下面是P:
A的图节点向量(没匹配之间的A图节点向量,下面要用) 通过 fc+relu层(1个向量通过并行的2个全连接层,再加回来) 由 2048 降维到 1024维度,P图也是,AP公用同一个 fc+relu
然后A和P的图节点向量一起输入到GM中得到两个图的相似度矩阵U,其中U大小是14 * 14,(双随机矩阵,矩阵各行之和均为1,各列之和也均为1),U[i][j]:图A的 i 节点和图 P 的 j 节点之间的相似度(GM的计算公式源于 Andrei Zanfir and Cristian Sminchisescu. Deep learning of graph matching. In 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, pages 2684–2693, 2018.)
U*A图节点向量,再和P节点向量横向拼接,再向下映射到 1024 维度得到混合后的P图节点向量,它包含了P图自己 和 A中与P相关联的部分,同理得到混合后的A图节点向量
(代码没有图中右边的+)然后新的A图和新的P图再作为输入,进行第二次图匹配,得到U
U* 没匹配之间的A图节点向量+没匹配之间的P图节点向量=最终的P图节点向量
U* 没匹配之间的P图节点向量+没匹配之间的A图节点向量=最终的A图节点向量
将2个图的节点向量归一化(每个向量单位化),两张图节点向量矩阵点对点相乘,大小还是14*2048,然后展开成一个长向量,再映射到1个数,再通过sigmoid,得到 A图和P图是同一个人的概率
制作第3个lossU = U 和 单位矩阵的交叉熵
再将A和N进行图匹配,输入的还是同一个图匹配模块,最终得到 A图和N 图是同一个人的概率
制作第4个lossVer = A和P的正面交叉熵损失 + A和N的负面交叉损失
总 loss = loss1+loss2+lossU+lossVer
4、评估指标
一阶段的 准确率:将一张图的14个关键点的预测结果向量加起来作为该图的预测结果向量,再取最大值得到该图的预测的类别,一个batch里面预测对了几张图/batchsize * 100%
二阶段的 准确率:操作一样
三阶段的 验证准确率:对应两个概率,越高说明模型分辨能力越强,当batchsize=16时,对于每一组(A,P,N),将A和P(P与A同一类但最不像A)预测对了的概率(预测对了即认为是同一个人,则该组记为1,否则记为0,然后把预测对了的组数/16) 以及 将A和N(N与A不同一类但最像A)预测对了的概率(预测对了即认为是不是同一个人,则该组记为1,否则记为0,然后把预测对了的组数/16)
rank-k:将预测结果向量按照概率值降序排练,前 k 列 有1列预测对了,则预测对了,当k=1时,就是概率最高的类别就是所预测的类别,和标签值对了就预测对了
map:ap的平均,值越高则匹配的越好,下图中 2/3 表示匹配对了的第2张图片在第3个位置,如此类推



浙公网安备 33010602011771号