多粒度网络(MGN)的结构设计与技术实现
云从科技多粒度网络公开介绍:
(一)多粒度网络(MGN)设计思路。
设计思想是这样子的,一开始是全局特征,把整张图片输入,我们提取它的特征,用这种特征比较 Loss 或比较图片距离。但这时我们发现有一些不显著的细节,还有出现频率比较低的特征会被忽略。比如衣服上有个 LOGO,但不是所有衣服上有 LOGO,只有部分人衣服上有 LOGO。全局特征会做特征均匀化,LOGO 的细节被忽略掉了。
我们基于局部特征也去尝试过,用关键点、人体姿态等。但这种有一些先验知识在里面,比如遮挡、姿态大范围的变化对这种方案有一些影响,效果并不是那么强。
后来我们想到全局特征跟多粒度局部特征结合在一起搞,思路比较简单,全局特征负责整体的宏观上大家共有的特征的提取,然后我们把图像切分成不同块,每一块不同粒度,它去负责不同层次或者不同级别特征的提取。
相信把全局和局部的特征结合在一起,能够有丰富的信息和细节去表征输入图片的完整情况。在观察中发现,确实是随着分割粒度的增加,模型能够学到更详细的细节信息,最终产生 MGN 的网络结构。
下面演示一下多粒度特征,演示两张图,左边第一列有 3 张图,中间这列把这3张图用二分之一上下均分,你可以看到同一个人有上半身、下半身,第三列是把人从上到下分成三块——头部、腹胸、腿部,它有 3 个粒度,每个粒度做独立的引导,使得模型尽量对每个粒度学习更多信息。
右图表示的是注意力的呈现效果,这不是基于我们模型产生的,是基于之前的算法看到的。左边是整张图在输入时网络在关注什么,整个人看着比较均匀,范围比较广一点。第三栏从上到下相当于把它切成 3 块,每一块看的时候它的关注点会更加集中一点,亮度分布不会像左边那么均匀,更关注局部的亮点,我们可以理解为网络在关注不同粒度的信息。
▌(二)多粒度网络(MGN)——网络结构
这是 MGN 的网络架构完整的图,这个网络图比较复杂,第一个,网络从结构上比较直观,从效果来讲是比较有效的,如果想复现我们的方案还是比较容易的。如果你是做深度学习其他方向的,我们这个方案也有一定的普适性,特别是关注细粒度特征时,因为我们不是只针对 ReID 做的。我们设计的结构是有一定普适性,我把它理解为“易迁移”,大家可以作为参考。
首先,输入图的尺寸是 384×128,我们用的是 Resnet50,如果在不做任何改变的情况下,它的特征图谱输出尺寸,从右下角表格可以看到,global 这个地方就相当于对 Resnet 50不做任何的改变,特征图谱输出是 12×4。
下面有一个 part-2 跟 part-3,这是在 Res4_1 的位置,本来是有一个stride 等于 2 的下采样的操作,我们把 2 改成 1,没有下采样,这个地方的尺寸就不会缩小 2,所以 part-2 跟 part-3 比 global 大一倍的尺寸,它的尺寸是 24×8。为什么要这么操作?因为我们会强制分配 part-2 跟 part-3 去学习细粒度特征,如果把特征尺寸做得大一点,相当于信息更多一点,更利于网络学到更细节的特征。
网络结构从左到右,先是两个人的图片输入,这边有 3 个模块。3 个模块的意思是表示 3 个分支共享网络,前三层这三个分支是共享的,到第四层时分成三个支路,第一个支路是 global 的分支,第二个是 part-2 的分支,第三个是 part-3 的分支。在 global 的地方有两块,右边这个方块比左边的方块大概缩小了一倍,因为做了个下采样,下面两个分支没有做下采样,所以第四层和第五层特征图是一样大小的。
接下来我们对 part-2 跟 part-3 做一个从上到下的纵向分割,part-2 在第五层特征图谱分成两块,part-3 对特征图谱从上到下分成三块。在分割完成后,我们做一个 pooling,相当于求一个最值,我们用的是 Max-pooling,得到一个 2048 的向量,这个是长条形的、横向的、黄色区域这个地方。
但是 part-2 跟 part-3 的操作跟 global 是不一样的,part-2 有两个 pooling,第一个是蓝色的,两个 part 合在一起做一个 global-pooling,我们强制 part-2 去学习细节的联合信息,part-2 有两个细的长条形,就是我们刚才引导它去学细节型的信息。淡蓝色这个地方变成小方体一样,是做降维,从 2048 维做成 256 维,这个主要方便特征计算,因为可以降维,更快更有效。我们在测试的时候会在淡蓝色的地方,小方块从上到下应该是 8 个,我们把这 8 个 256 维的特征串连一个 2048 的特征,用这个特征替代前面输入的图片。
▌(三)多粒度网络(MGN)——Loss设计
Loss 说简单也简单,说复杂也复杂也复杂,为什么?简单是因为整个模型里只用了两种Loss,是机器学习里最常见的,一个是 SoftmaxLoss 一个是 TripletLoss。复杂是因为分支比较多,包括 global 的,包括刚才 local 的分支,而且在各个分支的 Loss 设计上不是完全均等的。我们当时做了些实验和思考去想 Loss 的设计。现在这个方案,第一,从实践上证明是比较好的,第二,从理解上也是容易理解的。
首先,看一下 global 分支。上面第一块的 Loss 设计。这个地方对 2048 维做了SoftmaxLoss,对 256 维做了一个 TripletLoss,这是对 global 信息通用的方法。下面两个部分 global 的处理方式也是一样的,都是对 2048 做一个 SoftmaxLoss,对 256 维做一个 TripletLoss。中间 part-2 地方有一个全局信息,有 global 特征,做 SoftmaxLoss TripletLoss。
但是,下面两个 Local 特征看不到 TripletLoss,只用了 SoftmaxLoss,这个在文章里也有讨论,我们当时做了实验,如果对细节当和分支做 TripletLoss,效果会变差。为什么效果会变差?
一张图片分成从上到下两部分的时候,最完美的情况当然是上面部分是上半身,下面部分是下半身,但是在实际的图片中,有可能整个人都在上半部分,下半部分全是背景,这种情况用上、下部分来区分,假设下半部分都是背景,把这个背景放到 TripletLoss 三元损失里去算这个 Loss,就会使得这个模型学到莫名其妙的特征。
比如背景图是个树,另外一张图是某个人的下半身,比如一个女生的下半身是一个裙子,你让裙子跟另外图的树去算距离,无论是同类还是不同类,算出来的距离是没有任何物理意义或实际意义的。从模型的角度来讲,它属于污点数据,这个污点数据会引导整个模型崩溃掉或者学到错误信息,使得预测的时候引起错误。所以以后有同学想复现我们方法的时候要注意一下, Part-2、part-3 的 Local 特征千万不要加 TripletLoss。
▌(四)多粒度网络(MGN)——实验参数
图片展示的是一些实验参数,因为很多同学对复现我们的方案有一定兴趣,也好奇到底这个东西为什么可以做那么好。其实我们在文章里把很多参数说得非常透,大家可以按照我们的参数去尝试一下。
我们当时用的框架是 Pytorch。TripletLoss 复现是怎么选择的?我们这个 batch是选 P=16,K=4,16×4,64 张图作为 batch,是随机选择16 个人,每个人随机选择 4 张图。
然后用 SGD 去训练,我们的参数用的是 0.9。另外,我们做了weight decay,参数是万分之五。像 Market1501 是训练 80epochs,是基于 Resnet50 微调了。我们之前实验过,如果不基于 Resnet50,用随机初始化去训练的话效果很差,很感谢 Resnet50 的作者,对这个模型训练得 非常有意义。
初始学习率是百分之一,到 40 个 epoch 降为千分之一,60 个 epoch 时降为万分之一。我们评估时会对评估图片做左右翻转后提取两个特征,这两个特征求一个平均值,代表这张图片的特征。刚才有人问到我们用了什么硬件,我们用了 2 张的 TITAN 的 GPU。
在 Market1501 上训练 80 epoch的时间大概差不多是 2 小时左右,这个时间是可以接受的,一天训练得快一点可以做出 5-10 组实验。
▌(五)多粒度网络(MGN)——实验结果
我们发表成果时,这个结果是属于三个数据集上最好的。
1、Market1501。我们不做 ReRank 的时候,原始的 Rank1 是 95.7%,mAP 是 86.9%,跟刚才讲的业内比较好的 PCB 那个文章相比,我们的 Rank1 提高差不多 1.9 个点,mAP 整整提高 5.3 个点,得到非常大的提升。
2、RK。Rank1 达到 96.6%,mAP 是 94.2%。RK 是 ReRank 重新排序的简称, ReID 有一篇文章是专门讲 ReRank 技术的,不是从事 ReID 的同学对 ReRank 的技术可能有一定迷惑,大家就理解为这是某种技术,这种技术是用在测试结果重新排列的结果,它会用到测试集本身的信息。因为在现实意义中很有可能这个测试集是开放的,没有办法用到测试集信息,就没有办法做ReRank,前面那个原始的 Rank1 和 mAP 比较有用。
但是对一些已知道测试集数据分布情况下,可以用 ReRank 技术把这个指标有很大的提高,特别是 mAP,像我们方案里从 86.9% 提升到 94.2%,这其中差不多 7.3% 的提升,是非常显著的。
3、DukeMTMC-reID 和 CUHKO3 这两个结果在我们公布研究成果时算是最好的,我们是4月份公布的成果,现在是 6 月份了,最近 2 个月 CEPR 对关于 ReID 的文章出了差不多 30 几篇,我们也在关注结果。现在除了我们以外最好的成果,原始 Rank1 在 93.5%-94% 之间,mAP 在83.5%-84% 之间,很少看到 mAP 超过 84% 或者 85% 的关于。
▌(六)多粒度网络(MGN)——有趣的对比实验
因为网络结构很复杂,这么复杂的事情能说得清楚吗?里面各个分支到底有没有效?我们在文章里做了几组比较有意思的实验,这里跟大家对比一下。
第一个对比,对比 MGN 跟 Resnet50,这倒数第二行,就是那个 MGN w/o TP,跟第一行对比,发现我们的多粒度网络比 Resnet50 水平,Rank1 提高了 7.8%,mAP 提高了 14.8%,整体效果是不错的。
第二个对比,因为我们的网络有三个分支,里面参数量肯定会增加,增加的幅度跟 Resnet101的水平差不多,是不是我们网络成果来自于参数增加?我们做了一组实验,第二行有一个 Resnet101,它的 rank1 是 90.4%,mAP 是 78%,这个比 Resnet50 确实好了很多,但是跟我们的工作成果有差距,说明我们的网络也不是纯粹堆参数堆出来的结果,应该是有网络设计的合理性在。
第三个对比,表格第二个大块,搞了三个分支,把这三个分支做成三个独立的网络,同时独立训练,然后把结果结合在一起,是不是效果跟我们差不多,或者比我们好?我们做了实验,最后的结果是“G P2 P3(single)”,Rank1 有 94.4%,mAP85.2%,效果也不错,但跟我们三个网络联合的网络结构比起来,还是我们的结构更合理。我们的解释是不同分支在学习的时候,会互相去督促或者互相共享有价值的信息,使得大家即使在独立运作时也会更好。
▌(七)多粒度网络(MGN)——多粒度网络效果示例
这是排序图片的呈现效果,左图是排序位置,4 个人的检索结果,前 2 个人可以看到我们的模型是很强的,无论这个人是侧身、背身还是模糊的,都能够检测出来。尤其是第 3 个人,这张图是非常模糊的,整个人是比较黑的,但是我们这个模型根据他的绿色衣服、白色包的信息,还是能够找出来,尽管在第 9 位有一个判断失误。第 4 个人用了一张背面的图,背个包去检索,可以发现结果里正脸照基本被搜出来了。
右边是我们的网络注意力模型,比较有意思的一个结果,左边是原图,右边从左到右有三列,是 global、part2、part3 的特征组,可以看到 global 的时候分布是比较均匀的,说明它没有特别看细节。
越到右边的时候,发现亮点越小,越关注在局部点上,并不是完整的整个人的识别。第 4 个人我用红圈圈出来了,这个人左胸有一个 LOGO,看 part3 右边这张图的时候,整个人只有在 LOGO 地方有一个亮点或者亮点最明显,说明我们网络在 part3 专门针对这个 LOGO 学到非常强的信息,检索结果里肯定是有这个 LOGO 的人排列位置比较靠前。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185402.html原文链接:https://javaforall.cn