【HRNet理论】
计算机视觉领域有很多任务是位置敏感的,比如目标检测、语义分割、实例分割等等。为了这些任务位置信息更加精准,就是维持高分辨率的feature map,通过下采样得到强语义信息,然后再上采样恢复高分辨率恢复位置信息(如下图所示),但是会导致大量的有效信息在不断的上下采样过程中丢失。而HRNet通过并行多个分辨率的分支,加上不断进行不同分支之间的信息交互,同时达到强语义信息和精准位置信息的目的。
(a)对称结构。如U-Net、Hourglass等,都是先下采样再上采样,上下采样过程对称。
(b)级联金字塔。如refinenet等,高低分辨率融合时经过卷积处理。
(c)简单的baseline,用转职卷积进行上采样。
(d)扩张卷积。如deeplab等,增大感受野,减少下采样次数,可以无需跳层连接直接进行上采样。
(b)(c)都是使用复杂一些的网络进行下采样(如resnet、vgg),再用轻量级的网络进行上采样。
HRNet V1是在(b)的基础上进行改进,从头到尾保持大的分辨率表示。然而HRNet V1仅是用在姿态估计领域的,HRNet V2对它做小小的改进可以使其适用于更广的视觉任务。这一改进仅仅增加了较小的计算开销,但却提升了较大的准确度。
【HRNet网络结构】
不同分支的信息交互属于很老套的思路(如FPN等),最大的创新点还是能够从头到尾保持高分辨率,而不同分支的信息交互是为了补充通道数减少带来的信息损耗,这种网络架构设计对于位置敏感的任务会有奇效。
【HRNet结构细节】
将HRNet整个backbone部分进行了拆解,分成4个stage,每个stage分成蓝色框和橙色框两部分。其中蓝色框部分是每个stage的基本结构,由多个branch组成,HRNet中stage1蓝色框使用的是BottleNeck,stage2&3&4蓝色框使用的是BasicBlock。其中橙色框部分是每个stage的过渡结构,HRNet中stage1橙色框是一个TransitionLayer,stage2&3橙色框是一个FuseLayer和一个TransitionLayer的叠加,stage4橙色框是一个FuseLayer。
FuseLayer是用来进行不同分支的信息交互的,TransitionLayer是用来生成一个下采样两倍分支的输入feature map的,stage1橙色框显然没办法做FuseLayer,因为前一个stage只有一个分支,stage4橙色框后面接neck和head了,显然也不再需要TransitionLayer了。
整个backbone的构建流程可以总结为:make_backbone -> make_stages -> make_branches
【FuseLayer、TransitionLayer和Neck的设计
FuseLayer设计】
FuseLayer部分以绿色框为例,融合前为pre,融合后为post,静态构建一个二维矩阵,然后将pre和post对应连接的操作一一填入这个二维矩阵中。
以上图为例,图1的pre1和post1的操作为空,pre2和post1的操作为2倍上采,pre3和post1的操作为4倍上采;图2的pre1和post2的操作为3x3卷积下采,pre2和post2的操作为空,pre3和post2的操作为2倍上采;图3的pre1和post3的操作为连续两个3x3卷积下采,pre2和post3的操作为3x3卷积下采,pre3和post的操作为空。
前向计算时用一个二重循环将构建好的二维矩阵一一解开,将对应同一个post的pre转换后进行融合相加。比如post1 = f11(pre1) + f12(pre2) + f13(pre3);
TransitionLayer设计
TransitionLayer以黄色框为例,静态构建一个一维矩阵,然后将pre和post对应连接的操作一一填入这个一维矩阵中。当pre1&post1、pre2&post2、pre3&post3的通道数对应相同时,一维矩阵填入None;通道数不相同时,对应位置填入一个转换卷积。post4比较特殊,这一部分代码和图例不太一致,图例是pre1&pre2&pre3都进行下采然后进行融合相加得到post4,而代码中post4通过pre3下采得到。
Neck设计
我把HRNet所描述的make_head过程理解成make_neck(因为一般意义上将最后的fc层理解成head更为清晰,这个在很多开源code中都是这样子拆解的)。下面着重讲解一下HRNet的neck设计。
HRNet的backbone输出有四个分支,paper中给出了几种方式对输出分支进行操作。
(a)图是HRNetV1的操作方式,只使用分辨率最高的feature map。
(b)图是HRNetV2的操作方式,将所有分辨率的feature map(小的特征图进行upsample)进行concate,主要用于语义分割和面部关键点检测。
(c)图是HRNetV2p的操作方式,在HRNetV2的基础上,使用了一个特征金字塔,主要用于目标检测。
而在图像分类任务上,HRNet有另一种特殊的neck设计
HRNet的neck可以分成三个部分,IncreLayer(橙色框),DownsampLayer(蓝色框)和FinalLayer(绿色框)。对每个backbone的输出分支进行升维操作,然后按照分辨率从大到小依次进行下采样同时从上到下逐级融合相加,最后用一个1x1conv升维。
【细节】
1、BN层的momentom都设置为0.1
2、stem使用的是两层stried为2的conv3x3
3、FuseLayer的ReLU的inplace都设置为False
【Reference】
Deep High-Resolution Representation Learning for Visual Recognition (https://arxiv.org/pdf/1908.07919.pdf)
code: HRNet
博客:一文读懂HRNet - 知乎