【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...
??作者丨happy
審稿丨鄧富城
編輯丨極市平臺
極市導讀
?本文從HRNet與輕量化網絡ShuffleNet的組合出發,針對置換模塊存在的計算瓶頸問題,提出了一種高效條件通道加權單元替換1x1卷積,并得到了本文的Lite-HRNet,本文已被CVPR2021收錄。
Lite-HRNet
paper: https://arxiv.org/abs/2104.06403
code: https://github.com/HRNet/Lite-HRNet
本文是MSRA的研究員針對HRNet的輕量化設計,已被CVPR2021接收。從HRNet與輕量化網絡ShuffleNet的組合出發,針對置換模塊存在的計算瓶頸問題,提出了一種高效條件通道加權單元替換1x1卷積,并得到了本文的Lite-HRNet。所提Lite-HRNet在人體姿態估計方面取得了最佳的精度-速度均衡,比如在COCO數據集上,Lite-HRNet-30僅需0.7GFLOPs即可取得69.7AP指標;Lite-HRNet-30僅需0.42GFLOPs即可取得87.0 PCKh@0.5的指標。
Abstract
本文提出一種針對人體姿態估計的高效高分辨率網絡:Lite-HRNet。我們通過簡單的將ShuffleNet中的高效置換模塊嵌入到HRNet即可比主流輕量化網絡(比如MobileNet、ShuffleNet、Small HRNet)更強的性能。
我們發現:置換模塊中重度使用的卷積是其計算瓶頸。我們引入一種輕量化單元(條件通道加權)替換置換模塊中計算代價昂貴的卷積。所提通道加權的復雜度與通道數成線性關系,低于卷積的二次時間復雜度關系(比如,在與多分辨率特征方面,所提單元可以減少置換模塊總體計算量的80%)。該方案從多個并行分支的所有通道、所有分辨率學習加權值,采用該權值進行通道、分辨率之間的信息交換,補償卷積所扮演的角色。
實驗表明:在人體姿態估計應用方面,相比主流輕量化網絡,所提Lite-HR具有更強的性能;更重要的是,所提Lite-HRNet可以以相同方式輕易嵌入到語義分割任務中。
本文主要貢獻包含以下幾點:
通過簡單的將ShuffleNet中的置換模塊嵌入到HRNet即可得到性能優于其他輕量化方案的基礎版Lite-HRNet;
通過引入一種高效條件通道加權單元替換置換模塊的卷積得到本文所提改進版高效網絡Lite-HRNet;
在COCO與MPII人體姿態估計方面,所提Lite-HR取得了最佳的復雜度-精度均衡,且可以輕易的推廣到語義分割任務中。
Method
Naive Lite-HRNet
Shuffle Block 上圖a給出了ShuffleNetV2中的置換模塊示意圖,它將輸入通道拆分為兩部分:一部分經過等卷積處理,一部分不做處理,最后對前述兩部分concate結果進行通道置換。
HRNet 上圖給出了Small HRNet的網絡架構示意圖,它采用了漸進式添加高-低分辨率特征并進行不同分辨率特征的融合。
Simple Combination 我們采用置換模塊替換Small HRNet的stem部分的第二個卷積,替換所有的殘差模塊,多分辨率融合部分的卷積采用分離卷積替換,即可得到了基礎班Lite-HRNet。
Lite-HRNet
convolution is costly ?卷積在每個點進行矩陣-向量乘的計算,描述如下:
由于置換模塊中的depthwise卷積(深度卷積)不進行通道間信息交換,故它在置換模塊中扮演通道見信息交換的作用。
卷積的計算復雜度是通道數的二次關系,而深度卷積則是線性關系。在置換模塊中,兩個卷積的復雜度要比深度卷積的更高:。下表給出了卷積與深度卷積的復雜度對比。
Conditional Channel Weighting ?我們提出采用元素級加權操作替換基礎版Lite-HRNet中的卷積。對于第s分辨率分支的元素加權操作可以描述如下:
該計算單元的復雜度與通道數成線性關系,要低于卷積的復雜度。實現code如下:
class ConditionalChannelWeighting(nn.Module): def __init__(self, in_channels, stride, reduce_ratio, conv_cfg=None, norm_cfg=dict(type='BN'), with_cp=False): super().__init__() self.with_cp = with_cp self.stride = stride assert stride in [1, 2]branch_channels = [channel // 2 for channel in in_channels]self.cross_resolution_weighting = CrossResolutionWeighting( branch_channels, ratio=reduce_ratio, conv_cfg=conv_cfg, norm_cfg=norm_cfg)self.depthwise_convs = nn.ModuleList([ ConvModule( channel, channel, kernel_size=3, stride=self.stride, padding=1, groups=channel, conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=None) for channel in branch_channels ])self.spatial_weighting = nn.ModuleList([ SpatialWeighting(channels=channel, ratio=4) for channel in branch_channels ])def forward(self, x):def _inner_forward(x): x = [s.chunk(2, dim=1) for s in x] x1 = [s[0] for s in x] x2 = [s[1] for s in x]x2 = self.cross_resolution_weighting(x2) x2 = [dw(s) for s, dw in zip(x2, self.depthwise_convs)] x2 = [sw(s) for s, sw in zip(x2, self.spatial_weighting)]out = [torch.cat([s1, s2], dim=1) for s1, s2 in zip(x1, x2)] out = [channel_shuffle(s, 2) for s in out]return outif self.with_cp and x.requires_grad: out = cp.checkpoint(_inner_forward, x) else: out = _inner_forward(x)return outCross-resolution weight computation ?考慮到第s階段有s個并行分辨率,我們需要計算s個權值圖。我們采用輕量函數對不同分辨率的所有通道計算權值圖:
我們通過如下方式實現輕量函數:在上先進行自適應均值池化得到,AAP可以將任意輸入尺寸池化到給定輸出尺寸;我們將上述所得拼接得到,并經由卷積、ReLU、卷積、Sigmoid生成不同分辨率的加權圖。
在這里,每個分辨率每個位置的加權值依賴于均值池化后多分辨率特征同位置的通道特征。這就是為什么我們將該機制稱之為跨分辨率權值計算的原因。上采樣到對應的分辨率得到用于后續的元素級加權。
這里所提的元素級加權圖將起著跨分辨率、通道信息交換的作用。每個位置的加權向量從所有輸入接受信息,并與原始的通道進行加權, 描述如下:
換句話說,通道加權機制起著與卷積相同的作用:信息交換。另一方面,函數在是小分辨率上實現的,故而其計算復雜度非常小。實現code如下:
class CrossResolutionWeighting(nn.Module): def __init__(self, channels, ratio=16, conv_cfg=None, norm_cfg=None, act_cfg=(dict(type='ReLU'),dict(type='Sigmoid'))): super().__init__() if isinstance(act_cfg, dict): act_cfg = (act_cfg, act_cfg) assert len(act_cfg) == 2 assert mmcv.is_tuple_of(act_cfg, dict) self.channels = channels total_channel = sum(channels) self.conv1 = ConvModule( in_channels=total_channel, out_channels=int(total_channel / ratio), kernel_size=1, stride=1, conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg[0]) self.conv2 = ConvModule( in_channels=int(total_channel / ratio), out_channels=total_channel, kernel_size=1, stride=1, conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg[1])def forward(self, x): mini_size = x[-1].size()[-2:] out = [F.adaptive_avg_pool2d(s, mini_size) for s in x[:-1]] + [x[-1]] out = torch.cat(out, dim=1) out = self.conv1(out) out = self.conv2(out) out = torch.split(out, self.channels, dim=1) out = [ s * F.interpolate(a, size=s.size()[-2:], mode='nearest') for s, a in zip(x, out) ] return outSpatial weight computation ?對于每個分辨率,我們同時還計算了空域加權,計算方式如下:
函數包含(其實就是一個SE,見下面的code)。此時的特征加權方式將調整為:
class SpatialWeighting(nn.Module):def __init__(self, channels, ratio=16, conv_cfg=None, act_cfg=(dict(type='ReLU'),dict(type='Sigmoid'))): super().__init__() if isinstance(act_cfg, dict): act_cfg = (act_cfg, act_cfg) assert len(act_cfg) == 2 assert mmcv.is_tuple_of(act_cfg, dict) self.global_avgpool = nn.AdaptiveAvgPool2d(1) self.conv1 = ConvModule( in_channels=channels, out_channels=int(channels / ratio), kernel_size=1, stride=1, conv_cfg=conv_cfg, act_cfg=act_cfg[0]) self.conv2 = ConvModule( in_channels=int(channels / ratio), out_channels=channels, kernel_size=1, stride=1, conv_cfg=conv_cfg, act_cfg=act_cfg[1])def forward(self, x): out = self.global_avgpool(x) out = self.conv1(out) out = self.conv2(out) return x * outInstantiation ?Lite-HRNet包含高分辨率Stem和主體兩部分,stem由一個stride=2的卷積+置換模塊構成;主體部分由一些列模塊化的單元構成,每個單元包含兩個條件通道加權模塊與一個多分辨率融合,每個分辨率對應特征的通道維度為。Lite-HRNet的架構信息見下表。
Connection ?本文所提條件加權機制具有與CondConv、動態濾波器、SE等相似的思想:數據自適應性。區別在于:CondConv、動態濾波器以及SE采用自網絡學習卷積核或者混合權值并提升模型的容量;而本文方法則探索了額外的作用:采用所學習到的權值對不同分辨率、不同通道見的信息交換進行橋接。它可以用于替換輕量化網絡中的耗時的卷積,除此之外,我們還引入了多分辨率信息提升加權學習。
Experiments
我們在COCO與MPII數據集上對所提方法的性能進行了評估,參照主流top-down框架,我們直接估計K個熱圖。
Dataset COCO具有200K圖像,250K具有17個關鍵點的人體示例。我們在train2017數據集(包含57K圖像,150K人體示例)上進行訓練,在val2017與test-dev2017數據集上驗證;MPII包含25K個全身姿態標注的圖像,超40K人體示例,其中12K用于測試,其他用于訓練。
Training ?人體檢測框擴展為比例后裁剪,COCO數據的圖像縮放到或者;MPII數據的圖像縮放到。此外每個圖像還會進行一系列的數據增廣:隨機旋轉、隨機縮放、隨機鏡像等。
Testing 對于COCO數據,我們采用雙階段的top-down框架:即先檢測再預測;對于MPII數據,我們采用標準的測試策略(預提供人體框)。
Evaluation 我們采用基于OKS的mAP對COCO進行度量:;對于MPII,我們采用標準度量PCKH@0.5進行性能評估。
上圖給出了COCO驗證集上的性能對比,從中可以看到:
輸入為條件下,Lite-HRNet-30取得了67.2AP指標,優于其他輕量化方案。
相比MobileNetV2,性能提升2.6AP,且僅需20%GFLOOs與參數量;
相比ShuffleNetV2,Lite-HRNet-18與Lite-HRNet-30分別獲得了4.9與7.3指標提升,同時具有更低的計算量;
相比Small HRNet-W16,Lite-HRNet指標提升超10AP;
相比大網絡(比如Hourglass、CPN),所提方法可以取得相當的AP指標且具有極低復雜度。
輸入為條件下,Lite-HRNet-18與Lite-HRNet-30分別取得了67.6與70.4AP指標;
受益于所提高效條件通道加權模塊,Lite-HRNet取得了更佳的精度-計算復雜度均衡,可參考下圖。
上表給出了COCO-test-dev數據集上的性能對比,可以看到:
Lite-HRNet-30取得了69.7AP指標,顯著優于其他輕量網絡,同時具有更低FLOPs和參數量;
Lite-HRNet-30取得了優于Mask-RCNN、G_RMI、IPR等大網絡的性能;
盡管相比其他大網絡,所提方法仍存在性能差異,但所提方法具有超低的GFLOPs與參數量。
上表給出了MPII驗證集上的性能對比,可以看到:
相比MobileNet2、MobileNetV3、ShuffleNetV2、Small HRNet等輕量化模型,所提Lite-HRNet-18取得了更高的精度,同時具有更低的計算復雜度;
繼續提升模型大小可以進一步提升模型的精度,比如Lite-HRNet-30取得了87.0 PCKh@0.5的指標。
最后,我們再看一下所提方法遷移到語義分割任務上的效果,見上表。可以看到:
Lite-HRNet-18以1.95GFLOPs計算量取得72.8%的mIoU指標;
Lite-HRNet-30以3.02GFLOPs計算量取得了75.3%的mIoU指標。
所提方法優于手工設計網絡(如ICNet、BiSeNet、DFANet等)與NAS網絡(比如CAS、GAS、FasterSeg等),同時與SwiftNetRN-18性能相當,但具有更低的計算量(3.02 vs 104)。
全文到此結束,更多消融實驗與分析建議查看原文。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7系统应用程序安装不了的解决教程
- 下一篇: 【机器学习基础】机器学习模型评估教程!