一文讀懂「目標(biāo)檢測」經(jīng)典算法:RCNN,SPP-Net,Fast-RCNN,Faster-RCNN,YOLO,SSD

概述 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)行回歸
回歸解決問題簡單快速迹辐,但是太粗暴了蝶防,主要代表人物是 YOLOSSD


無論 兩刀流 還是 一刀流明吩,他們都是在同一個(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 基本流程

  1. 我們首先取一個(gè)預(yù)訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)CNN。
  2. 根據(jù)需要檢測的目標(biāo)類別數(shù)量获茬,訓(xùn)練CNN的最后一層港庄。
  3. 將以下圖片作為輸入:
  1. 之后倔既,我們會(huì)用上文中的選擇性搜索得到感興趣區(qū)域(大約1k~2k個(gè)):
  1. 對這些區(qū)域重新改造,以讓其符合CNN的輸入尺寸要求鹏氧,將這些區(qū)域輸入到CNN中渤涌,并經(jīng)過卷積網(wǎng)絡(luò):
  1. 對每個(gè)類別,我們都要訓(xùn)練一個(gè)二元SVM(判斷物體是foreground or background把还,我們檢測的目標(biāo)是foreground)实蓬。CNN為每個(gè)區(qū)域提取特征,利用SVM將這些區(qū)域分成不同類別:
2703090986-5bc5a1ba17ab7.png
  1. 最后吊履,我們訓(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'蕉世,即:

  • 給定:anchorA = (A_x,A_y,A_w,A_h)GT = [G_x,G_y,G_w,G_h]
  • 尋找一種變換F,使得:F(A_x,A_y,A_w,A_h)=(G'_x,G'_y,G'_w,G'_h)婆硬,其中(G'_x,G'_y,G'_w,G'_h)\approx (G_x,G_y,G_w,G_h)

那么經(jīng)過何種變換F才能從圖中的anchor A變?yōu)镚'呢狠轻? 比較簡單的思路就是:

  • 先做平移
    G'_x = A_w*d_x(A)+A_x

    G'_y = A_h*d_y(A)+A_y

  • 再做縮放
    G'_w = A_w*exp(d_w(A))

    G'_h = A_h*exp(d_h(A))

觀察上面4個(gè)公式發(fā)現(xiàn),需要學(xué)習(xí)的是 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)這四個(gè)變換彬犯。當(dāng)輸入的anchor A與GT相差較小時(shí)向楼,可以認(rèn)為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進(jìn)行微調(diào)(注意谐区,只有當(dāng)anchors A和GT比較接近時(shí)湖蜕,才能使用線性回歸模型,否則就是復(fù)雜的非線性問題了)宋列。
接下來的問題就是如何通過線性回歸獲得 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 了昭抒。線性回歸就是給定輸入的特征向量X, 學(xué)習(xí)一組參數(shù)W, 使得經(jīng)過線性回歸后的值跟真實(shí)值Y非常接近,即Y=WX。對于該問題灭返,輸入X是cnn feature map盗迟,定義為Φ;同時(shí)還有訓(xùn)練傳入A與GT之間的變換量熙含,即(t_{x}, t_{y}, t_{w}, t_{h})罚缕。輸出是d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)四個(gè)變換。那么目標(biāo)函數(shù)可以表示為:
d_*(A)=W_*^T\cdot \phi(A)

其中 \phi(A) 是對應(yīng)anchor的feature map組成的特征向量怎静, W_* 是需要學(xué)習(xí)的參數(shù)怕磨, d_*(A)是得到的預(yù)測值(*表示 x,y消约,w肠鲫,h,也就是每一個(gè)變換對應(yīng)一個(gè)上述目標(biāo)函數(shù))或粮。為了讓預(yù)測值d_*(A)與真實(shí)值t_* 差距最小导饲,設(shè)計(jì)損失函數(shù):

\text{Loss}=\sum_{i}^{N}{(t_*^i-W_*^T\cdot \phi(A^i))^2}

函數(shù)優(yōu)化目標(biāo)為:

\hat{W}_*=\text{argmin}_{W_*}\sum_{i}^{n}(t_*^i- W_*^T\cdot \phi(A^i))^2+\lambda||W_*||^2\

需要說明,只有在GT與需要回歸框位置比較接近時(shí)氯材,才可近似認(rèn)為上述線性變換成立渣锦。
說完原理,對應(yīng)于Faster RCNN原文氢哮,foreground anchor與ground truth之間的平移量 (t_x, t_y)與尺度因子 (t_w, t_h)如下:

t_x=(x-x_a)/w_a\ \ \ \ t_y=(x-y_a)/h_a

t_w=\log(w/w_a)\ \ \ \ t_h=\log(h/h_a)

對于訓(xùn)練bouding box regression網(wǎng)絡(luò)回歸分支袋毙,輸入是cnn feature Φ,監(jiān)督信號是Anchor與GT的差距 (t_x, t_y, t_w, t_h)冗尤,即訓(xùn)練目標(biāo)是:輸入 Φ的情況下使網(wǎng)絡(luò)輸出與監(jiān)督信號盡可能接近听盖。
那么當(dāng)bouding box regression工作時(shí),再輸入Φ時(shí)裂七,回歸網(wǎng)絡(luò)分支的輸出就是每個(gè)Anchor的平移量和變換尺度 (t_x, t_y, t_w, t_h)皆看,顯然即可用來修正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ù)集。

img

從結(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è)硬傷:

  1. 算力冗余
    先生成候選區(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)練速度。

  2. 圖片縮放

在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ū)域水平分為pooled_w ×pooled_h 的網(wǎng)格;
  • 對網(wǎng)格的每一份都進(jìn)行max pooling處理柠座。

這樣處理后邑雅,即使大小不同的proposal輸出結(jié)果都是 pooled_w ×pooled_h 固定大小,實(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ò)中渺尘。

簡單地說挫鸽,這一過程含有以下步驟:

  1. 輸入圖片。
  2. 輸入到卷積網(wǎng)絡(luò)中沧烈,它生成感興趣區(qū)域掠兄。
  3. 利用Rol池化層對這些區(qū)域重新調(diào)整像云,將其輸入到完全連接網(wǎng)絡(luò)中锌雀。
  4. 在網(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)行回歸。

這一改變將 BboxClfloss 結(jié)合起來變成一個(gè) Loss 一起訓(xùn)練伟骨,并吸納了 SPP Net 的優(yōu)點(diǎn)饮潦,最終不僅加快了預(yù)測的速度,而且提高了精度携狭。

1.3.2 基本流程

  1. 首先继蜡,輸入圖像:

  1. 圖像被傳遞到卷積網(wǎng)絡(luò)中,返回感興趣區(qū)域:


  1. 之后逛腿,在區(qū)域上應(yīng)用Rol池化層壹瘟,保證每個(gè)區(qū)域的尺寸相同:
  1. 這些區(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ū)域的可靠程度大大提高搁进;可以從上圖看出 RPNsRoI 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基本結(jié)構(gòu)

Faster RCNN其實(shí)可以分為4個(gè)主要內(nèi)容:

  1. Conv layers旦万。作為一種CNN網(wǎng)絡(luò)目標(biāo)檢測方法闹击,F(xiàn)aster RCNN首先使用一組基礎(chǔ)的conv+relu+pooling層提取image的feature maps。該feature maps被共享用于后續(xù)RPN層和全連接層成艘。
  2. Region Proposal Networks赏半。RPN網(wǎng)絡(luò)用于生成region proposals贺归。該層通過softmax判斷anchors屬于foreground或者background,再利用bounding box regression修正anchors獲得精確的proposals断箫。
  3. Roi Pooling拂酣。該層收集輸入的feature maps和proposals,綜合這些信息后提取proposal feature maps仲义,送入后續(xù)全連接層判定目標(biāo)類別婶熬。
  4. 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中:

  1. 所有的conv層都是:keneral_size = 3,pad = 1,stride = 1
  2. 所有的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:

img

類似的是,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)勢朱盐,能極大提升檢測框的生成速度群嗤。

img

上圖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卷積
img

如上圖,輸入有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è)值(x_1, y_1, x_2, y_2)代表矩形左上和右下角點(diǎn)坐標(biāo)代咸。9個(gè)矩形共有3種形狀蹈丸,長寬比為大約為width:height \in \left \{ 1:1,1:2,2:1 \right \} 三種,如下圖呐芥。實(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:

img

圖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è)用于回歸的[d_x(A),d_y(A).d_w(A),d_h(A)]變換量。

Proposal Layer

Proposal Layer負(fù)責(zé)綜合所有[d_x(A),d_y(A).d_w(A),d_h(A)]變換量和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的[d_x(A),d_y(A).d_w(A),d_h(A)]變換量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偏移量。

img

圖13

Proposal Layer forward(caffe layer的前傳函數(shù))按照以下順序依次處理:

  1. 生成anchors掩幢,利用[d_x(A),d_y(A).d_w(A),d_h(A)]對所有的anchors做bbox regression回歸(這里的anchors生成和訓(xùn)練時(shí)完全一致)
  2. 按照輸入的foreground softmax scores由大到小排序anchors逊拍,提取前pre_nms_topN(e.g. 6000)個(gè)anchors,即提取修正位置后的foreground anchors际邻。
  3. 限定超出圖像邊界的foreground anchors為圖像邊界(防止后續(xù)roi pooling時(shí)proposal超出圖像邊界)
  4. 剔除非常行旧ァ(width<threshold or height<threshold)的foreground anchors
  5. 進(jìn)行非極大值抑制 non maximum suppression
  6. 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結(jié)果作為proposal輸出世曾。

之后輸出proposal=[x_1, y_1, x_2, y_2]缨恒,注意,由于在第三步中將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。

img

圖16 Classification部分網(wǎng)絡(luò)結(jié)構(gòu)圖

從PoI Pooling獲取到7x7=49大小的proposal feature maps后惭婿,送入后續(xù)網(wǎng)絡(luò)不恭,可以看到做了如下2件事:

  1. 通過全連接和softmax對proposals進(jìn)行分類,這實(shí)際上已經(jīng)是識(shí)別的范疇了
  2. 再次對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ū)別如下:

  1. 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ù)共享的)。

  2. YOLO將物體檢測作為一個(gè)回歸問題進(jìn)行求解归敬,輸入圖像經(jīng)過一次inference酷含,便能得到圖像中所有物體的位置和其所屬類別及相應(yīng)的置信概率。而rcnn/fast rcnn/faster rcnn將檢測結(jié)果分為兩部分求解:物體類別(分類問題)汪茧,物體位置即bounding box(回歸問題)椅亚。

    preview

2.1.2基本流程

YOLO檢測網(wǎng)絡(luò)包括24個(gè)卷積層和2個(gè)全連接層,如下圖所示舱污。

preview

其中呀舔,卷積層用來提取圖像特征,全連接層用來預(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的。

img

具體來說番捂,Yolo的CNN網(wǎng)絡(luò)將輸入的圖片分割成 S×S 網(wǎng)格个唧,然后每個(gè)單元格負(fù)責(zé)去檢測那些中心點(diǎn)落在該格子內(nèi)的目標(biāo),如圖所示:

img
邊界框置信度

可以看到狗這個(gè)目標(biāo)的中心落在左下角一個(gè)單元格內(nèi)白嘁,那么該單元格負(fù)責(zé)預(yù)測這個(gè)狗坑鱼。每個(gè)單元格會(huì)預(yù)測 B個(gè)邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實(shí)包含兩個(gè)方面絮缅,一是這個(gè)邊界框含有目標(biāo)的可能性大小鲁沥,二是這個(gè)邊界框的準(zhǔn)確度。前者記為 Pr(object) 耕魄,當(dāng)該邊界框是背景時(shí)(即不包含目標(biāo))画恰,此時(shí) Pr(object)=0 。而當(dāng)該邊界框包含目標(biāo)時(shí)吸奴, Pr(object)=1允扇。邊界框的準(zhǔn)確度可以用預(yù)測框與實(shí)際框(ground truth)的IOU(intersection over union,交并比)來表征则奥,記為 \text{IOU}^{truth}_{pred}考润。因此置信度可以定義為:
Pr(object)*\text{IOU}^{truth}_{pred}

邊界框的大小與位置可以用4個(gè)值來表征:(x, y,w,h),其中 (x,y) 是邊界框的中心坐標(biāo)读处,而 wh是邊界框的寬與高糊治。還有一點(diǎn)要注意,中心坐標(biāo)的預(yù)測值 (x,y) 是相對于每個(gè)單元格左上角坐標(biāo)點(diǎn)的偏移值罚舱,并且單位是相對于單元格大小的井辜,單元格的坐標(biāo)定義如圖6所示。而邊界框的 wh 預(yù)測值是相對于整個(gè)圖片的寬與高的比例管闷,這樣就保證了邊界框中心點(diǎn)不會(huì)超過單元格粥脚,但是框的邊界可以超過單元格。4個(gè)元素的大小應(yīng)該在 [0,1] 范圍包个。這樣刷允,每個(gè)邊界框的預(yù)測值實(shí)際上包含5個(gè)元素: (x,y,w,h,c),其中前4個(gè)表征邊界框的大小與位置赃蛛,而最后一個(gè)值是置信度恃锉。

類別置信度

還有分類問題,對于每一個(gè)單元格其還要給出預(yù)測出N個(gè)類別概率值呕臂,其表征的是由該單元格負(fù)責(zé)預(yù)測的邊界框其目標(biāo)屬于各個(gè)類別的概率。但是這些概率值其實(shí)是在各個(gè)邊界框置信度下的條件概率肪跋,即 Pr(class_{i}|object) 歧蒋。以此計(jì)算出各個(gè)邊界框類別置信度(class-specific confidence scores):
Pr(class_{i}|object)*Pr(object)*\text{IOU}^{truth}_{pred}=Pr(class_{i})*\text{IOU}^{truth}_{pred}

邊界框類別置信度表征的是該邊界框中目標(biāo)屬于各個(gè)類別的可能性大小以及邊界框匹配目標(biāo)的好壞。一般會(huì)根據(jù)類別置信度來過濾網(wǎng)絡(luò)的預(yù)測框。

img

總結(jié)一下谜洽,每個(gè)單元格需要預(yù)測 B*5+N個(gè)值萝映。如果將輸入圖片劃分為 S\times S 網(wǎng)格,那么最終預(yù)測值為 S*S*(B*5+N) 大小的張量阐虚。整個(gè)模型的預(yù)測值結(jié)構(gòu)如下圖所示序臂。對于PASCAL VOC數(shù)據(jù),其共有20個(gè)類別实束,如果使用 S=7,B=2 奥秆,那么最終的預(yù)測結(jié)果就是 7\times 7\times 30大小的張量。

image

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ò)的流程如下圖所示:

img

損失函數(shù):

其中审胸,coordError亥宿、iouErrorclassError分別代表預(yù)測數(shù)據(jù)與標(biāo)定數(shù)據(jù)之間的坐標(biāo)誤差、IOU誤差和分類誤差砂沛。

loss=\sum_{i=0}^{S^{2} }{coordError + iouError + classError}

YOLO對上式loss的計(jì)算進(jìn)行了如下修正烫扼。

  1. 位置相關(guān)誤差(坐標(biāo)、IOU)與分類誤差對網(wǎng)絡(luò)loss的貢獻(xiàn)值是不同的尺上,因此YOLO在計(jì)算loss時(shí)材蛛,使用!\lambda _{coord} =5修正coordError

  2. 在計(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 使用\lambda _{noobj} =0.5修正iouError艘希。(注:此處的包含是指存在一個(gè)物體,它的中心坐標(biāo)落入到格子內(nèi))硅急。

  3. 對于相等的誤差值覆享,大物體誤差對檢測的影響應(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ì)算如下式所示:

img

其中彤枢,x,y,w,C,p為網(wǎng)絡(luò)預(yù)測值狰晚,x,y,w,C,\widehat{p}帽 為標(biāo)注值。\Pi _{i}^{obj}表示物體落入格子i中缴啡,\Pi _{ij}^{obj}\Pi _{ij}^{noobj} 分別表示物體落入與未落入格子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分類概率:

img

就像上面的圖片一樣奠骄,定位一個(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

  1. R-CNN “Rich feature hierarchies for accurate object detection and semantic segmentation”
  2. SPP Net “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”
  3. Fast R-CNN “Fast R-CNN”
  4. Faster R-CNN “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”
  5. Mask R-CNN “Mask R-CNN”
  6. YOLO “You Only Look Once: Unified, Real-Time Object Detection”
  7. SSD “SSD: Single Shot MultiBox Detector”
  8. YOLO9000 “YOLO9000: Better, Faster, Stronger”
  9. 一文讀懂Faster RCNN
  10. 基于深度學(xué)習(xí)的「目標(biāo)檢測」算法綜述
  11. RCNN- 將CNN引入目標(biāo)檢測的開山之作
    12.https://blog.csdn.net/briblue/article/details/84794511
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丝里,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子体谒,更是在濱河造成了極大的恐慌杯聚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抒痒,死亡現(xiàn)場離奇詭異幌绍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門傀广,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颁独,“玉大人,你說我怎么就攤上這事主儡〗蔽ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵糜值,是天一觀的道長丰捷。 經(jīng)常有香客問我,道長寂汇,這世上最難降的妖魔是什么病往? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮骄瓣,結(jié)果婚禮上停巷,老公的妹妹穿的比我還像新娘。我一直安慰自己榕栏,他們只是感情好畔勤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扒磁,像睡著了一般庆揪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妨托,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天缸榛,我揣著相機(jī)與錄音,去河邊找鬼兰伤。 笑死内颗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敦腔。 我是一名探鬼主播均澳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼会烙!你這毒婦竟也來了负懦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤柏腻,失蹤者是張志新(化名)和其女友劉穎纸厉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體五嫂,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颗品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年肯尺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躯枢。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡则吟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锄蹂,到底是詐尸還是另有隱情氓仲,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布得糜,位于F島的核電站敬扛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朝抖。R本人自食惡果不足惜啥箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望治宣。 院中可真熱鬧急侥,春花似錦、人聲如沸侮邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊茧。三九已至陕悬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間按傅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工胧卤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唯绍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓枝誊,卻偏偏與公主長得像况芒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子叶撒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容