對(duì)于目標(biāo)檢測(cè)方向并不是特別熟悉昔榴,本文記錄一下RCNN, fast-RCNN, faster-RCNN, mask-RCNN這4篇有關(guān)目標(biāo)檢測(cè)的論文筆記和學(xué)習(xí)心得辛藻。
RCNN - Rich feature hierarchies for accurate object detection and semantic segmentation
R-CNN的意思就是Region based,主要思路就是根據(jù)一張圖像互订,提取多個(gè)region吱肌,再將每個(gè)Region輸入CNN來(lái)進(jìn)行特征的提取。因此RCNN就可以分為Region proposals, Feature extraction兩個(gè)主要部分仰禽,提取的特征就可以輸入任意一個(gè)分類(lèi)器來(lái)進(jìn)行分類(lèi)氮墨。
模型的流程圖如下:
在具體的實(shí)現(xiàn)中
- 圖像中第2步的region proposals,可以使用selective search來(lái)進(jìn)行吐葵,對(duì)于每一張圖像规揪,selective search大約提取出2000個(gè)框。
- 接著温峭,這個(gè)框所選中的圖像區(qū)域猛铅,經(jīng)過(guò)預(yù)處理(首先將框稍微擴(kuò)張使得候選框能夠包含部分context信息,也就是物體的環(huán)境信息诚镰,接著將擴(kuò)張后的圖像resize到固定大修确亍)變成一個(gè)227*227大小的圖像
- 這些227*227的region圖像輸入到CNN中祥款,最終的FC層輸出4096維的特征向量
- 分類(lèi),訓(xùn)練一個(gè)SVM用于分類(lèi)
訓(xùn)練
在訓(xùn)練的時(shí)候月杉,首先使用的是已經(jīng)訓(xùn)練好的CNN網(wǎng)絡(luò)作為特征提取器刃跛,但是由于預(yù)訓(xùn)練是在分類(lèi)數(shù)據(jù)集上,因此在應(yīng)用到檢測(cè)之前要做finetune苛萎。也就是說(shuō)桨昙,為了將用ImageNet數(shù)據(jù)集訓(xùn)練的網(wǎng)絡(luò)應(yīng)用到新的任務(wù)(檢測(cè)),新的數(shù)據(jù)集(region)上腌歉,作者將原來(lái)的CNN最后的1000類(lèi)的fc層蛙酪,更改為了層,
代表待檢測(cè)的物體的類(lèi)別數(shù)翘盖。然后桂塞,對(duì)于所有的region,如果它和ground truth的重疊率大于0.5馍驯,就認(rèn)為是正類(lèi)阁危。
對(duì)于分類(lèi)器的訓(xùn)練,作者發(fā)現(xiàn)選擇多大的IoU來(lái)區(qū)分正類(lèi)和負(fù)類(lèi)非常關(guān)鍵汰瘫。并且狂打,對(duì)于每一類(lèi),都會(huì)訓(xùn)練一個(gè)分類(lèi)器混弥。
Bounding Box Regression
框的回歸非常重要趴乡,在對(duì)每一個(gè)region proposal使用分類(lèi)器進(jìn)行打分評(píng)價(jià)之后,作者使用一個(gè)回歸器來(lái)預(yù)測(cè)一個(gè)新的框作為結(jié)果蝗拿。這個(gè)回歸器使用的特征是從CNN中提取的特征晾捏。回歸器的訓(xùn)練中蛹磺,輸入是 region proposal 的 和ground truth的
粟瞬,目標(biāo)是學(xué)習(xí)一種變換,使得region proposal通過(guò)該變換能夠接近ground truth萤捆。同時(shí)裙品,希望這種變換擁有尺度不變性,也就是說(shuō)尺度變化的話俗或,變換不會(huì)改變市怎。
如下圖所示,每一個(gè)regressor會(huì)學(xué)習(xí)一組參數(shù)辛慰,特征輸入是pool 5的特征輸出区匠,擬合的目標(biāo)是。
Fast-RCNN
Fast-RCNN 主要解決的問(wèn)題是在RCNN中對(duì)于每一個(gè)region proposal都進(jìn)行特征提取,會(huì)產(chǎn)生非常多的冗余計(jì)算驰弄,因此可以先對(duì)一張圖像進(jìn)行特征提取麻汰,再根據(jù)region proposal在相應(yīng)的特征上進(jìn)行劃分得到對(duì)應(yīng)region的特征(映射關(guān)系)。
這樣便可以實(shí)現(xiàn)共享計(jì)算提高速度戚篙,但是與SPPnets不同五鲫,SPPnets在一副圖像得到對(duì)應(yīng)的特征后,從這張圖像的特征上proposal對(duì)應(yīng)的部分岔擂,采用空間金字塔池化位喂,如下圖:
如此,對(duì)于不同輸入大小的proposal都能得到一個(gè)固定大小的特征向量乱灵。
Fast R-CNN也采用了上面的辦法塑崖,但是不同的是使用了一個(gè)RoI pooling 而不是空間金字塔池化,這就對(duì)應(yīng)了Fast R-CNN解決的另外一個(gè)問(wèn)題痛倚,就是多個(gè)階段訓(xùn)練的問(wèn)題规婆。就像在講解R-CNN的時(shí)候,R-CNN需要先使用selective search進(jìn)行region的選擇蝉稳,再finetune一個(gè)預(yù)訓(xùn)練的模型聋呢,再訓(xùn)練SVM分類(lèi)器,再進(jìn)行框的回歸颠区。而Fast-RCNN將finetune和分類(lèi)器的訓(xùn)練結(jié)合了起來(lái)。原因也非常簡(jiǎn)單通铲,因此Fast R-CNN采用的RoI pooling是可以進(jìn)行反向傳播的毕莱,也就是可以求導(dǎo)的。
求導(dǎo)公式如下:
直觀上講颅夺,就是對(duì)于輸入的
RoI pooling層
RoI pooling的方法很簡(jiǎn)單廓八,類(lèi)似于空間金字塔pooling,它將proposal部分對(duì)應(yīng)卷積層輸出的特征(稱(chēng)之為RoI赵抢,因?yàn)橛糜谧鰌ooling的特征是 region of interest剧蹂,也就是我們感興趣的區(qū)域)劃分成塊,然后對(duì)每一塊求最大值烦却,最終得到了一個(gè)
的特征圖宠叼。可以看出其爵,它只是空間金字塔pooling的一部分冒冬。
但是SPP-nets的空間金字塔也是可以求導(dǎo)的伸蚯,那么它到底不好在哪里呢?因?yàn)楫?dāng)每一個(gè)RoI都可能來(lái)源于不同的圖像的時(shí)候(R-CNN和SPPnets的訓(xùn)練策略是從一個(gè)batch的不同圖像中简烤,分別挑選一個(gè)proposal region)剂邮,SPPNets的訓(xùn)練非常地低效,這種低效來(lái)源于在SPPnets的訓(xùn)練中乐埠,每個(gè)RoI的感受野都非常地大抗斤,很可能對(duì)應(yīng)了原圖的整個(gè)圖像,因此丈咐,得到的特征也幾乎對(duì)應(yīng)了整張圖像瑞眼,所以輸入的圖像也就很大。
為了提高效率棵逊,F(xiàn)ast-RCNN首先選取個(gè)圖像伤疙,再?gòu)拿總€(gè)圖像上選擇
個(gè)RoI,這樣的效率就比從每個(gè)圖像提取一個(gè)RoI提高了
倍辆影。
多任務(wù) loss
為了將分類(lèi)和框回歸結(jié)合起來(lái)徒像,作者采用了多任務(wù)的loss,來(lái)進(jìn)行聯(lián)合的訓(xùn)練蛙讥。具體來(lái)說(shuō)就是將分類(lèi)的loss和框回歸的loss結(jié)合起來(lái)锯蛀。網(wǎng)絡(luò)的設(shè)計(jì)上非常直接,就是將RoI得到的特征接幾個(gè)FC層后次慢,分別接不同的輸出層旁涤。對(duì)應(yīng)于分類(lèi)部分,特征會(huì)接一個(gè)softmax輸出迫像,用于分類(lèi)劈愚,對(duì)于框回歸部分,會(huì)接一個(gè)輸出4維特征的輸出層闻妓,然后分別計(jì)算loss菌羽,用于反向傳播。loss的公式如下:
回歸的target可以參考前面的R-CNN部分由缆。
notes
- 尺度不變的檢測(cè)注祖。
- 在進(jìn)行預(yù)測(cè)的時(shí)候,還可以通過(guò)SVD來(lái)簡(jiǎn)化FC的運(yùn)算來(lái)加快速度均唉。
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
為什么比f(wàn)ast還fast呢氓轰?主要原因是在這篇論文中提出了一個(gè)新的層:RPN(region proposal networks)用于替代之前的selective search。這個(gè)層還可以在GPU上運(yùn)算來(lái)提高速度浸卦。
RPN的目的:
- 有效地進(jìn)行region proposal署鸡,在不同的大小,不同的尺度,不同的比例下
- 支持反向傳播
- 支持在GPU上運(yùn)算
-
能夠和Fast R-CNN結(jié)合起來(lái)運(yùn)算
如下圖:
faster rcnn結(jié)構(gòu)
Region Proposal Networks
為了能夠進(jìn)行region proposal靴庆,作者使用了一個(gè)小的網(wǎng)絡(luò)时捌,在基礎(chǔ)的卷積層輸出的特征上進(jìn)行滑動(dòng),這個(gè)網(wǎng)絡(luò)輸入大小為炉抒,輸入后會(huì)映射(用
的卷積)為一個(gè)固定長(zhǎng)度的特征向量奢讨,然后接兩個(gè)并聯(lián)的fc層(用
的卷積層代替),這兩個(gè)fc層焰薄,一個(gè)為box-regressoin拿诸,一個(gè)為box-classification。如下圖:
在每一個(gè)滑動(dòng)窗口(可以參考https://blog.csdn.net/bingochenjx/article/details/78422290)塞茅,為了考慮到盡可能多的框的情況亩码,作者設(shè)計(jì)了anchors來(lái)作為region proposal。anchors就是對(duì)于每一個(gè)滑動(dòng)窗口的中心位置野瘦,在該位置對(duì)應(yīng)的原圖位置的基礎(chǔ)上描沟,按照不同的尺度,長(zhǎng)寬比例框出個(gè)不同的區(qū)域鞭光。然后根據(jù)這些anchors對(duì)應(yīng)的原始圖像位置以及區(qū)域吏廉,和ground truth,就可以給每一個(gè)滑動(dòng)窗口的每一個(gè)anchor進(jìn)行標(biāo)記惰许,也就是賦予label席覆,滿(mǎn)足一定條件標(biāo)記為正類(lèi)(比如和ground truth重疊大于一個(gè)值),一定條件為負(fù)類(lèi)汹买。對(duì)于正類(lèi)娜睛,就可以根據(jù)ground truth和該anchor對(duì)應(yīng)的原圖的區(qū)域之間的變換關(guān)系(參考前面的R-CNN的框回歸),得到回歸器中的目標(biāo)卦睹,用于訓(xùn)練。也就是論文中的loss function部分:
自然地方库,也就要求RPN的兩個(gè)并聯(lián)的FC層一個(gè)輸出2k個(gè)值用于表示這k個(gè)anchor對(duì)應(yīng)的區(qū)域的正類(lèi)结序,負(fù)類(lèi)的概率,另一個(gè)輸出4k個(gè)值纵潦,用于表示框回歸的變換的預(yù)測(cè)值徐鹤。
訓(xùn)練RPN和Fast R-CNN
對(duì)于整個(gè)網(wǎng)絡(luò)的訓(xùn)練,作者采用了一種叫做4-step Alternating Training的方法邀层。具體可以參考論文返敬。
Mask R-CNN
與之前的檢測(cè)任務(wù)稍有不同,mask r-cnn的任務(wù)是做instance segmentation寥院。因此劲赠,它需要對(duì)每一個(gè)像素點(diǎn)進(jìn)行分類(lèi)。
與Faster R-CNN不同,F(xiàn)aster R-CNN對(duì)每一個(gè)候選框產(chǎn)生兩個(gè)輸出凛澎,一個(gè)是類(lèi)別霹肝,一個(gè)是bounding box的offset。Mask R-CNN新增加了一個(gè)輸出塑煎,作為物體的mask沫换。這個(gè)mask類(lèi)似于ps中的蒙版。
與Faster R-CNN類(lèi)似的是最铁,Mask R-CNN同樣采用RPN來(lái)進(jìn)行Region Proposal讯赏。但是在之后,對(duì)于每一個(gè)RoI冷尉,mask r-cnn還輸出了一個(gè)二值化的mask漱挎。
Mask Representation
不像類(lèi)別,框回歸网严,輸出都可以是一個(gè)向量识樱,mask必須保持一定的空間信息。因此震束,作者采用FCN來(lái)從每個(gè)RoI中預(yù)測(cè)一個(gè)的mask怜庸。
RoIAlign
由于屬于像素級(jí)別的預(yù)測(cè)問(wèn)題,就需要RoI能夠在進(jìn)行特征提取的時(shí)候保持住空間信息垢村,至少在像素級(jí)別上能夠?qū)?yīng)起來(lái)割疾。因此,傳統(tǒng)的取最大值的方法就顯得不合適嘉栓。
RoI Pooling宏榕,經(jīng)歷了兩個(gè)量化的過(guò)程:
第一個(gè):從roi proposal到feature map的映射過(guò)程。
第二個(gè):從feature map劃分成7*7的bin侵佃,每個(gè)bin使用max pooling麻昼。
為此,作者使用了RoIAlign馋辈。如下圖
為了避免上面提到的量化過(guò)程
- 使用 x/16 而不是int(x/16)抚芦,也就是說(shuō)在進(jìn)行roi proposal到feature map的映射過(guò)程中,不進(jìn)行四舍五入迈螟。
- 對(duì)于每一個(gè)bin(也就是一個(gè)pooling之后的特征 對(duì)應(yīng)的feature map的區(qū)域)使用bilinear interpolation來(lái)計(jì)算叉抡,之后使用max或者average pool。
可以參考https://blog.csdn.net/xiamentingtao/article/details/78598511
模型結(jié)構(gòu)
作者使用ResNet作為基礎(chǔ)的特征提取的網(wǎng)絡(luò)答毫。
對(duì)于預(yù)測(cè)類(lèi)別褥民,回歸框,mask的網(wǎng)絡(luò)使用如下圖結(jié)構(gòu):
總結(jié)
整體看完這幾篇大佬的論文洗搂,雖說(shuō)沒(méi)有弄清楚每一個(gè)實(shí)現(xiàn)細(xì)節(jié)消返,但是大體上了解了算法的思路载弄。可以看出侦副,出發(fā)點(diǎn)都源于深度神經(jīng)網(wǎng)絡(luò)在特征提取上的卓越能力侦锯,因此一眾大神試圖將這種能力應(yīng)用在檢測(cè)問(wèn)題中。從R-CNN中簡(jiǎn)單地用于特征提取秦驯,到為了提高速度減少計(jì)算的Fast R-CNN尺碰,再到為了將region proposal集成進(jìn)入整個(gè)模型中,并且利用GPU加速的RPN译隘,也就是Faster R-CNN亲桥。再到為了應(yīng)用于instance segmentation任務(wù)中,設(shè)計(jì)的RoIAlign和mask固耘。包括bounding box regression题篷,pooling層的設(shè)計(jì),訓(xùn)練方法的選擇厅目,loss的設(shè)計(jì)等等細(xì)節(jié)番枚,無(wú)一不體現(xiàn)了大師們的思考和創(chuàng)造力。
可能在我們這些“拿來(lái)”者的眼中损敷,這些方法都顯得“理所應(yīng)當(dāng)”和巧妙葫笼,好用,但是拗馒,它們背后隱藏的選擇和這些選擇的思考卻更值得我們學(xué)習(xí)路星。
以及,對(duì)待每一個(gè)問(wèn)題诱桂,如何設(shè)計(jì)出合理的解決方案洋丐,以及方案的效率辆雾,通用性谭溉,更是應(yīng)該我們努力的方向。