概述 Overview
在深度學(xué)習(xí)正式介入之前校坑,傳統(tǒng)的「目標(biāo)檢測」方法都是 區(qū)域選擇
穷遂、提取特征(顏色函匕,紋理等)
、分類回歸
三部曲蚪黑,這樣就有兩個(gè)難以解決的問題盅惜;其一是區(qū)域選擇的策略效果差中剩、時(shí)間復(fù)雜度高;其二是手工提取的特征魯棒性較差抒寂。
云計(jì)算時(shí)代來臨后结啼,「目標(biāo)檢測」算法大家族主要?jiǎng)澐譃閮纱笈上担粋€(gè)是 R-CNN
系兩刀流屈芜,另一個(gè)則是以 YOLO
為代表的一刀流派郊愧。下面分別解釋一下 兩刀流
和 一刀流
。
兩刀流
顧名思義井佑,兩刀解決問題:
1属铁、生成可能區(qū)域(Region Proposal) & CNN 提取特征
2、放入分類器分類并修正位置
這一流派的算法都離不開 Region Proposal
毅糟,即是優(yōu)點(diǎn)也是缺點(diǎn)红选,主要代表人物就是 R-CNN
系。
一刀流
顧名思義姆另,一刀解決問題喇肋,直接對預(yù)測的目標(biāo)物體進(jìn)行回歸。
回歸解決問題簡單快速迹辐,但是太粗暴了蝶防,主要代表人物是 YOLO
和 SSD
。
無論 兩刀流
還是 一刀流
明吩,他們都是在同一個(gè)天平下選取一個(gè)平衡點(diǎn)间学、或者選取一個(gè)極端——要么準(zhǔn),要么快印荔。
兩刀流的天平主要傾向準(zhǔn)低葫,
一刀流的天平主要傾向快。
但最后萬劍歸宗仍律,大家也找到了自己的平衡嘿悬,平衡點(diǎn)的有略微的不同。
接下來我們花開兩朵各表一支水泉,一朵 兩刀流
的前世今生善涨,另一朵 一刀流
的發(fā)展歷史。
一草则、兩刀流 R-CNN
R-CNN 其實(shí)是一個(gè)很大的家族钢拧,自從 rbg 大神發(fā)表那篇論文,子孫無數(shù)炕横、桃李滿天下源内。在此,我們只探討 R-CNN 直系親屬份殿,他們的發(fā)展順序如下:
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
其實(shí)說句良心話膜钓,最佩服的并不是 rbg 大神塔鳍,而是提出了 SPP Net 的以何愷明為主的作者們。
他們在整個(gè)家族進(jìn)化的過程中呻此,一致暗埋了一條主線:充分榨干 feature maps 的價(jià)值轮纫。
1.1 R-CNN / 2013
論文:Rich feature hierarchies for accurate object detection and semantic segmentation
這篇論文,這個(gè)模型焚鲜,是利用卷積神經(jīng)網(wǎng)絡(luò)來做「目標(biāo)檢測」的開山之作掌唾,其意義深遠(yuǎn)不言而喻。
1.1.1核心貢獻(xiàn)
一忿磅、速度
傳統(tǒng)的區(qū)域選擇使用滑窗糯彬,每滑一個(gè)窗口檢測一次,相鄰窗口信息重疊高葱她,檢測速度慢撩扒。R-CNN 使用一個(gè)啟發(fā)式方法(Selective search),先生成候選區(qū)域(使用選擇性搜索)再檢測吨些,降低信息冗余程度搓谆,從而提高檢測速度。
二豪墅、特征提取
傳統(tǒng)的手工提取特征魯棒性差泉手,限于如顏色、紋理等 低層次
(Low level)的特征偶器。使用 CNN (卷積神經(jīng)網(wǎng)絡(luò))提取特征斩萌,可以提取更高層面的抽象特征骗炉,從而提高特征的魯棒性洋闽。
選擇性搜索主要思想
論文:Selective Search for Object Recognition
組成目標(biāo)物體通常有四個(gè)要素:變化尺度、顏色他炊、結(jié)構(gòu)(材質(zhì))霎苗、所占面積姆吭。選擇性搜索會(huì)確定物體在圖片中的這些特征,然后基于這些特征突出不同區(qū)域叨粘。下面是選擇搜索的一個(gè)簡單案例:
- 首先將一張圖片作為輸入:
-
之后猾编,它會(huì)生成最初的sub-分割瘤睹,將圖片分成多個(gè)區(qū)域:
查看現(xiàn)有小區(qū)域升敲,按照合并規(guī)則合并可能性最高的相鄰兩個(gè)區(qū)域,重復(fù)這種操作:
- 最后轰传,生成最終的目標(biāo)物體位置(Region of Interest)驴党。
1.1.2 基本流程
- 我們首先取一個(gè)預(yù)訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)CNN。
- 根據(jù)需要檢測的目標(biāo)類別數(shù)量获茬,訓(xùn)練CNN的最后一層港庄。
- 將以下圖片作為輸入:
- 之后倔既,我們會(huì)用上文中的選擇性搜索得到感興趣區(qū)域(大約1k~2k個(gè)):
- 對這些區(qū)域重新改造,以讓其符合CNN的輸入尺寸要求鹏氧,將這些區(qū)域輸入到CNN中渤涌,并經(jīng)過卷積網(wǎng)絡(luò):
- 對每個(gè)類別,我們都要訓(xùn)練一個(gè)二元SVM(判斷物體是foreground or background把还,我們檢測的目標(biāo)是foreground)实蓬。CNN為每個(gè)區(qū)域提取特征,利用SVM將這些區(qū)域分成不同類別:
- 最后吊履,我們訓(xùn)練一個(gè)線性回歸模型(bounding box regression)安皱,為每個(gè)辨識(shí)到的物體生成更精確的邊界框。:
bounding box regression原理
如圖9所示綠色框?yàn)轱w機(jī)的Ground Truth(GT)艇炎,紅色為提取的foreground anchors酌伊,即便紅色的框被分類器識(shí)別為飛機(jī),但是由于紅色的框定位不準(zhǔn)缀踪,這張圖相當(dāng)于沒有正確的檢測出飛機(jī)居砖。所以我們希望采用一種方法對紅色的框進(jìn)行微調(diào),使得foreground anchors和GT更加接近驴娃。
對于窗口一般使用四維向量 [x,y,w,h] 表示悯蝉,分別表示窗口的中心點(diǎn)坐標(biāo)和寬高。對于下圖托慨,紅色的框A代表原始的Foreground Anchors鼻由,綠色的框G代表目標(biāo)的GT,我們的目標(biāo)是尋找一種關(guān)系厚棵,使得輸入原始的anchor A經(jīng)過映射得到一個(gè)跟真實(shí)窗口G更接近的回歸窗口G'蕉世,即:
- 給定:anchor 和
- 尋找一種變換F,使得:婆硬,其中
那么經(jīng)過何種變換F才能從圖中的anchor A變?yōu)镚'呢狠轻? 比較簡單的思路就是:
-
先做平移
-
再做縮放
觀察上面4個(gè)公式發(fā)現(xiàn),需要學(xué)習(xí)的是 這四個(gè)變換彬犯。當(dāng)輸入的anchor A與GT相差較小時(shí)向楼,可以認(rèn)為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進(jìn)行微調(diào)(注意谐区,只有當(dāng)anchors A和GT比較接近時(shí)湖蜕,才能使用線性回歸模型,否則就是復(fù)雜的非線性問題了)宋列。
接下來的問題就是如何通過線性回歸獲得 了昭抒。線性回歸就是給定輸入的特征向量X, 學(xué)習(xí)一組參數(shù)W, 使得經(jīng)過線性回歸后的值跟真實(shí)值Y非常接近,即。對于該問題灭返,輸入X是cnn feature map盗迟,定義為Φ;同時(shí)還有訓(xùn)練傳入A與GT之間的變換量熙含,即罚缕。輸出是四個(gè)變換。那么目標(biāo)函數(shù)可以表示為:
其中 是對應(yīng)anchor的feature map組成的特征向量怎静, 是需要學(xué)習(xí)的參數(shù)怕磨, 是得到的預(yù)測值(*表示 x,y消约,w肠鲫,h,也就是每一個(gè)變換對應(yīng)一個(gè)上述目標(biāo)函數(shù))或粮。為了讓預(yù)測值與真實(shí)值 差距最小导饲,設(shè)計(jì)損失函數(shù):
函數(shù)優(yōu)化目標(biāo)為:
需要說明,只有在GT與需要回歸框位置比較接近時(shí)氯材,才可近似認(rèn)為上述線性變換成立渣锦。
說完原理,對應(yīng)于Faster RCNN原文氢哮,foreground anchor與ground truth之間的平移量 與尺度因子 如下:
對于訓(xùn)練bouding box regression網(wǎng)絡(luò)回歸分支袋毙,輸入是cnn feature Φ,監(jiān)督信號是Anchor與GT的差距 冗尤,即訓(xùn)練目標(biāo)是:輸入 Φ的情況下使網(wǎng)絡(luò)輸出與監(jiān)督信號盡可能接近听盖。
那么當(dāng)bouding box regression工作時(shí),再輸入Φ時(shí)裂七,回歸網(wǎng)絡(luò)分支的輸出就是每個(gè)Anchor的平移量和變換尺度 皆看,顯然即可用來修正Anchor位置了。
這就是RCNN檢測目標(biāo)物體的方法背零。
1.1.3局限
訓(xùn)練一個(gè)RCNN模型非常昂貴腰吟,并且步驟較多:
根據(jù)選擇性搜索,要對每張圖片提取2000個(gè)單獨(dú)區(qū)域徙瓶;
用CNN提取每個(gè)區(qū)域的特征毛雇。假設(shè)我們有N張圖片,那么CNN特征就是N*2000侦镇;
-
用RCNN進(jìn)行目標(biāo)檢測的整個(gè)過程有三個(gè)模型:
用于特征提取的CNN
用于目標(biāo)物體辨別的線性SVM分類器
調(diào)整邊界框的回歸模型灵疮。
這些過程合并在一起,會(huì)讓RCNN的速度變慢虽缕,通常每個(gè)新圖片需要40—50秒的時(shí)間進(jìn)行預(yù)測始藕,基本上無法處理大型數(shù)據(jù)集。
從結(jié)果上說氮趋,該方法將 PASCAL VOC
上的檢測率從 35.1% 提升到 53.7% 伍派,提高了好幾個(gè)量級。雖然比傳統(tǒng)方法好很多剩胁,但是從現(xiàn)在的眼光看诉植,只能是初窺門徑。
1.2 SPP Net / 2014
論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
R-CNN
提出后的一年昵观,以何愷明晾腔、任少卿為首的團(tuán)隊(duì)提出了 SPP Net
,這才是真正摸到了卷積神經(jīng)網(wǎng)絡(luò)的脈絡(luò)啊犬。也不奇怪灼擂,畢竟這些人鼓搗出了 ResNet
殘差網(wǎng)絡(luò),對神經(jīng)網(wǎng)絡(luò)的理解是其他人沒法比的觉至。
1.2.1 核心貢獻(xiàn)
解決了R-CNN的兩個(gè)硬傷:
-
算力冗余
先生成候選區(qū)域剔应,再對區(qū)域進(jìn)行卷積,這里有兩個(gè)問題:其一是候選區(qū)域會(huì)有一定程度的重疊语御,對相同區(qū)域進(jìn)行重復(fù)卷積峻贮;其二是每個(gè)區(qū)域進(jìn)行新的卷積需要新的存儲(chǔ)空間。何愷明等人意識(shí)到這個(gè)可以優(yōu)化应闯,于是把先生成候選區(qū)域再卷積纤控,變成了先卷積后生成區(qū)域〉锓模“簡單地”改變順序船万,不僅減少存儲(chǔ)量而且加快了訓(xùn)練速度。
圖片縮放
在R-CNN基本流程步驟5中骨田,對搜索出的感興趣區(qū)域重新改造唬涧,以讓其符合CNN的輸入尺寸要求時(shí),無論是剪裁(Crop)還是縮放(Warp)盛撑,在很大程度上會(huì)丟失圖片原有的信息導(dǎo)致訓(xùn)練效果不好碎节,如上圖所示。直觀的理解抵卫,把車剪裁成一個(gè)門狮荔,人看到這個(gè)門也不好判斷整體是一輛車;把一座高塔縮放成一個(gè)胖胖的塔介粘,人看到也沒很大把握直接下結(jié)論殖氏。人都做不到,機(jī)器的難度就可想而知了姻采。
ROI池化層
何愷明等人發(fā)現(xiàn)了這個(gè)問題雅采,于是思索有什么辦法能不對圖片進(jìn)行變形,將圖片原汁原味地輸入進(jìn)去學(xué)習(xí)。
最后婚瓜,他們發(fā)現(xiàn)問題的根源是 FC Layer
(全連接層)需要確定輸入維度宝鼓,于是他們在輸入全連接層前定義一個(gè)特殊的池化層,將輸入的任意尺度 feature maps
組合成特定維度的輸出巴刻,這個(gè)組合可以是不同大小的拼湊愚铡,如同拼湊七巧板般。這就是ROI池化層胡陪。
具體來說沥寥,
- 先將對應(yīng)的feature map區(qū)域水平分為 的網(wǎng)格;
- 對網(wǎng)格的每一份都進(jìn)行max pooling處理柠座。
這樣處理后邑雅,即使大小不同的proposal輸出結(jié)果都是 固定大小,實(shí)現(xiàn)了固定長度輸出妈经。
SPP Net
的出現(xiàn)是如同一道驚雷蒂阱,不僅減少了計(jì)算冗余,更重要的是打破了固定尺寸輸入這一束縛狂塘,讓后來者享受到這一縷陽光录煤。
1.3 Fast R-CNN / 2015
論文:Fast R-CNN
此時(shí),我們的 rbg 大哥也按耐不住了——自己家的孩子荞胡,自己養(yǎng)大——于是憋出了一個(gè)大招 Fast R-CNN
妈踊。取這個(gè)名字的意思就是“兒子比爸爸強(qiáng)”,相對于原來的 Slow R-CNN
泪漂,做了速度上的優(yōu)化——就是快廊营。
在這篇論文中,引用了 SPP Net
的工作萝勤,并且致謝其第一作者何愷明的慷慨解答露筒。
1.3.1 核心貢獻(xiàn)
想要減少RCNN算法的計(jì)算時(shí)間,可以用什么方法敌卓?我們可不可以在每張圖片上只使用一次CNN即可得到全部的重點(diǎn)關(guān)注區(qū)域呢慎式,而不是運(yùn)行2000次。
RCNN的作者提出了一種想法趟径,在每張照片上只運(yùn)行一次CNN瘪吏,然后找到一種方法在2000個(gè)區(qū)域中進(jìn)行計(jì)算。在Fast RCNN中蜗巧,我們將圖片輸入到CNN中掌眠,會(huì)相應(yīng)地生成傳統(tǒng)特征映射。利用這些映射幕屹,就能提取出感興趣區(qū)域蓝丙。之后级遭,我們使用一個(gè)Rol池化層將所有提出的區(qū)域重新修正到合適的尺寸,以輸入到完全連接的網(wǎng)絡(luò)中渺尘。
簡單地說挫鸽,這一過程含有以下步驟:
- 輸入圖片。
- 輸入到卷積網(wǎng)絡(luò)中沧烈,它生成感興趣區(qū)域掠兄。
- 利用Rol池化層對這些區(qū)域重新調(diào)整像云,將其輸入到完全連接網(wǎng)絡(luò)中锌雀。
- 在網(wǎng)絡(luò)的頂層用softmax層輸出類別。同樣使用一個(gè)線性回歸層迅诬,輸出相對應(yīng)的邊界框腋逆。
所以,和RCNN所需要的三個(gè)模型不同侈贷,F(xiàn)ast RCNN只用了一個(gè)模型就同時(shí)實(shí)現(xiàn)了區(qū)域的特征提取惩歉、分類、邊界框生成俏蛮。
另外撑蚌,原來的 R-CNN
是先對候選框區(qū)域進(jìn)行分類,判斷有沒有物體搏屑,如果有則對 Bounding Box
進(jìn)行精修 回歸
争涌。這是一個(gè)串聯(lián)式的任務(wù),那么勢必沒有并聯(lián)的快辣恋,所以 rbg 就將原有結(jié)構(gòu)改成并行——在分類的同時(shí)亮垫,對 Bbox
進(jìn)行回歸。
這一改變將 Bbox
和 Clf
的 loss
結(jié)合起來變成一個(gè) Loss
一起訓(xùn)練伟骨,并吸納了 SPP Net
的優(yōu)點(diǎn)饮潦,最終不僅加快了預(yù)測的速度,而且提高了精度携狭。
1.3.2 基本流程
-
首先继蜡,輸入圖像:
-
圖像被傳遞到卷積網(wǎng)絡(luò)中,返回感興趣區(qū)域:
- 之后逛腿,在區(qū)域上應(yīng)用Rol池化層壹瘟,保證每個(gè)區(qū)域的尺寸相同:
-
這些區(qū)域被傳遞到一個(gè)完全連接的網(wǎng)絡(luò)中進(jìn)行分類,并用softmax和線性回歸層同時(shí)返回邊界框:
1.3.3 局限
但是即使這樣鳄逾,F(xiàn)ast RCNN也有某些局限性稻轨。它同樣用的是選擇性搜索作為尋找感興趣區(qū)域的,這一過程通常較慢雕凹。與RCNN不同的是殴俱,F(xiàn)ast RCNN處理一張圖片大約需要2秒政冻。但是在大型真實(shí)數(shù)據(jù)集上,這種速度仍然不夠理想线欲。
1.4 Faster R-CNN / 2015
論文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
眾人拾柴火焰高明场,原來 SPP Net
的人馬和 rbg 一起研究憋大招,在 rbg
和 何愷明
綻放完光芒后李丰,任少卿
老哥發(fā)出了太陽般的光芒——RPN
的概念讓人不得不服苦锨。
1.4.1 核心貢獻(xiàn)
在 Faster R-CNN
前,我們生產(chǎn)候選區(qū)域都是用的一系列啟發(fā)式算法趴泌,基于 Low Level
特征生成區(qū)域舟舒。這樣就有兩個(gè)問題:
第一個(gè)問題 是生成區(qū)域的靠譜程度隨緣,而 兩刀流
算法正是依靠生成區(qū)域的靠譜程度——生成大量無效區(qū)域則會(huì)造成算力的浪費(fèi)嗜憔、少生成區(qū)域則會(huì)漏檢秃励;
第二個(gè)問題 是生成候選區(qū)域的算法是在 CPU 上運(yùn)行的,而我們的訓(xùn)練在 GPU 上面吉捶,跨結(jié)構(gòu)交互必定會(huì)有損效率夺鲜。
那么怎么解決這兩個(gè)問題呢?
于是乎呐舔,任少卿等人提出了一個(gè) Region Proposal Networks
的概念币励,利用神經(jīng)網(wǎng)絡(luò)自己學(xué)習(xí)去生成候選區(qū)域。
這種生成方法同時(shí)解決了上述的兩個(gè)問題珊拼,神經(jīng)網(wǎng)絡(luò)可以學(xué)到更加高層食呻、語義、抽象的特征杆麸,生成的候選區(qū)域的可靠程度大大提高搁进;可以從上圖看出 RPNs
和 RoI Pooling
共用前面的卷積神經(jīng)網(wǎng)絡(luò)——將 RPNs
嵌入原有網(wǎng)絡(luò),原有網(wǎng)絡(luò)和 RPNs
一起預(yù)測昔头,大大地減少了參數(shù)量和預(yù)測時(shí)間饼问。
在 RPNs
中引入了 anchor
的概念,feature map
中每個(gè)滑窗位置都會(huì)生成 k
個(gè) anchors
揭斧,然后判斷 anchor
覆蓋的圖像是前景還是背景莱革,同時(shí)回歸 Bbox
的精細(xì)位置,預(yù)測的 Bbox
更加精確讹开。
將 兩刀流
的兩刀并入同一個(gè)網(wǎng)絡(luò)盅视,這一操作足夠載入史冊了。
1.4.2 基本流程
Faster RCNN其實(shí)可以分為4個(gè)主要內(nèi)容:
- Conv layers旦万。作為一種CNN網(wǎng)絡(luò)目標(biāo)檢測方法闹击,F(xiàn)aster RCNN首先使用一組基礎(chǔ)的conv+relu+pooling層提取image的feature maps。該feature maps被共享用于后續(xù)RPN層和全連接層成艘。
- Region Proposal Networks赏半。RPN網(wǎng)絡(luò)用于生成region proposals贺归。該層通過softmax判斷anchors屬于foreground或者background,再利用bounding box regression修正anchors獲得精確的proposals断箫。
- Roi Pooling拂酣。該層收集輸入的feature maps和proposals,綜合這些信息后提取proposal feature maps仲义,送入后續(xù)全連接層判定目標(biāo)類別婶熬。
- Classification。利用proposal feature maps計(jì)算proposal的類別埃撵,同時(shí)再次bounding box regression獲得檢測框最終的精確位置赵颅。
具體來說可看下圖:VGG16模型中的faster_rcnn_test.pt的網(wǎng)絡(luò)結(jié)構(gòu)
可以清晰的看到該網(wǎng)絡(luò)對于一副任意大小PxQ的圖像,首先縮放至固定大小MxN盯另,然后將MxN圖像送入網(wǎng)絡(luò)性含;而Conv layers中包含了13個(gè)conv層+13個(gè)relu層+4個(gè)pooling層洲赵;RPN網(wǎng)絡(luò)首先經(jīng)過3x3卷積鸳惯,再分別生成foreground anchors與bounding box regression偏移量,然后計(jì)算出proposals叠萍;而Roi Pooling層則利用proposals從feature maps中提取proposal feature送入后續(xù)全連接和softmax網(wǎng)絡(luò)作classification(即分類proposal到底是什么object)芝发。
Conv layers
Conv layers包含了conv,pooling苛谷,relu三種層辅鲸。如圖2,Conv layers部分共有13個(gè)conv層腹殿,13個(gè)relu層独悴,4個(gè)pooling層。這里有一個(gè)非常容易被忽略但是又無比重要的信息锣尉,在Conv layers中:
- 所有的conv層都是:
keneral_size = 3,pad = 1,stride = 1
- 所有的pooling層都是:
keneral_size = 2,pad = 0 ,stride = 2
為何重要刻炒?在Faster RCNN Conv layers中對所有的卷積都做了擴(kuò)邊處理( pad=1,即填充一圈0)自沧,導(dǎo)致原圖變?yōu)?(M+2)x(N+2)大小坟奥,再做3x3卷積后輸出MxN 。正是這種設(shè)置拇厢,導(dǎo)致Conv layers中的conv層不改變輸入和輸出矩陣大小爱谁。如圖3:
類似的是,Conv layers中的pooling層kernel_size=2孝偎,stride=2访敌。這樣每個(gè)經(jīng)過pooling層的MxN矩陣,都會(huì)變?yōu)?M/2)x(N/2)大小衣盾。綜上所述寺旺,在整個(gè)Conv layers中荡陷,conv和relu層不改變輸入輸出大小,只有pooling層使輸出長寬都變?yōu)檩斎氲?/2迅涮。
那么废赞,一個(gè)MxN大小的矩陣經(jīng)過Conv layers固定變?yōu)?M/16)x(N/16)!這樣Conv layers生成的featuure map中都可以和原圖對應(yīng)起來叮姑。
Region Proposal Networks(RPN)
經(jīng)典的檢測方法生成檢測框都非常耗時(shí)唉地,如OpenCV adaboost使用滑動(dòng)窗口+圖像金字塔生成檢測框;或如R-CNN使用SS(Selective Search)方法生成檢測框传透。而Faster RCNN則拋棄了傳統(tǒng)的滑動(dòng)窗口和SS方法耘沼,直接使用RPN生成檢測框,這也是Faster R-CNN的巨大優(yōu)勢朱盐,能極大提升檢測框的生成速度群嗤。
上圖4展示了RPN網(wǎng)絡(luò)的具體結(jié)構(gòu)。可以看到RPN網(wǎng)絡(luò)實(shí)際分為2條線:
一路用來判斷候選框是前景還是背景宾舅,它先reshape成一維向量咱娶,softmax分類anchors獲得foreground和background(檢測目標(biāo)是foreground),然后reshape恢復(fù)為二維feature map者春。故經(jīng)過這一步之后,我們就可以舍棄背景anchors了清女。大部分的anchors都是屬于背景钱烟,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計(jì)算量嫡丙。對于經(jīng)過了3x3的卷積后得到的256個(gè)feature map拴袭,先經(jīng)過1x1的卷積,變換為18個(gè)feature map曙博。然后reshape為一維向量拥刻,經(jīng)過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數(shù)據(jù)可以進(jìn)行softmax計(jì)算羊瘩。然后輸出識(shí)別得到的前景anchors泰佳。
下面一路用于計(jì)算對于anchors的bounding box regression偏移量,以獲得精確的proposal(也就是確定候選框的位置)尘吗。
而最后的Proposal層則負(fù)責(zé)綜合foreground anchors和bounding box regression偏移量獲取proposals逝她,同時(shí)剔除太小和超出邊界的proposals。其實(shí)整個(gè)網(wǎng)絡(luò)到了Proposal Layer這里睬捶,就完成了相當(dāng)于目標(biāo)定位的功能黔宛。
關(guān)于1x1卷積
如上圖,輸入有3個(gè)通道擒贸,同時(shí)有2個(gè)卷積核臀晃。對于每個(gè)卷積核觉渴,先在輸入3個(gè)通道分別作卷積,再將3個(gè)通道結(jié)果加起來得到卷積輸出徽惋。所以對于某個(gè)卷積層案淋,無論輸入圖像有多少個(gè)通道,輸出圖像通道數(shù)總是等于卷積核數(shù)量险绘!
對多通道圖像做1x1卷積踢京,其實(shí)就是將輸入圖像于每個(gè)通道乘以卷積系數(shù)后加在一起,即相當(dāng)于把原圖像中本來各個(gè)獨(dú)立的通道“聯(lián)通”在了一起宦棺。
候選框(anchors):
所謂anchors瓣距,實(shí)際上就是一組由rpn/generate_anchors.py生成的矩形。直接運(yùn)行作者demo中的generate_anchors.py可以得到以下輸出:
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
其中每行的4個(gè)值代表矩形左上和右下角點(diǎn)坐標(biāo)代咸。9個(gè)矩形共有3種形狀蹈丸,長寬比為大約為 三種,如下圖呐芥。實(shí)際上通過anchors就引入了檢測中常用到的多尺度方法逻杖。
那么這9個(gè)anchors是做什么的呢?借用Faster RCNN論文中的原圖贩耐,如圖7弧腥,遍歷Conv layers計(jì)算獲得的feature maps厦取,為每一個(gè)點(diǎn)都配備這9種anchors作為初始的檢測框潮太。這樣做獲得檢測框很不準(zhǔn)確,不用擔(dān)心虾攻,后面還有2次bounding box regression可以修正檢測框位置铡买。
假設(shè)在conv5 feature map中每個(gè)點(diǎn)上有k個(gè)anchor(默認(rèn)k=9),而每個(gè)anhcor要分foreground和background霎箍,所以每個(gè)點(diǎn)由256d feature轉(zhuǎn)化為cls=2k scores奇钞;而每個(gè)anchor都有(x, y, w, h)對應(yīng)4個(gè)偏移量,所以reg=4k coordinates漂坏。
補(bǔ)充一點(diǎn)景埃,全部anchors拿去訓(xùn)練太多了,訓(xùn)練程序會(huì)在合適的anchors中隨機(jī)選取128個(gè)postive anchors+128個(gè)negative anchors進(jìn)行訓(xùn)練顶别。
softmax判定foreground與background
一副MxN大小的矩陣送入Faster RCNN網(wǎng)絡(luò)后谷徙,到RPN網(wǎng)絡(luò)變?yōu)?M/16)x(N/16),不妨設(shè) W=M/16驯绎,H=N/16完慧。在進(jìn)入reshape與softmax之前,先做了1x1卷積剩失,如圖9:
圖9 RPN中判定fg/bg網(wǎng)絡(luò)結(jié)構(gòu)
該1x1卷積的caffe prototxt定義如下:
layer {
name: "rpn_cls_score"
type: "Convolution"
bottom: "rpn/output"
top: "rpn_cls_score"
convolution_param {
num_output: 18 # 2(bg/fg) * 9(anchors)
kernel_size: 1 pad: 0 stride: 1
}
}
可以看到其num_output=18屈尼,也就是經(jīng)過該卷積的輸出圖像為WxHx18大小册着。這也就剛好對應(yīng)了feature maps每一個(gè)點(diǎn)都有9個(gè)anchors,同時(shí)每個(gè)anchors又有可能是foreground和background脾歧,所有這些信息都保存WxHx(9*2)大小的矩陣甲捏。為何這樣做?后面接softmax分類獲得foreground anchors鞭执,也就相當(dāng)于初步提取了檢測目標(biāo)候選區(qū)域box(一般認(rèn)為目標(biāo)在foreground anchors中)摊鸡。
那么為何要在softmax前后都接一個(gè)reshape layer?其實(shí)只是為了便于softmax分類蚕冬,至于具體原因這就要從caffe的實(shí)現(xiàn)形式說起了免猾。在caffe基本數(shù)據(jù)結(jié)構(gòu)blob中以如下形式保存數(shù)據(jù):
blob=[batch_size, channel,height囤热,width]
對應(yīng)至上面的保存bg/fg anchors的矩陣猎提,其在caffe blob中的存儲(chǔ)形式為[1, 2x9, H, W]。而在softmax分類時(shí)需要進(jìn)行fg/bg二分類旁蔼,所以reshape layer會(huì)將其變?yōu)閇1, 2, 9xH, W]大小锨苏,即單獨(dú)“騰空”出來一個(gè)維度以便softmax分類,之后再reshape回復(fù)原狀棺聊。貼一段caffe softmax_loss_layer.cpp的reshape函數(shù)的解釋伞租,非常精辟:
"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be N*H*W, "
"with integer values in {0, 1, ..., C-1}.";
綜上所述,RPN網(wǎng)絡(luò)中利用anchors和softmax初步提取出foreground anchors作為候選區(qū)域限佩。
對proposals進(jìn)行bounding box regression
在了解bounding box regression后葵诈,再回頭來看RPN網(wǎng)絡(luò)第二條線路,如圖祟同。
先來看一看上圖11中1x1卷積的caffe prototxt定義:
layer {
name: "rpn_bbox_pred"
type: "Convolution"
bottom: "rpn/output"
top: "rpn_bbox_pred"
convolution_param {
num_output: 36 # 4 * 9(anchors)
kernel_size: 1 pad: 0 stride: 1
}
}
可以看到其 num_output=36作喘,即經(jīng)過該卷積輸出圖像為WxHx36,在caffe blob存儲(chǔ)為[1, 4x9, H, W]晕城,這里相當(dāng)于feature maps每個(gè)點(diǎn)都有9個(gè)anchors泞坦,每個(gè)anchors又都有4個(gè)用于回歸的變換量。
Proposal Layer
Proposal Layer負(fù)責(zé)綜合所有變換量和foreground anchors砖顷,計(jì)算出精準(zhǔn)的proposal贰锁,送入后續(xù)RoI Pooling Layer。還是先來看看Proposal Layer的caffe prototxt定義:
layer {
name: 'proposal'
type: 'Python'
bottom: 'rpn_cls_prob_reshape'
bottom: 'rpn_bbox_pred'
bottom: 'im_info'
top: 'rois'
python_param {
module: 'rpn.proposal_layer'
layer: 'ProposalLayer'
param_str: "'feat_stride': 16"
}
}
Proposal Layer有3個(gè)輸入:fg/bg anchors分類器結(jié)果rpn_cls_prob_reshape滤蝠,對應(yīng)的bbox reg的變換量rpn_bbox_pred豌熄,以及im_info;另外還有參數(shù)feat_stride=16几睛,這和圖4是對應(yīng)的房轿。
首先解釋im_info。對于一副任意大小PxQ圖像,傳入Faster RCNN前首先reshape到固定MxN囱持,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息夯接。然后經(jīng)過Conv Layers,經(jīng)過4次pooling變?yōu)閃xH=(M/16)x(N/16)大小纷妆,其中feature_stride=16則保存了該信息盔几,用于計(jì)算anchor偏移量。
圖13
Proposal Layer forward(caffe layer的前傳函數(shù))按照以下順序依次處理:
- 生成anchors掩幢,利用對所有的anchors做bbox regression回歸(這里的anchors生成和訓(xùn)練時(shí)完全一致)
- 按照輸入的foreground softmax scores由大到小排序anchors逊拍,提取前pre_nms_topN(e.g. 6000)個(gè)anchors,即提取修正位置后的foreground anchors际邻。
- 限定超出圖像邊界的foreground anchors為圖像邊界(防止后續(xù)roi pooling時(shí)proposal超出圖像邊界)
- 剔除非常行旧ァ(width<threshold or height<threshold)的foreground anchors
- 進(jìn)行非極大值抑制 non maximum suppression
- 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結(jié)果作為proposal輸出世曾。
之后輸出缨恒,注意,由于在第三步中將anchors映射回原圖判斷是否超出邊界轮听,所以這里輸出的proposal是對應(yīng)MxN輸入圖像尺度的骗露,這點(diǎn)在后續(xù)網(wǎng)絡(luò)中有用。另外我認(rèn)為血巍,嚴(yán)格意義上的檢測應(yīng)該到此就結(jié)束了萧锉,后續(xù)部分應(yīng)該屬于識(shí)別了~
RPN網(wǎng)絡(luò)結(jié)構(gòu)就介紹到這里,總結(jié)起來就是:
生成anchors -> softmax分類器提取foreground anchors -> bbox reg回歸foreground anchors -> Proposal Layer生成proposals
Classification
Classification部分利用已經(jīng)獲得的proposal feature maps述寡,通過full connect層與softmax計(jì)算每個(gè)proposal具體屬于那個(gè)類別(如人柿隙,車,電視等)辨赐,輸出cls_prob概率向量优俘;同時(shí)再次利用bounding box regression獲得每個(gè)proposal的位置偏移量bbox_pred,用于回歸更加精確的目標(biāo)檢測框掀序。Classification部分網(wǎng)絡(luò)結(jié)構(gòu)如圖16。
圖16 Classification部分網(wǎng)絡(luò)結(jié)構(gòu)圖
從PoI Pooling獲取到7x7=49大小的proposal feature maps后惭婿,送入后續(xù)網(wǎng)絡(luò)不恭,可以看到做了如下2件事:
- 通過全連接和softmax對proposals進(jìn)行分類,這實(shí)際上已經(jīng)是識(shí)別的范疇了
- 再次對proposals進(jìn)行bounding box regression财饥,獲取更高精度的rect box
二换吧、一刀流 YOLO & SSD
一刀流的想法就比較暴力,給定一張圖像钥星,使用回歸的方式輸出這個(gè)目標(biāo)的邊框和類別沾瓦。一刀流最核心的還是利用了分類器優(yōu)秀的分類效果,首先給出一個(gè)大致的范圍(最開始就是全圖)進(jìn)行分類,然后不斷迭代這個(gè)范圍直到一個(gè)精細(xì)的位置贯莺,如上圖從藍(lán)色的框框到紅色的框框风喇。
這就是一刀流回歸的思想,這樣做的優(yōu)點(diǎn)就是快缕探,但是會(huì)有許多漏檢魂莫。
2.1 YOLO / 2015
論文:YOLO
2.1.1 核心貢獻(xiàn)
YOLO將物體檢測作為回歸問題求解〉模基于一個(gè)單獨(dú)的end-to-end網(wǎng)絡(luò)耙考,完成從原始圖像的輸入到物體位置和類別的輸出。從網(wǎng)絡(luò)設(shè)計(jì)上潭兽,YOLO與rcnn倦始、fast rcnn及faster rcnn的區(qū)別如下:
YOLO訓(xùn)練和檢測均是在一個(gè)單獨(dú)網(wǎng)絡(luò)中進(jìn)行。YOLO沒有顯示地求取region proposal的過程山卦。而rcnn/fast rcnn 采用分離的模塊(獨(dú)立于網(wǎng)絡(luò)之外的selective search方法)求取候選框(可能會(huì)包含物體的矩形區(qū)域)楣号,訓(xùn)練過程因此也是分成多個(gè)模塊進(jìn)行。Faster rcnn使用RPN(region proposal network)卷積網(wǎng)絡(luò)替代rcnn/fast rcnn的selective
search模塊怒坯,將RPN集成到fast rcnn檢測網(wǎng)絡(luò)中炫狱,得到一個(gè)統(tǒng)一的檢測網(wǎng)絡(luò)。盡管RPN與fast rcnn共享卷積層剔猿,但是在模型訓(xùn)練過程中视译,需要反復(fù)訓(xùn)練RPN網(wǎng)絡(luò)和fast rcnn網(wǎng)絡(luò)(注意這兩個(gè)網(wǎng)絡(luò)核心卷積層是參數(shù)共享的)。-
YOLO將物體檢測作為一個(gè)回歸問題進(jìn)行求解归敬,輸入圖像經(jīng)過一次inference酷含,便能得到圖像中所有物體的位置和其所屬類別及相應(yīng)的置信概率。而rcnn/fast rcnn/faster rcnn將檢測結(jié)果分為兩部分求解:物體類別(分類問題)汪茧,物體位置即bounding box(回歸問題)椅亚。
2.1.2基本流程
YOLO檢測網(wǎng)絡(luò)包括24個(gè)卷積層和2個(gè)全連接層,如下圖所示舱污。
其中呀舔,卷積層用來提取圖像特征,全連接層用來預(yù)測圖像位置和類別概率值扩灯。
整體來看媚赖,Yolo算法采用一個(gè)單獨(dú)的CNN模型實(shí)現(xiàn)end-to-end的目標(biāo)檢測,整個(gè)系統(tǒng)如下圖所示:首先將輸入圖片resize到448x448珠插,然后送入CNN網(wǎng)絡(luò)惧磺,最后處理網(wǎng)絡(luò)預(yù)測結(jié)果得到檢測的目標(biāo)。相比R-CNN算法捻撑,其是一個(gè)統(tǒng)一的框架磨隘,其速度更快缤底,而且Yolo的訓(xùn)練過程也是end-to-end的。
具體來說番捂,Yolo的CNN網(wǎng)絡(luò)將輸入的圖片分割成 S×S 網(wǎng)格个唧,然后每個(gè)單元格負(fù)責(zé)去檢測那些中心點(diǎn)落在該格子內(nèi)的目標(biāo),如圖所示:
邊界框置信度
可以看到狗這個(gè)目標(biāo)的中心落在左下角一個(gè)單元格內(nèi)白嘁,那么該單元格負(fù)責(zé)預(yù)測這個(gè)狗坑鱼。每個(gè)單元格會(huì)預(yù)測 個(gè)邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實(shí)包含兩個(gè)方面絮缅,一是這個(gè)邊界框含有目標(biāo)的可能性大小鲁沥,二是這個(gè)邊界框的準(zhǔn)確度。前者記為 耕魄,當(dāng)該邊界框是背景時(shí)(即不包含目標(biāo))画恰,此時(shí) 。而當(dāng)該邊界框包含目標(biāo)時(shí)吸奴, 允扇。邊界框的準(zhǔn)確度可以用預(yù)測框與實(shí)際框(ground truth)的IOU(intersection over union,交并比)來表征则奥,記為 考润。因此置信度可以定義為:
邊界框的大小與位置可以用4個(gè)值來表征:,其中 是邊界框的中心坐標(biāo)读处,而 和 是邊界框的寬與高糊治。還有一點(diǎn)要注意,中心坐標(biāo)的預(yù)測值 是相對于每個(gè)單元格左上角坐標(biāo)點(diǎn)的偏移值罚舱,并且單位是相對于單元格大小的井辜,單元格的坐標(biāo)定義如圖6所示。而邊界框的 和 預(yù)測值是相對于整個(gè)圖片的寬與高的比例管闷,這樣就保證了邊界框中心點(diǎn)不會(huì)超過單元格粥脚,但是框的邊界可以超過單元格。4個(gè)元素的大小應(yīng)該在 范圍包个。這樣刷允,每個(gè)邊界框的預(yù)測值實(shí)際上包含5個(gè)元素: ,其中前4個(gè)表征邊界框的大小與位置赃蛛,而最后一個(gè)值是置信度恃锉。
類別置信度
還有分類問題,對于每一個(gè)單元格其還要給出預(yù)測出個(gè)類別概率值呕臂,其表征的是由該單元格負(fù)責(zé)預(yù)測的邊界框其目標(biāo)屬于各個(gè)類別的概率。但是這些概率值其實(shí)是在各個(gè)邊界框置信度下的條件概率肪跋,即 歧蒋。以此計(jì)算出各個(gè)邊界框類別置信度(class-specific confidence scores):
邊界框類別置信度表征的是該邊界框中目標(biāo)屬于各個(gè)類別的可能性大小以及邊界框匹配目標(biāo)的好壞。一般會(huì)根據(jù)類別置信度來過濾網(wǎng)絡(luò)的預(yù)測框。
總結(jié)一下谜洽,每個(gè)單元格需要預(yù)測 個(gè)值萝映。如果將輸入圖片劃分為 網(wǎng)格,那么最終預(yù)測值為 大小的張量阐虚。整個(gè)模型的預(yù)測值結(jié)構(gòu)如下圖所示序臂。對于PASCAL VOC數(shù)據(jù),其共有20個(gè)類別实束,如果使用 奥秆,那么最終的預(yù)測結(jié)果就是 大小的張量。
2.1.3網(wǎng)絡(luò)訓(xùn)練
在訓(xùn)練之前咸灿,先在ImageNet上進(jìn)行了預(yù)訓(xùn)練构订,其預(yù)訓(xùn)練的分類模型采用圖8中前20個(gè)卷積層,然后添加一個(gè)average-pool層和全連接層避矢。預(yù)訓(xùn)練之后悼瘾,在預(yù)訓(xùn)練得到的20層卷積層之上加上隨機(jī)初始化的4個(gè)卷積層和2個(gè)全連接層。整個(gè)網(wǎng)絡(luò)的流程如下圖所示:
損失函數(shù):
其中审胸,coordError亥宿、iouError和classError分別代表預(yù)測數(shù)據(jù)與標(biāo)定數(shù)據(jù)之間的坐標(biāo)誤差、IOU誤差和分類誤差砂沛。
YOLO對上式loss的計(jì)算進(jìn)行了如下修正烫扼。
位置相關(guān)誤差(坐標(biāo)、IOU)與分類誤差對網(wǎng)絡(luò)loss的貢獻(xiàn)值是不同的尺上,因此YOLO在計(jì)算loss時(shí)材蛛,使用!修正coordError
-
在計(jì)算IOU誤差時(shí),包含物體的格子與不包含物體的格子怎抛,二者的IOU誤差對網(wǎng)絡(luò)loss的貢獻(xiàn)值是不同的卑吭。若采用相同的權(quán)值,那么不包含物體的格子的confidence值近似為0马绝,變相放大了包含物體的格子的confidence誤差在計(jì)算網(wǎng)絡(luò)參數(shù)梯度時(shí)的影響豆赏。
可以這樣理解,整個(gè) YOLO 系統(tǒng)其實(shí)最有效的地方就是那些包含了目標(biāo)中心點(diǎn)的網(wǎng)格它們所預(yù)測的 2 個(gè) bbox富稻,所以它們這 2 個(gè) bbox 的位置信息就至關(guān)重要掷邦,所以它們的坐標(biāo)就不允許它們變化劇烈,所以就需要添加一個(gè)系數(shù)放大它們的誤差椭赋,進(jìn)而達(dá)到懲罰的目的抚岗。而沒有包含目標(biāo)的網(wǎng)格,雖然它們也會(huì)預(yù)測 bbox哪怔,也會(huì)有 confidence 的預(yù)測宣蔚,但基本等同于無效向抢,所以可以看做它們對于整體的 Loss 而言,沒有那么重要胚委,因此要減弱它們對于 Loss 的影響挟鸠,以防止它去干擾正常的包含了目標(biāo)的那些 bbox 的 confidence 表現(xiàn)。
為解決這個(gè)問題亩冬,YOLO 使用修正iouError艘希。(注:此處的包含是指存在一個(gè)物體,它的中心坐標(biāo)落入到格子內(nèi))硅急。
-
對于相等的誤差值覆享,大物體誤差對檢測的影響應(yīng)小于小物體誤差對檢測的影響。這是因?yàn)橥眩嗤奈恢闷钫即笪矬w的比例遠(yuǎn)小于同等偏差占小物體的比例淹真。比如預(yù)測一個(gè)小的 bbox,groundtruth 的 width 是 4连茧,它預(yù)測是 3核蘸,那么它的誤差是 1,再預(yù)測一個(gè)大的 bbox啸驯,groundtruth 的 width 是 100客扎,預(yù)測值是 99,那么誤差也是 1罚斗。很容易發(fā)現(xiàn)徙鱼,進(jìn)行小尺寸的 bbox 預(yù)測時(shí),誤差更敏感针姿,所以 sum-sqaured error 手段需要改良袱吆。
YOLO將物體大小的信息項(xiàng)(w和h)進(jìn)行求平方根來改進(jìn)這個(gè)問題。還是用剛才的例子距淫,小的 bbox width prediction = 3,groundtruth = 4绞绒,誤差為 0.067。大的 bbox width prediction = 99,groundtruth = 100榕暇,誤差為 0.0025蓬衡。
綜上,YOLO在訓(xùn)練過程中Loss計(jì)算如下式所示:
其中彤枢,為網(wǎng)絡(luò)預(yù)測值狰晚,帽 為標(biāo)注值。表示物體落入格子i中缴啡,和 分別表示物體落入與未落入格子i
的第j
個(gè)bounding box內(nèi)壁晒。
注:
YOLO方法模型訓(xùn)練依賴于物體識(shí)別標(biāo)注數(shù)據(jù),因此业栅,對于非常規(guī)的物體形狀或比例讨衣,YOLO的檢測效果并不理想换棚。
YOLO采用了多個(gè)下采樣層式镐,網(wǎng)絡(luò)學(xué)到的物體特征并不精細(xì)反镇,因此也會(huì)影響檢測效果。
YOLO loss函數(shù)中娘汞,大物體IOU誤差和小物體IOU誤差對網(wǎng)絡(luò)訓(xùn)練中l(wèi)oss貢獻(xiàn)值接近(雖然采用求平方根方式歹茶,但沒有根本解決問題)。因此你弦,對于小物體惊豺,小的IOU誤差也會(huì)對網(wǎng)絡(luò)優(yōu)化過程造成很大的影響,從而降低了物體檢測的定位準(zhǔn)確性禽作。
2.1.4局限
雖然每個(gè)格子可以預(yù)測B個(gè)bounding box尸昧,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個(gè)格子最多只預(yù)測出一個(gè)物體旷偿。當(dāng)物體占畫面比例較小烹俗,如圖像中包含畜群或鳥群時(shí),每個(gè)格子包含多個(gè)物體萍程,但卻只能檢測出其中一個(gè)幢妄。這是Yolo算法的一個(gè)缺點(diǎn),在后來的改進(jìn)版本中茫负,Yolo9000是把類別概率預(yù)測值與邊界框是綁定在一起的蕉鸳。
2.2 SSD / 2015
論文:SSD
SSD 就在 YOLO 的主意上添加了 Faster R-CNN 的 Anchor 概念,并融合不同卷積層的特征做出預(yù)測忍法。
我們從上圖就可以很明顯的看出這是 YOLO 分治網(wǎng)絡(luò)
和 Faster R-CNN Anchor
的融合潮尝,這就大大提高了對小物體的檢測。這里作者做實(shí)驗(yàn)也提到和 Faster R-CNN
一樣的結(jié)果饿序,這個(gè) Anchor
的數(shù)量和形狀會(huì)對性能造成較大的影響勉失。
除此之外,由于這個(gè) Anchor
是規(guī)整形狀的嗤堰,但是有些物體的擺放位置是千奇百怪的戴质,所以沒有 數(shù)據(jù)增強(qiáng)
前的效果比增強(qiáng)后的效果差 7 個(gè)百分點(diǎn)。直觀點(diǎn)理解踢匣,做輕微地角度扭曲讓 Anchor
背后的神經(jīng)元“看到”更多的信息告匠。
還有一個(gè)重大的進(jìn)步是結(jié)合了不同尺寸大小 Feature Maps 所提取的特征,然后進(jìn)行預(yù)測离唬。這是 FPN 網(wǎng)絡(luò)提出前的第一次做 Feature Pyramid 的嘗試后专,這個(gè)特征圖金字塔結(jié)合了不同層的信息,從而結(jié)合了不同 尺寸
和 大小
的特征信息输莺。
這個(gè)嘗試就大大地提高了識(shí)別的精度戚哎,且高分辨率(尺寸大)的 Feature Map 中含有更多小物體的信息裸诽,也是因?yàn)檫@個(gè)原因 SSD 能夠較好的識(shí)別小物體。
除此之外型凳,和 YOLO 最大的區(qū)別是丈冬,SSD 沒有接 FC 減少了大量的參數(shù)量、提高了速度甘畅。
小結(jié) / 2018
回顧過去埂蕊,從 YOLO 到 SSD ,人們兼收并蓄把不同思想融合起來疏唾。
YOLO 使用了分治思想蓄氧,將輸入圖片分為 SxS
的網(wǎng)格,不同網(wǎng)格用性能優(yōu)良的分類器去分類槐脏。
YOLO v1 也有和當(dāng)年其它杰出的目標(biāo)檢測系統(tǒng)做對比喉童,但在今天來看,這個(gè)并不十分重要顿天,重要的是我們需要理解 YOLO 快的原因堂氯。
- YOLO 就是一個(gè)撒漁網(wǎng)的捕魚過程,一次性搞定所有的目標(biāo)定位露氮。
- YOLO 快的原因在于比較粗的粒度將輸入圖片劃分網(wǎng)格祖灰,然后做預(yù)測。
YOLO 的算法精髓都體現(xiàn)在它的 Loss 設(shè)計(jì)上及作者如何針對問題改進(jìn) Loss畔规,這種思考問題的方式才是最值得我們學(xué)習(xí)的局扶。
SSD 將 YOLO 和 Anchor 思想融合起來,并創(chuàng)新使用 Feature Pyramid 結(jié)構(gòu)叁扫。
但是 Resize
輸入三妈,必定會(huì)損失許多的信息和一定的精度,這也許是一刀流快的原因莫绣。
無論如何锅劝,YOLO 和 SSD 這兩篇論文都是讓人不得不贊嘆他們想法的精巧弯院,讓人受益良多。
三、總結(jié) Summary
在「目標(biāo)檢測」中有兩個(gè)指標(biāo):快(Fast)
和 準(zhǔn)(Accurate)
很洋。
一刀流代表的是快缆镣,但是最后在快和準(zhǔn)中找到了平衡戚扳,第一是快蝌箍,第二是準(zhǔn)。
兩刀流代表的是準(zhǔn)牺汤,雖然沒有那么快但是也有 6 FPS 可接受的程度辽旋,第一是準(zhǔn),第二是快。
兩類算法都有其適用的范圍补胚,比如說實(shí)時(shí)快速動(dòng)作捕捉码耐,一刀流更勝一籌;復(fù)雜溶其、多物體重疊骚腥,兩刀流當(dāng)仁不讓。沒有不好的算法握联,只有不合適的使用場景桦沉。
四、一些概念
1. IOU
IoU度量兩個(gè)框之間的重疊金闽。我們用它來測量我們預(yù)測的框與ground truth(真實(shí)物體邊界)的重疊程度。在一些數(shù)據(jù)集中剿骨,我們預(yù)先定義了一個(gè)IoU閾值(比如0.5)來分類預(yù)測是真陽性還是假陽性代芜。
2. mAP
相關(guān)概念
mAP: mean Average Precision, 即各類別AP的平均值
AP: PR曲線下面積,后文會(huì)詳細(xì)講解
PR曲線: Precision-Recall曲線
Precision: TP / (TP + FP) 在你認(rèn)為的正樣本中浓利, 有多大比例真的是正樣本
Recall: TP / (TP + FN) 在真正的正樣本中挤庇, 有多少被你找到了
TP: IoU>0.5的檢測框數(shù)量(同一Ground Truth只計(jì)算一次)
FP: IoU<=0.5的檢測框,或者是檢測到同一個(gè)GT的多余檢測框的數(shù)量
FN: 沒有檢測到的GT的數(shù)量
明確問題: 大背景是object detection贷掖, 我就以正在學(xué)的RetinaNet應(yīng)用背景為例嫡秕, 識(shí)別出來的每一個(gè)框都有N+1個(gè)score, 對應(yīng)著N個(gè)class和1個(gè)background苹威, 我們會(huì)選score最高的那個(gè)作為最終的判斷昆咽。
問題核心: 我們需要一個(gè)對于score的threshold, 為什么呢? 比如在一個(gè)bounding box里, 我識(shí)別出來鴨子的score最高牙甫, 可是他也只有0.1掷酗, 那么他真的是鴨子嗎? 很可能他還是負(fù)樣本窟哺。 所以我們需要一個(gè)閾值泻轰, 如果識(shí)別出了鴨子而且分?jǐn)?shù)大于這個(gè)閾值才真的說他是正樣本, 否則他是負(fù)樣本
那么threshold到底是怎么影響precision和recall的呢且轨? 我們還是用鴨子的例子
- 如果threshold太高浮声, prediction非常嚴(yán)格, 所以我們認(rèn)為是鴨子的基本都是鴨子旋奢,precision就高了泳挥;但也因?yàn)楹Y選太嚴(yán)格, 我們也放過了一些score比較低的鴨子黄绩, 所以recall就低了
- 如果threshold太低羡洁, 什么都會(huì)被當(dāng)成鴨子, precision就會(huì)很低爽丹, recall就會(huì)很高
這樣我們就明確了threshold確實(shí)對鴨子的precision和recall產(chǎn)生影響和變化的趨勢筑煮, 也就帶來了思考辛蚊, precision不是一個(gè)絕對的東西,而是相對threshold而改變的東西真仲, recall同理袋马, 那么單個(gè)用precision來作為標(biāo)準(zhǔn)判斷, 就不合適秸应。 這是一場precision與recall之間的trade off虑凛, 用一組固定值表述不夠全面, 因?yàn)槲覀兏鶕?jù)不同的threshold软啼, 可以取到不同(也可能相同)的precision recall值桑谍。 這樣想的話對于每個(gè)threshold,我們都有(precision祸挪, recall)的pair锣披, 也就有了precision和recall之間的curve關(guān)系
有了這么一條precision-recall curve, 他衡量著兩個(gè)有價(jià)值的判斷標(biāo)準(zhǔn)贿条, precision和recall的關(guān)系雹仿, 那么不如兩個(gè)一起動(dòng)態(tài)考慮, 就有了鴨子這個(gè)class的Average Precision整以, 即curve下的面積胧辽, 他可以充分的表示在這個(gè)model中, precision和recall的總體優(yōu)劣公黑。
最后邑商, 我們計(jì)算每個(gè)class的Average Precision, 就得到了mean Average Precision
非極大值抑制(NMS):
RCNN會(huì)從一張圖片中找出n個(gè)可能是物體的矩形框帆调,然后為每個(gè)矩形框?yàn)樽鲱悇e分類概率:
就像上面的圖片一樣奠骄,定位一個(gè)車輛,最后算法就找出了一堆的方框番刊,我們需要判別哪些矩形框是沒用的含鳞。非極大值抑制的方法是:先假設(shè)有6個(gè)矩形框,根據(jù)分類器的類別分類概率做排序芹务,假設(shè)從小到大屬于車輛的概率 分別為A蝉绷、B、C枣抱、D熔吗、E、F佳晶。
(1)從最大概率矩形框F開始桅狠,分別判斷A~E與F的重疊度IOU是否大于某個(gè)設(shè)定的閾值;
(2)假設(shè)B、D與F的重疊度超過閾值,那么就扔掉B中跌、D咨堤;并標(biāo)記第一個(gè)矩形框F,是我們保留下來的漩符。
(3)從剩下的矩形框A一喘、C、E中嗜暴,選擇概率最大的E凸克,然后判斷E與A、C的重疊度闷沥,重疊度大于一定的閾值萎战,那么就扔掉;并標(biāo)記E是我們保留下來的第二個(gè)矩形框狐赡。
就這樣一直重復(fù)撞鹉,找到所有被保留下來的矩形框。
非極大值抑制(NMS)顧名思義就是抑制不是極大值的元素颖侄,搜索局部的極大值。這個(gè)局部代表的是一個(gè)鄰域享郊,鄰域有兩個(gè)參數(shù)可變览祖,一是鄰域的維數(shù),二是鄰域的大小炊琉。這里不討論通用的NMS算法展蒂,而是用于在目標(biāo)檢測中用于提取分?jǐn)?shù)最高的窗口的。例如在行人檢測中苔咪,滑動(dòng)窗口經(jīng)提取特征锰悼,經(jīng)分類器分類識(shí)別后,每個(gè)窗口都會(huì)得到一個(gè)分?jǐn)?shù)团赏。但是滑動(dòng)窗口會(huì)導(dǎo)致很多窗口與其他窗口存在包含或者大部分交叉的情況箕般。這時(shí)就需要用到NMS來選取那些鄰域里分?jǐn)?shù)最高(是行人的概率最大),并且抑制那些分?jǐn)?shù)低的窗口舔清。
參考資料 Reference
- R-CNN “Rich feature hierarchies for accurate object detection and semantic segmentation”
- SPP Net “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”
- Fast R-CNN “Fast R-CNN”
- Faster R-CNN “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”
- Mask R-CNN “Mask R-CNN”
- YOLO “You Only Look Once: Unified, Real-Time Object Detection”
- SSD “SSD: Single Shot MultiBox Detector”
- YOLO9000 “YOLO9000: Better, Faster, Stronger”
- 一文讀懂Faster RCNN
- 基于深度學(xué)習(xí)的「目標(biāo)檢測」算法綜述
-
RCNN- 將CNN引入目標(biāo)檢測的開山之作
12.https://blog.csdn.net/briblue/article/details/84794511