硬核圖解:YOLACT 解析
大家好,我是 Jack。
近年來(lái)的實(shí)例分割可以分為兩類:
一類是 two-stage 的方法,即“先檢測(cè)后分割”的方法,首先定位到目標(biāo)物體的邊框,然后在邊框內(nèi)分割目標(biāo)物體,典型的代表是 Mask R-CNN;
另一類是 one-stage 的方法,這里面又細(xì)分為兩個(gè)流派,一個(gè)是 anchor-based,另一個(gè)是 anchor-free。
今天個(gè)給大家講解一個(gè),基于 anchor-base 的實(shí)力分割算法 YOLACT。
一、論文簡(jiǎn)介
YOLACT: Real-time Instance Segmentation
1、簡(jiǎn)介
論文針對(duì)實(shí)例分割任務(wù)提出了一種簡(jiǎn)單,全卷積模型; 這個(gè)模型在COCO數(shù)據(jù)集用一塊Titan Xp完成了29.8mAP和33.5fps的實(shí)時(shí)分割效果; 將任務(wù)分為兩個(gè)平行的子任務(wù)。產(chǎn)生prototype masks和預(yù)測(cè)mask coefficients; prototype masks
卷積層:在提取空間相關(guān)信息上效果顯著。mask coefficients
全連接層:在獲取語(yǔ)義向量上效果顯著。利用矩陣計(jì)算對(duì)NMS進(jìn)行加速。
2、模型結(jié)構(gòu)

Feature Backbone
此模塊主要是利用卷積神經(jīng)網(wǎng)絡(luò)做特征提取,然后將提取到的特征輸入到特征金字塔網(wǎng)絡(luò)中。Feature Pyraimd
利用此模塊獲取深度更深的特征圖,且含有多個(gè)不同尺度的特征圖。Protonet
此模塊通過卷積和上采樣獲得Prototypes,Prototypes是多張mask的,mask中的亮(值大)的區(qū)域就是目標(biāo)區(qū)域。最終通過線性組合生成的mask來(lái)獲取每個(gè)實(shí)例的mask。Prediction Head
本文在RetinaNet的基礎(chǔ)上多回歸了一個(gè)mask系數(shù),輸出預(yù)測(cè)框Bbox,類別信息conf以及掩碼系數(shù)。利用此系數(shù)與Protonet中的mask線性組合。Yolact利用特征金字塔中的特征圖(5個(gè)尺度)每個(gè)特征圖的每個(gè)點(diǎn)都生成3個(gè)目標(biāo)框NMS 由于目標(biāo)框數(shù)量較多,利用非極大抑制進(jìn)行目標(biāo)框篩選。
Masks Assembly
利用Prediction Head模塊的mask系數(shù)與Protonet中的多張mask進(jìn)行線性組合,每個(gè)目標(biāo)得到一張mask。Crop&Threshold
利用Prediction Head中未被過濾掉目標(biāo)的預(yù)測(cè)框Bbox以及類別信息對(duì)Masks Assembly中輸出的mask進(jìn)行截取Crop操作,再經(jīng)閾值處理得到最終的mask。
二、COCO數(shù)據(jù)集解析
COCO的官網(wǎng) : https://cocodataset.org/
COCO API : https://github.com/cocodataset/cocoapi
1、簡(jiǎn)介
圖像包括91類目標(biāo), 328,000影像和2,500,000個(gè)label。目前為止有語(yǔ)義分割的最大數(shù)據(jù)集,提供的類別有80 類, 有超過33 萬(wàn)張圖片,其中20 萬(wàn)張有標(biāo)注,整個(gè)數(shù)據(jù)集中個(gè)體的數(shù)目超過150 萬(wàn)個(gè)。

2、 pycocotools工具
COCO官方給的數(shù)據(jù)集解析工具
三、FPN
原文:feature pyramid networks for object detection
1、特征金字塔

圖像金字塔(圖像處理) 將圖像做成不同的scale -> 測(cè)試增強(qiáng)(TTA) 基礎(chǔ)CNN結(jié)構(gòu)(單層特征圖) 可做分類器 多尺度特征融合 從不同層抽取不同尺度特征做預(yù)測(cè) --> SSD(single shot detector) 特征金字塔網(wǎng)絡(luò) 與3相比,增加了通過高層特征進(jìn)行上采樣和底層特征進(jìn)行自頂向下的連接,然后再預(yù)測(cè),大幅提升了對(duì)小物體的檢測(cè)效果 --> Retinanet
2、組成
backbone(以resnet為例):

輸入:batchsize,3,550,550
conv1 -> batchsize,64,275,275
c2:-> batchsize,64,138,138 -> batchsize,256,138,138
c3:->batchsize,128,69,69 -> batchsize,512,69,69
c4:->batchsize,256,35,35 -> batchsize,1024,35,35
c5:->batchsize,512,18,18 -> batchsize,2048,18,18
FPN:
上采樣:雙線性插值 下采樣:卷積(步長(zhǎng)為2) p7(256,5,5) :通過p6下采樣
p6(256,9,9) :通過p5下采樣
p5(256,18,18) : c5通過兩次卷積通道數(shù)變?yōu)?56
p4(256,35,35) : c4通過兩次卷積通道數(shù)變?yōu)?56 + c5上采樣
p3(256,69,69) : c3通過兩次卷積通道數(shù)變?yōu)?56 + c4上采樣

四、Prototype
protonet:預(yù)測(cè)k個(gè)prototype masks(通過FCN生成k個(gè)通道的)如下圖protonet:

越深的backbone features獲得更魯棒的masks。->利用特征金字塔網(wǎng)絡(luò)(FPN)作為backbone 高分辨率的prototypes結(jié)果有更好的masks且在較小的對(duì)象上表現(xiàn)出更好的性能。->上采樣到原圖的1/4增高分辨率 此處用FPN的p3作為protonet輸入通過卷積和雙線性插值獲得一個(gè)mask熱度圖(bs, 138, 138, 32)
五、mask coefficients
1、Head Architecture

FPN得到了5種不同尺度的特征圖,分別預(yù)測(cè)dict_keys(['loc', 'conf', 'mask', 'priors'])
'loc':每個(gè)anchorbox的預(yù)測(cè)偏移量,形狀為(1,19248,)
'conf':每個(gè)anchorbox的類別預(yù)測(cè),形狀為(1,19248,num_class)
'mask':就是論文中指出的mask系數(shù),形狀為(1,9248,2)
'priors':預(yù)設(shè)的anchorbox的坐標(biāo),形狀為(19248,4)
2、fast_NMS
非極大抑制

利用conf降序排序(移除conf太小且IoU太大的檢測(cè)框)
fast_NMS:利用矩陣進(jìn)行加速
六、Masks Assembly
線性組合protonet -> 每個(gè)目標(biāo)(item)都有mask(熱圖形式), confident(包含類別信息和概率), bbox(通過loc和priors獲得

然后根據(jù)回歸出的檢測(cè)框(bbox)對(duì)mask進(jìn)行截取,根據(jù)所在目標(biāo)框的mask進(jìn)行閾值處理轉(zhuǎn)化為掩碼形式(是,否)。

推薦閱讀
?? ?給大學(xué)弟妹們的億點(diǎn)建議?? ?為藝術(shù)而生的超強(qiáng)算法????我的三年北漂,晉升路
