[图解]小白都能看懂的FASTER R-CNN – 原理和实现细节
Contents?[hide]
- 1?論文原文
- 2?介紹
- 3?Anchors
- 3.1?如何確定一個anchor是正樣本還是負樣本?
- 4?實現(xiàn)細節(jié)
- 5?調(diào)試信息
- 6?參考資料
論文原文
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
介紹
Faster RCNN由Ross B. Girshick在2016年提出,是RCNN系列的延續(xù)和經(jīng)典版本。由于圖像中的目標數(shù)量和位置并不確定,卷積神經(jīng)網(wǎng)絡本身是難以處理檢測這樣的問題的。
為了解決這個問題,Faster RCNN使用Anchor和分類器將原本的檢測任務巧妙地轉(zhuǎn)換成了卷積神經(jīng)網(wǎng)絡善于處理的分類和回歸任務。數(shù)以萬計事先指定好位置和大小的Anchor在圖像上滑動,由一個RPN (Region Proposal Network) 來判斷每個Anchor中是否有物體,這樣就將不確定數(shù)量的目標檢測問題變成了一個確定的幾萬個子區(qū)域的二分類問題。
RPN網(wǎng)絡接收的輸入是圖像經(jīng)過backbone(如resnet50)的特征圖,根據(jù)事先指定好的Anchor,輸出這些Anchor中有物體的概率,要注意RPN只能夠區(qū)分有沒有物體,而無法知道物體具體是什么類別的,這也是兩階段檢測器的特性。
?
? (上圖為Anchor在圖片中滑動)
由于Anchor的大小是事先指定的,可能并不完全與目標的位置重合,因此RPN還有另外一項重要的任務:給輸出的檢測框做回歸,修正Anchor的位置。最終RPN的輸出結果是這樣的:(為了便于演示省略了很多概率為0的區(qū)域)
在論文中,RPN網(wǎng)絡為CNN后面接一個3×3的卷積層,再接兩個并列的(sibling)1×1的卷積層,其中一個是用來給softmax層進行分類(2分類,有物體還是沒有物體),另一個用于給候選區(qū)域精確定位(框位置的偏移)。
Anchors
Anchors是一些預設大小的框,論文中Anchors的面積有三種?ANCHOR_AREAS = [128**2,256**2,512**2], 長寬比也有三種?ANCHOR_RATIOS = [0.5,1,2],所以一共有9種大小的Anchors,即k=9。Anchors的大小如下圖所示:
?
寫成坐標的形式為:
| 1 2 3 4 5 6 7 8 9 10 | [[ -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.]] |
原文中Anchors的stride為16,也就是Anchor以步長16在原圖中滑動。對于一張1000*600的圖像,總共大約有20000個anchors(≈60×40×9),如果忽略越過圖像邊界的anchor,在訓練時每張圖像總共有約6000個anchor。
一張圖片中有這么多的Anchor,一次全部訓練是不太現(xiàn)實的,這相當于6000張小圖像的二分類問題在一個batch中完成,(當然你要是有幾百個G的顯存可以忽略)。另外,這些Anchor的正負樣本也是不均勻的,大部分的Anchor都是沒有物體的背景,如果同時訓練可能會造成偏差。
解決這兩個問題的方法是每次只隨機選取一部分Anchor進行訓練,在原論文中,每次在所有的Anchor中隨機選取256個,并讓它們盡量保持正樣本和負樣本為1:1,這個參數(shù)可以看成是每張圖片的batch_size,在程序中也一般命名為batch_size_per_image。
如何確定一個anchor是正樣本還是負樣本?
一個anchor如果滿足以下兩個條件之一的被認為是正樣本:
(i) 這個anchor和ground truth的方框有著最大的IoU重疊。
(ii) 這個anchor和ground truth的方框有超過0.7的IoU重疊。
?
一個anchor如果滿足以下條件的被認為是負樣本:
(i) 這個anchor和ground truth的方框的IoU重疊小于0.3。
?
?
既不是正樣本也不是負樣本的anchor在訓練中不被使用。
實現(xiàn)細節(jié)
?
1.所有輸入圖像都被縮放成短邊600像素(長邊不超過1000像素)。
假設輸入圖像尺寸為354(寬)×480,會被縮放為600×814,(記為image_scale),然后按照[batch, height, width, channel]即[1, 814, 600, 3]的尺寸輸入網(wǎng)絡。
2.對于vgg16網(wǎng)絡,輸入圖像會被映射成512維的特征圖。
由vgg網(wǎng)絡的代碼(conv5層之前):
?
| 1 2 3 4 5 6 7 8 ? 9 10 11 12 ? 13 14 15 | net = slim.repeat(self._image, 2, slim.conv2d, 64, [3, 3], ??????????????????trainable=False, scope='conv1') net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool1') ? net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], ??????????????????trainable=False, scope='conv2') net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool2') net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], ??????????????????trainable=is_training, scope='conv3') net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool3') net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], ??????????????????trainable=is_training, scope='conv4') net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool4') net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], ??????????????????trainable=is_training, scope='conv5') |
image_scale經(jīng)過了4個池化層(卷積層由于有padding不會改變feature maps長和寬),所以得到的feature maps的尺寸為image_scale的1/16,也就是[1, 51, 38, 512]。
3.Anchors的個數(shù)為51×38×9(已知k=9)。
因此rpn網(wǎng)絡分類的輸出尺寸為[1, 51, 38, 18],其中后一半[:, :, :, 9:]表示正樣本的概率,前一半[:, :, :, :9]表示負樣本的概率。
而矩形框偏移回歸的輸出尺寸為[1, 51, 38, 36],(36=9×4),每個proposed region的4個參數(shù)是輸出的矩形框(roi)相對于anchor進行平移縮放的4個系數(shù)。
rpn網(wǎng)絡最終輸出的矩形框位置是anchor的位置和偏移位置計算出來的,具體計算方式見參考資料。
由于roi網(wǎng)絡輸出的方框很多(51×38×9≈17000個),原文中的做法是先clip_boxes,即去掉與邊界交叉的方框(剩下5000個左右的anchor),然后使用非極大值抑制(NMS)來去掉重疊的方框,最終只保留2000或300個方框(取決于訓練還是測試)。
非極大值抑制(NMS)的原理:
用普通話翻譯一下非極大值抑制就是:不是局部的最大值的那些值都滾蛋
由于score越大越接近期待值,因此將與score最大的方框IoU>0.7的都去除。
4.ROI pooling的詳細過程。
由于分類器的輸入尺寸需要是統(tǒng)一的,但是RPN給出的檢測框大小并不相同,因此需要ROI pooling的操作。
將rpn輸出的300個大小不同的方框從feature maps上對應的位置裁剪(crop)下來,然后縮放(resize)成14×14大小,這時候所有的方框可以表示為尺寸為[300, 14, 14, 512]的張量,再使用一個2×2的max_pool,得到的roi_pooling的結果尺寸為[300, 7, 7, 512]。
5.測試的詳細過程。
測試過程中,輸入的圖像經(jīng)過預測模型會輸出[300 21]的分值以及[300 84]的方框位置。(設置網(wǎng)絡保留300個方框,需要預測的種類為20類(pascal voc),加上背景一類)。
然后設定一個得分的閾值(比如0.95),大于該閾值的方框會被保留。如下圖所示:
?
最后再使用一次NMS,對于多個重合的方框只保留一個。結果如下圖所示:
?
調(diào)試信息
| 1 2 3 4 5 6 7 8 9 | _image shape: (1, 814, 600, 3) feature_maps shape: [??1??51??38 512] rpn_cls_score shape: [ 1 51 38 18]??# 2k=18 rpn_bbox_pred shape: [ 1 51 38 36]??# 4k=36 rois shape: [300?? 5]??# [:,0]全是0 roi_pooling shape: [300?? 7?? 7 512] cls_prob shape: [300??21] bbox_pred shape: [300??84] |
參考資料
GitHub - endernewton/tf-faster-rcnn: Tensorflow Faster RCNN for Object Detection
https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
一文讀懂Faster RCNN - 知乎
總結
以上是生活随笔為你收集整理的[图解]小白都能看懂的FASTER R-CNN – 原理和实现细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝来分期怎么没有了是不是不用还了
- 下一篇: 汽车保险购买后还可以增加险种吗