(轉)基於深度學習的物體檢測


 

本文轉自:http://www.cosmosshadow.com/ml/%E5%BA%94%E7%94%A8/2015/12/07/%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B.html

 

物體檢測

RCNN

Rich feature hierarchies for accurate object detection and semantic segmentation 
早期,使用窗口掃描進行物體識別,計算量大。 
RCNN去掉窗口掃描,用聚類方式,對圖像進行分割分組,得到多個侯選框的層次組。

  • 原始圖片通過Selective Search提取候選框,約有2k個
  • 侯選框縮放成固定大小
  • 經過CNN
  • 經兩個全連接后,分類

 

Fast RCNN

Fast R-CNN 
RCNN中有CNN重復計算,Fast RCNN則去掉重復計算,並微調選框位置。

  • 整圖經過CNN,得到特征圖
  • 提取域候選框
  • 把候選框投影到特征圖上,Pooling采樣成固定大小
  • 經兩個全連接后,分類與微調選框位置

 

Faster RCNN

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 
提取候選框運行在CPU上,耗時2s,效率低下。 
Faster RCNN使用CNN來預測候選框。

  • 整圖經過CNN,得到特征圖
  • 經過核為 3×3×2563×3×256 的卷積,每個點上預測k個anchor box是否是物體,並微調anchor box的位置
  • 提取出物體框后,采用Fast RCNN同樣的方式,進行分類
  • 選框與分類共用一個CNN網絡

anchor box的設置應比較好的覆蓋到不同大小區域,如下圖:

一張1000×6001000×600的圖片,大概可以得到20k個anchor box(60×40×960×40×9)。

 

R-FCN

R-FCN: Object Detection via Region-based Fully Convolutional Networks 
RCNN系列(RCNN、Fast RCNN、Faster RCNN)中,網絡由兩個子CNN構成。在圖片分類中,只需一個CNN,效率非常高。所以物體檢測是不是也可以只用一個CNN? 
圖片分類需要兼容形變,而物體檢測需要利用形變,如何平衡? 
R-FCN利用在CNN的最后進行位置相關的特征pooling來解決以上兩個問題。

經普通CNN后,做有 k2(C+1)k2(C+1) 個 channel 的卷積,生成位置相關的特征(position-sensitive score maps)。 
CC 表示分類數,加 11 表示背景,kk 表示后續要pooling 的大小,所以生成 k2k2 倍的channel,以應對后面的空間pooling。

普通CNN后,還有一個RPN(Region Proposal Network),生成候選框。 
假設一個候選框大小為 w×hw×h,將它投影在位置相關的特征上,並采用average-pooling的方式生成一個 k×k×k2(C+1)k×k×k2(C+1) 的塊(與Fast RCNN一樣),再采用空間相關的pooling(k×kk×k平面上每一個點取channel上對應的部分數據),生成 k×k×(C+1)k×k×(C+1)的塊,最后再做average-pooling生成 C+1C+1 的塊,最后做softmax生成分類概率。 
類似的,RPN也可以采用空間pooling的結構,生成一個channel為 4k24k2的特征層。 
空間pooling的具體操作可以參考下面。

訓練與SSD相似,正負點取一個常數,如128。除去正點,剩下的所有使用概率最高的負點。

 

YOLO

You Only Look Once: Unified, Real-Time Object Detection 
Faster RCNN需要對20k個anchor box進行判斷是否是物體,然后再進行物體識別,分成了兩步。 
YOLO則把物體框的選擇與識別進行了結合,一步輸出,即變成”You Only Look Once”。

  • 把原始圖片縮放成448×448448×448大小
  • 運行單個CNN
  • 計算物體中心是否落入單元格、物體的位置、物體的類別

模型如下:

  • 把縮放成統一大小的圖片分割成S×SS×S的單元格
  • 每個單元格輸出B個矩形框(冗余設計),包含框的位置信息(x, y, w, h)與物體概率P(Object)P(Object)
  • 每個單元格再輸出C個類別的條件概率P(ClassObject)P(Class∣Object)
  • 最終輸出層應有S×S×(B5+C)S×S×(B∗5+C)個單元
  • x, y 是每個單元格的相對位置
  • w, h 是整圖的相對大小

分類的概率

P(Class)=P(ClassObject)P(Object)P(Class)=P(Class∣Object)⋅P(Object)

在原論文中,S = 7,B = 2,C = 20,所以輸出的單元數為7×7×307×7×30。

代價函數:

J=λcoordi=0S2j=0B1objij(xix^i)2+(yiy^i)2+λcoordi=0S2j=0B1objij(wi−−√w^i−−√)2+(hi−−√h^i−−√)2+i=0S2j=0B1objij(CiC^i)2+λnoobji=0S2j=0B1noobjij(CiC^i)2+i=0S21objijcclasses(pi(c)p^i(c))2J=λcoord∑i=0S2∑j=0B1ijobj(xi−x^i)2+(yi−y^i)2+λcoord∑i=0S2∑j=0B1ijobj(wi−w^i)2+(hi−h^i)2+∑i=0S2∑j=0B1ijobj(Ci−C^i)2+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2+∑i=0S21ijobj∑c∈classes(pi(c)−p^i(c))2

其中 λcoord=5λcoord=5,λnoobj=0.5λnoobj=0.5。 
一般,ww 與 hh 不是在 [0,1][0,1] 上的均勻分布,偏小,所以開方。

 

SSD

SSD: Single Shot MultiBox Detector 
YOLO在 7×77×7 的框架下識別物體,遇到大量小物體時,難以處理。 
SSD則在不同層級的feature map下進行識別,能夠覆蓋更多范圍。

假設在 mm 層 feature map 上進行識別,則第 kk 層的基本比例為

sk=smin+smaxsminm1(k1)k[1,m]sk=smin+smax−sminm−1(k−1)k∈[1,m]

比如 smin=0.2smin=0.2,smax=0.95smax=0.95,表示整張圖片識別物體所占比最小 0.2,最大 0.95。 
在基本比例上,再取多個長寬比,令 a={1,2,3,1/2,1/3}a={1,2,3,1/2,1/3},長寬分別為

wik=skai−−√hik=sk/ai−−√i[1,5]wki=skaihki=sk/aii∈[1,5]
w6k=sksk+1−−−−−√h6k=sksk+1−−−−−√wk6=sksk+1hk6=sksk+1

Match策略上,取ground truth與以上生成的格子重疊率大於0.5的。

SSD vs YOLO

位置采用Smooth L1 Regression,分類采用Softmax。 
代價函數為

L=Lconf(x,c)+αLloc(x,l,g))L=Lconf(x,c)+α⋅Lloc(x,l,g))

xx 表示類別輸出,cc 表示目標分類,ll 表示位置輸出,gg 表示目標位置, αα是比例常數,可取1。 
訓練過程中負點遠多於正點,所以只取負點中,概率最大的幾個,數量與正點成 3:13:1 。

 

NMS

以上方法,同一物體可能有多個預測值。 
可用NMS(Non-maximum suppression,非極大值抑制)來去重。

如上圖所示,一共有6個識別為人的框,每一個框有一個置信率。 
現在需要消除多余的:

  • 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
  • 取最大0.95的框為一個物體框
  • 剩余5個框中,去掉與0.95框重疊率大於0.6(可以另行設置),則保留0.9, 0.8, 0.7三個框
  • 重復上面的步驟,直到沒有框了,0.9為一個框
  • 選出來的為: 0.95, 0.9

兩個矩形的重疊率計算方式如下:

如圖,兩個矩形的面積分別為A, B

  • 取兩個矩形左上角坐標的最大值x1_max, y1_max
  • 取兩個矩形右下角坐標的最小值x2_min, y2_min
  • 重疊區域的寬w為max(0, x2_min - x1_max),高h為max(0, y2_min - y1_max)
  • 重疊率為 w×hA+Bw×hw×hA+B−w×h

 

xywh VS xyxy

系列論文中,位置都用 (x,y,w,h)(x,y,w,h) 來表示,沒有用左上角、右下角 (x,y,x,y)(x,y,x,y) 來表示。 
初衷是當 (w,h)(w,h) 正確時,(x,y)(x,y) 一點錯,會導致整個框就不准了。 
在初步的實際實驗中,(x,y,x,y)(x,y,x,y) 效果要差一些。

背后的邏輯,物體位置用 (x,y,w,h)(x,y,w,h) 來學習比較容易。 
(x,y)(x,y) 只需要位置相關的加權就能計算出來; 
(w,h)(w,h) 就更簡單了,直接特征值相加即可。
























免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM