參考列表
Selective Search for Object Recognition
Selective Search for Object Recognition(菜菜鳥小Q的專欄)
Selective Search for Object Recognition(Surge)
Selective Search for Object Recognition(原始論文)
Efficient Graph-Based Image Segmentation(快速圖像分割)
Homepage of Koen van de Sande
非極大值抑制(Non-maximum suppression)在物體檢測領域的應用
Efficient Non Maximum Suppression 筆記(不完整版)
如何評價rcnn、fast-rcnn和faster-rcnn這一系列方法?
RCNN的安裝與簡單使用
Ross B. Girshick(RCNN系列開創者)
rbg’s home page
RCNN
Rich feature hierarchies for accurate object detection and semantic segmentation
https://github.com/rbgirshick/rcnn
Fast RCNN
Fast R-CNN
https://github.com/rbgirshick/fast-rcnn
Faster RCNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
https://github.com/rbgirshick/py-faster-rcnn
https://github.com/ShaoqingRen/faster_rcnn
You Only Look Once
You Only Look Once: Unified, Real-Time Object Detection
YOLO Object Detection(視頻)
RCNN
最早的物體識別,是通過窗口掃描的方式進行,並且需要對圖片進行幾個級別的縮放來重復進行。
這種方式非常暴力,計算量大。
RCNN主要解決的是去掉窗口掃描,用聚類方式,對圖像進行分割分組,得到多個侯選框的層次組。
分割分組方法有很多,RCNN用到的是Selective Search。
以下就是RCNN的結構。
- 從原始圖片,通過Selective Search提取出區域候選框,有2000個左右
- 把所有侯選框縮放成固定大小
- 然后通過CNN網絡,提取特征
- 再添加兩個全鏈接層,然后再用SVM分類,回歸來微調選框位置與大小
Fast RCNN
RCNN有兩千個左右的候選框,都要進行CNN操作。但候選框有大量重疊,造成重復計算。
Fast RCNN就是解決這個問題的。
- 利用CNN(卷積神經網絡),得到整個原始圖片的特征層
- 在原始圖片上通過Selective Search等方法,提取出域候選框
- 把候選框投影到最后的特征層,並進行Max-Pooling采樣,得到固定大小的特征矩形
- 然后再通過兩個全連接層,分別用softmax分類,regressor進行選框位置與大小微調
Faster RCNN
在上面的 RCNN 與 Fast RCNN中,相對於在GPU上計算的CNN,在CPU上運行的提取候選框效率低下,一張圖片大概需要2秒。
Faster RCNN則直接利用CNN來計算候選框,方式如下:
- 原始圖片經過CNN,得到最后的卷積特征
- 利用3×3的矩形進行掃描,得到256維的向量(相當於再添加了一個卷積層,卷積核為3×3,輸出特征數為256)
- 3×3的特征層映射到最初圖片,是一塊比較大的固定區域,在此固定區域上進行長寬變形,比如分別3個縮放級別,則一共有9個不同的矩形區域,稱做anchor box。9就是上圖中的k值。
- 對上圖中的k個anchor box進行是否是物體判斷預測,和矩形框位置與大小微調
- 選出物體框后,再利用同Fast RCNN同樣的方式,對物體類別進行判斷
- 選框與分類使用同樣的CNN網絡
一張1000×600的圖片,大概可以得到20k個anchor box(60×40×9)。
anchor box的設置應比較好的覆蓋從大到小的區域,如下圖:
注
這里有一點疑惑,3×3的卷積核對應的原始圖是塊固定區域(感受野),並沒有包含區域外的信息,如何做到預測更大區域的物體位置?
或者類似於人的感知,比如只看到部分人像,推測整個人像的大小?看到老虎的頭,預測整個老虎的位置與大小?
You Only Look Once
Faster RCNN需要對20k個anchor box進行判斷是否是物體,然后再進行物體識別,分成了兩步。
YOLO(You Only Look Once)則把物體框的選擇與識別進行了結合,一步輸出,即變成”You Only Look Once”。
所以識別速度非常快,達到每秒45幀,而在快速版YOLO(Fast YOLO,卷積層更少)中,可以達到每秒155幀。
網絡的整體結構如下圖:
- 把原始圖片縮放成448×448大小
- 運行單個卷積網絡
- 得到物體的位置與類別
模型如下:
- 把縮放成統一大小的圖片分割成S×S的單元格
- 每一個單元格負責輸出B個矩形框,每一個框帶四個位置信息(x, y, w, h),與一個該框是物體的概率,用Pr(Object)或者C(Confidence)表示
- 每一個單元格再負責輸出C個類別的概率,用Pr(Class∣Object)表示
- 最終輸出層應有S×S×(B∗5+C)個單元
相關說明:
- 如果一個物體的中心落入一個單元格,則該單元格上的B個矩形框的位置信息都為該物體的位置信息,
- C個概率中對應該物體類別值為1,其它為0。
- x, y表示中心相對於單元格左上角的位置偏移,單元格左上角為(0, 0),右下角為(1, 1)
- w, h表示矩形框的寬與高,都是相對於整個圖片的相對值,全副圖片大小為(1, 1),長寬都一半就是(0.5, 0.5)
最終輸出時,是物體的概率乘以類別概率,才是整體識別到是一個物體的概率:
在論文You Only Look Once: Unified, Real-Time Object Detection中,S = 7,B = 2,C = 20。
所以輸出的單元數為7×7×30。
具體的網絡結構如下:
從上圖的結構可以看到,倒數第二層是一個全連接層,所以最終的單元輸出整合了全局信息,更好地預測圖像區域。
訓練
整個網絡最后一層為線性激活,其它層都為Leaky Rectified Linear激活方式:
因為一張圖片中,大部分單元格中都沒有落入物體中心,所以引入兩個參數λcoord=5,λnoobj=0.5。
整個網絡的代價函數變成: