1. 程式人生 > >YOLACT : 首個實時one-stage例項分割模型,29.8mAP/33.5fps | ICCV 2019

YOLACT : 首個實時one-stage例項分割模型,29.8mAP/33.5fps | ICCV 2019

> 論文巧妙地基於one-stage目標檢測演算法提出實時例項分割演算法YOLACT,整體的架構設計十分輕量,在速度和效果上面達到很好的trade-off。   來源:【曉飛的演算法工程筆記】 公眾號 **論文: YOLACT: Real-time Instance Segmentation** ![](https://upload-images.jianshu.io/upload_images/20428708-9981e87f52e1ecd7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * **論文地址:[https://arxiv.org/abs/1904.02689](https://arxiv.org/abs/1904.02689)** * **論文程式碼:[https://github.com/dbolya/yolact](https://github.com/dbolya/yolact)** # Introduction *** ![](https://upload-images.jianshu.io/upload_images/20428708-a43e0c59cf2f6d27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   目前的例項分割方法雖然效果都有很大的提升,但是均缺乏實時性,為此論文的提出了首個實時($>30fps$)例項分割演算法YOLACT,論文的主要貢獻如下: * 基於one-stage目標檢測演算法,提出實時例項分割演算法YOLACT,整體的架構設計十分輕量,在速度和效果上面達到很好的trade-off。 * 提出加速版NMS演算法Fast NMS,有12ms加速 # YOLACT *** ![](https://upload-images.jianshu.io/upload_images/20428708-d01b7181f7425efb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   YOLACT的主要想法是直接在one-stage目標檢測演算法中加入Mask分支,而不新增任何的RoI池化的操作,將例項分割分成兩個並行的分支: * 使用FCN來生成解析度較大的原型mask,原型mask不針對任何的例項。 * 目標檢測分支新增額外的head來預測mask因子向量,用於對原型mask進行特定例項的加權編碼。   這樣做的原理在於,mask在空間上是連續的,卷積能很好地保持這種特性,因此原型mask通過全卷積生成的,而全連線層雖然不能保持空間連貫性,但能很好地預測語義向量,於是用來生成instance-wise的mask因子向量,結合兩者進行預測,既能保持空間連貫性,也能加入語義資訊並保持one-stage的快速性。最後取目標檢測分支經過NMS後的例項,逐個將原型mask和mask因子向量相乘,再將相乘後的結果合併輸出 ### Prototype Generation ![](https://upload-images.jianshu.io/upload_images/20428708-9f5fb05c92cb793c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   原型mask分支預測$k$個mask,protonet按如圖3的FCN形式實現,最後的卷積輸出channel為$k$,protonet接在主幹網路上。整體的實現與大多數的語義分割模型類似,區別在於主幹網路使用了FPN來增加網路的深度,並且保持較大的解析度($P_3$, 原圖1/4大小)來提高小物體的識別。另外,論文發現不限制protonet的輸出是很重要的,能夠讓網路對十分確定的原型給予壓倒性的響應(比如背景),可以選擇對輸出的原型mask進行ReLU啟用或不接啟用,論文最終選擇了ReLU啟用。 ### Mask Coefficients   在經典的anchor-based目標檢測演算法中,檢測head一般有兩個分支,分別預測類別和bbox偏移。在此基礎上新增第三個用於mask因子預測的分支,每個例項預測$k$個mask因子。   為了更好地控制和豐富原型mask的融合,對mask因子進行tanh啟用,使得值更穩定且有正負,效果如圖2的分支。 ### Mask Assembly ![](https://upload-images.jianshu.io/upload_images/20428708-f5eb4ca287d98508.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   將原型mask和mask因子進行線性組合,然後對組合結果進行sigmoid啟用輸出最終的mask。$P$為$h\times w\times k$的原型mask,$C$為$n\times k$的原型因子,$n$為檢測分支NMS和分數過濾後留下的例項數。 * ##### Losses   訓練的損失函式包含3種:分類損失$L_{cls}$、box迴歸損失$L_{box}$以及mask損失$L_{mask}$,權重分別為1、1.5和6.125,分類損失和迴歸損失的計算與SSD一樣,mask損失使用pixel-wise的二元交叉熵計算$L_{mask}=BCE(M, M_{gt})$ * ##### Cropping Masks   在推理階段,使用預測的bbox在最終的mask截取出例項,再使用閾值(人工設定0.5)來過濾成二值的mask。在訓練的時候,則使用GT來擷取例項計算mask損失,$L_{mask}$會除以擷取的例項大小,這樣有助於保留原型中的小目標。 ### Emergent Behavior ![](https://upload-images.jianshu.io/upload_images/20428708-a2cc8e2fa20bf345.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   一般而言,FCN做分割都需要新增一些額外的trick來增加平移可變性,比如position-sensitive特徵圖,雖然YOLACT唯一增加平移可變形的措施是對最終的mask進行擷取輸出,但是論文發現對於中大物體不擷取輸出的效果也不錯,這代表YOLACT的原型mask學到了對不同的例項進行不同的響應,如圖5所示,適當地對原型mask進行組合就能得出例項。需要注意的是全紅的輸入圖片,其原型mask特徵是各不一樣的,這是由於每次卷積都會padding,使得邊界存在可區分性,所以主幹網路本身就存在一定的平移可變形。 ### Backbone Detector   原型mask和mask因子的預測都需要豐富的特徵,為了權衡速度和特徵豐富性,主幹網路採用類似與RetinaNet的結構,加入FPN,去掉$P_2$加入$P_6$和$P_7$,在多層中進行head預測,並用$P_3$特徵進行原型mask預測。 ![](https://upload-images.jianshu.io/upload_images/20428708-242735e71dc748be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   YOLACT head使用$P_2 \sim P_7$的特徵,anchor的大小分別對應$[24, 48, 96, 192, 384]$,每個head共享一個$3\times 3$卷積,然後再分別通過獨立的$3\times 3$卷積進行預測,比RetinaNet更輕量,如圖4。使用smooth-$L1$訓練bbox預測,使用帶背景類的softmax交叉熵訓練分類預測,OHEM正負比例為$1:3$。 # Other Improvements *** ### Fast NMS   正常的NMS會序列地按類別將bbox逐個校驗,這種效率對於5fps的演算法是足夠快的,但對於30fps的演算法將是很大的瓶頸。為此,論文提出Fast NMS來加速。   首先根據類別分數對各檢測結果進行排序,然後計算各自的IoU對,得到$c\times n\times n$的IoU矩陣$X$,$c$為類別數,$n$為bbox數量。假設與bbox的IoU高於閾值$t$的其它bbox的分數高於當前框,則去掉該bbox,計算邏輯如下: * 將矩陣$X$的下三角和對角線置為0,$X_{kij}=0, \forall k, j, i \ge j$ ![](https://upload-images.jianshu.io/upload_images/20428708-f86a558dc0735661.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * 取每列的最大值,計算如公式2,得到最大IoU值矩陣