日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像理解之物体检测object detection,模型rcnn/fastrcnn/fasterrcnn原理及概念

發(fā)布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像理解之物体检测object detection,模型rcnn/fastrcnn/fasterrcnn原理及概念 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

A,https://www.cnblogs.com/zhengzhe/p/7783270.html

?

RCNN選擇性搜索(Selective Search)

RCNN選擇性搜索(Selective Search)

?

基于:

1)圖片大小

2)顏色

3)紋理

4)附件

?

?

算法一:分組分類算法

輸入:(圖層顏色)圖片

輸出:對象位置假設(shè)集L

?

Obtain initial regions R = {r1,··· ,rn} using [13]

Initialise similarity set S = 空集

foreach Neighbouring region pair (ri,rj) do? ? ? ? //遍歷所有臨近的像素對

  Calculate similarity s(ri,rj)? ? ? ? ? ??    //計(jì)算所有像素對之間的相似度

  S= S∪s(ri,rj)             //把相應(yīng)的相似度保存在集合S中

?

while S≠空集 do

  Get highest similarity s(ri,rj) = max(S)          //從集合S中取出相似度最高的像素對

  Merge corresponding regions rt = ri ∪rj         //把兩個像素進(jìn)行合并

  Remove similarities regarding ri : S = S \ s(ri,r?)      //從集合S中除去和ri有關(guān)的相似度

  Remove similarities regarding rj : S = S \ s(r?,rj)      //從集合S中除去和rj有關(guān)的相似度

  Calculate similarity set St between rt and its neighbours    //計(jì)算rt和臨近像素點(diǎn)的相似度

  S = S∪St                      //將相似度存入集合S中

  R = R∪rt                      //將rt存入集合R中

?

Extract object location boxes L from all regions in R

?

?

優(yōu)先合并以下四種區(qū)域:?
- 顏色(顏色直方圖)相近的?
- 紋理(梯度直方圖)相近的?
- 合并后總面積小的?
- 合并后,總面積在其BBOX中所占比例大的

第三條,保證合并操作的尺度較為均勻,避免一個大區(qū)域陸續(xù)“吃掉”其他小區(qū)域。(Get highest similarity s(ri,rj) = max(S)通過此處實(shí)現(xiàn))

例:設(shè)有區(qū)域a-b-c-d-e-f-g-h。較好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。?
不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

?

第四條,保證合并后形狀規(guī)則。

例:左圖適于合并,右圖不適于合并。

上述四條規(guī)則只涉及區(qū)域的顏色直方圖、紋理直方圖、面積和位置。合并后的區(qū)域特征可以直接由子區(qū)域特征計(jì)算而來,速度較快。

?

?

B,https://www.cnblogs.com/dudumiaomiao/p/6560841.html

R-CNN --> FAST-RCNN --> FASTER-RCNN

?

R-CNN:

(1)輸入測試圖像;

(2)利用selective search 算法在圖像中從上到下提取2000個左右的Region Proposal;

(3)將每個Region Proposal縮放(warp)成227*227的大小并輸入到CNN,將CNN的fc7層的輸出作為特征;

(4)將每個Region Proposal提取的CNN特征輸入到SVM進(jìn)行分類;

(5)對于SVM分好類的Region Proposal做邊框回歸,用Bounding box回歸值校正原來的建議窗口,生成預(yù)測窗口坐標(biāo).

缺陷:

(1)???? 訓(xùn)練分為多個階段,步驟繁瑣:微調(diào)網(wǎng)絡(luò)+訓(xùn)練SVM+訓(xùn)練邊框回歸器;

(2)???? 訓(xùn)練耗時,占用磁盤空間大;5000張圖像產(chǎn)生幾百G的特征文件;

(3)???? 速度慢:使用GPU,VGG16模型處理一張圖像需要47s;

(4)???? 測試速度慢:每個候選區(qū)域需要運(yùn)行整個前向CNN計(jì)算;

(5)???? SVM和回歸是事后操作,在SVM和回歸過程中CNN特征沒有被學(xué)習(xí)更新.

?

FAST-RCNN:

(1)輸入測試圖像;

(2)利用selective search 算法在圖像中從上到下提取2000個左右的建議窗口(Region Proposal);

(3)將整張圖片輸入CNN,進(jìn)行特征提取;

(4)把建議窗口映射到CNN的最后一層卷積feature map上;

(5)通過RoI pooling層使每個建議窗口生成固定尺寸的feature map;

(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯(lián)合訓(xùn)練.

?

相比R-CNN,主要兩處不同:

(1)最后一層卷積層后加了一個ROI pooling layer;

(2)損失函數(shù)使用了多任務(wù)損失函數(shù)(multi-task loss),將邊框回歸直接加入到CNN網(wǎng)絡(luò)中訓(xùn)練

改進(jìn):

(1)???? 測試時速度慢:R-CNN把一張圖像分解成大量的建議框,每個建議框拉伸形成的圖像都會單獨(dú)通過CNN提取特征.實(shí)際上這些建議框之間大量重疊,特征值之間完全可以共享,造成了運(yùn)算能力的浪費(fèi).

FAST-RCNN將整張圖像歸一化后直接送入CNN,在最后的卷積層輸出的feature map上,加入建議框信息,使得在此之前的CNN運(yùn)算得以共享.

(2)???? 訓(xùn)練時速度慢:R-CNN在訓(xùn)練時,是在采用SVM分類之前,把通過CNN提取的特征存儲在硬盤上.這種方法造成了訓(xùn)練性能低下,因?yàn)樵谟脖P上大量的讀寫數(shù)據(jù)會造成訓(xùn)練速度緩慢.

FAST-RCNN在訓(xùn)練時,只需要將一張圖像送入網(wǎng)絡(luò),每張圖像一次性地提取CNN特征和建議區(qū)域,訓(xùn)練數(shù)據(jù)在GPU內(nèi)存里直接進(jìn)Loss層,這樣候選區(qū)域的前幾層特征不需要再重復(fù)計(jì)算且不再需要把大量數(shù)據(jù)存儲在硬盤上.

(3)???? 訓(xùn)練所需空間大:R-CNN中獨(dú)立的SVM分類器和回歸器需要大量特征作為訓(xùn)練樣本,需要大量的硬盤空間.FAST-RCNN把類別判斷和位置回歸統(tǒng)一用深度網(wǎng)絡(luò)實(shí)現(xiàn),不再需要額外存儲.

?

FASTER -RCNN:

(1)輸入測試圖像;

(2)將整張圖片輸入CNN,進(jìn)行特征提取;

(3)用RPN生成建議窗口(proposals),每張圖片生成300個建議窗口;

(4)把建議窗口映射到CNN的最后一層卷積feature map上;

(5)通過RoI pooling層使每個RoI生成固定尺寸的feature map;

(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯(lián)合訓(xùn)練.

?

相比FASTER-RCNN,主要兩處不同:

(1)使用RPN(Region Proposal Network)代替原來的Selective Search方法產(chǎn)生建議窗口;

(2)產(chǎn)生建議窗口的CNN和目標(biāo)檢測的CNN共享

?

改進(jìn):

(1)???? 如何高效快速產(chǎn)生建議框?

FASTER-RCNN創(chuàng)造性地采用卷積網(wǎng)絡(luò)自行產(chǎn)生建議框,并且和目標(biāo)檢測網(wǎng)絡(luò)共享卷積網(wǎng)絡(luò),使得建議框數(shù)目從原有的約2000個減少為300個,且建議框的質(zhì)量也有本質(zhì)的提高.

?

概念解釋:

1、常用的Region Proposal有:

-Selective Search

-Edge Boxes

?

2、softmax-loss
softmax-loss 層和 softmax 層計(jì)算大致是相同的. softmax 是一個分類器,計(jì)算的是類別的概率(Likelihood),是 Logistic Regression 的一種推廣. Logistic Regression 只能用于二分類,
而 softmax 可以用于多分類.
softmax 與 softmax-loss 的區(qū)別:
softmax 計(jì)算公式:



關(guān)于兩者的區(qū)別更加具體的介紹,可參考: softmax vs. softmax-loss
用戶可能最終目的就是得到各個類別的概率似然值,這個時候就只需要一個 Softmax 層,而不一定要進(jìn)行 softmax-Loss 操作;或者是用戶有通過其他什么方式已經(jīng)得到了某種概率似然值,然后要做最大似然估計(jì),此時則只需要后面的 softmax-Loss 而不需要前面的 Softmax操作.因此提供兩個不同的 Layer 結(jié)構(gòu)比只提供一個合在一起的 Softmax-Loss Layer 要靈活許多.不管是 softmax layer 還是 softmax-loss layer,都是沒有參數(shù)的,只是層類型不同而已
softmax-loss layer:輸出 loss 值
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip1"
bottom: "label"
top: "loss"
}
softmax layer: 輸出似然值
layers {
bottom: "cls3_fc"
top: "prob"
name: "prob"
type: “Softmax"
}

?

3、Selective Search

這個策略其實(shí)是借助了層次聚類的思想(可以搜索了解一下"層次聚類算法"),將層次聚類的思想應(yīng)用到區(qū)域的合并上面;

總體思路:

l? 假設(shè)現(xiàn)在圖像上有n個預(yù)分割的區(qū)域(Efficient Graph-Based Image Segmentation),表示為R={R1, R2, ..., Rn},

l? 計(jì)算每個region與它相鄰region(注意是相鄰的區(qū)域)的相似度,這樣會得到一個n*n的相似度矩陣(同一個區(qū)域之間和一個區(qū)域與不相鄰區(qū)域之間的相似度可設(shè)為NaN),從矩陣中找出最大相似度值對應(yīng)的兩個區(qū)域,將這兩個區(qū)域合二為一,這時候圖像上還剩下n-1個區(qū)域;

l? 重復(fù)上面的過程(只需要計(jì)算新的區(qū)域與它相鄰區(qū)域的新相似度,其他的不用重復(fù)計(jì)算),重復(fù)一次,區(qū)域的總數(shù)目就少1,知道最后所有的區(qū)域都合并稱為了同一個區(qū)域(即此過程進(jìn)行了n-1次,區(qū)域總數(shù)目最后變成了1).算法的流程圖如下圖所示:

?

?

4、SPP-NET

SSP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

? ?先看一下R-CNN為什么檢測速度這么慢,一張圖都需要47s!仔細(xì)看下R-CNN框架發(fā)現(xiàn),對圖像提完Region Proposal(2000個左右)之后將每個Proposal當(dāng)成一張圖像進(jìn)行后續(xù)處理(CNN提特征+SVM分類),實(shí)際上對一張圖像進(jìn)行了2000次提特征和分類的過程!這2000個Region Proposal不都是圖像的一部分嗎,那么我們完全可以對圖像提一次卷積層特征,然后只需要將Region Proposal在原圖的位置映射到卷積層特征圖上,這樣對于一張圖像我們只需要提一次卷積層特征,然后將每個Region Proposal的卷積層特征輸入到全連接層做后續(xù)操作.(對于CNN來說,大部分運(yùn)算都耗在卷積操作上,這樣做可以節(jié)省大量時間).

? ?現(xiàn)在的問題是每個Region Proposal的尺度不一樣,直接這樣輸入全連接層肯定是不行的,因?yàn)槿B接層輸入必須是固定的長度.SPP-NET恰好可以解決這個問題.

? ? ?

? ?由于傳統(tǒng)的CNN限制了輸入必須固定大小(比如AlexNet是224x224),所以在實(shí)際使用中往往需要對原圖片進(jìn)行crop或者warp的操作:
?? - crop:截取原圖片的一個固定大小的patch
? ?- warp:將原圖片的ROI縮放到一個固定大小的patch

? ?無論是crop還是warp,都無法保證在不失真的情況下將圖片傳入到CNN當(dāng)中:
? ?- crop:物體可能會產(chǎn)生截?cái)?#xff0c;尤其是長寬比大的圖片.
? ?- warp:物體被拉伸,失去“原形”,尤其是長寬比大的圖片

? ?SPP為的就是解決上述的問題,做到的效果為:不管輸入的圖片是什么尺度,都能夠正確的傳入網(wǎng)絡(luò).
? ?具體思路為:CNN的卷積層是可以處理任意尺度的輸入的,只是在全連接層處有限制尺度——換句話說,如果找到一個方法,在全連接層之前將其輸入限制到等長,那么就解決了這個問題.

? ?具體方案如下圖所示:

? ?

如果原圖輸入是224x224,對于conv5出來后的輸出,是13x13x256的,可以理解成有256個這樣的filter,每個filter對應(yīng)一張13x13的activation map.如果像上圖那樣將activation?map pooling成4x4 2x2 1x1三張子圖,做max pooling后,出來的特征就是固定長度的(16+4+1)x256那么多的維度了.如果原圖的輸入不是224x224,出來的特征依然是(16+4+1)x256;直覺地說,可以理解成將原來固定大小為(3x3)窗口的pool5改成了自適應(yīng)窗口大小,窗口的大小和activation map成比例,保證了經(jīng)過pooling后出來的feature的長度是一致的.

?

5、Bounding box regression

R-CNN中的bounding box回歸

下面先介紹R-CNN和Fast R-CNN中所用到的邊框回歸方法.

(1)?? 什么是IOU?

(2)?? 為什么要做Bounding-box regression??
?
如上圖所示,綠色的框?yàn)轱w機(jī)的Ground Truth,紅色的框是提取的Region Proposal.那么即便紅色的框被分類器識別為飛機(jī),但是由于紅色的框定位不準(zhǔn)(IoU<0.5),那么這張圖相當(dāng)于沒有正確的檢測出飛機(jī).如果我們能對紅色的框進(jìn)行微調(diào),使得經(jīng)過微調(diào)后的窗口跟Ground Truth更接近,這樣豈不是定位會更準(zhǔn)確.確實(shí),Bounding-box regression 就是用來微調(diào)這個窗口的.

(3)?? 回歸/微調(diào)的對象是什么??

(4)?? Bounding-box regression(邊框回歸)?
那么經(jīng)過何種變換才能從圖11中的窗口P變?yōu)榇翱谀?#xff1f;比較簡單的思路就是:?
?


注意:只有當(dāng)Proposal和Ground Truth比較接近時(線性問題),我們才能將其作為訓(xùn)練樣本訓(xùn)練我們的線性回歸模型,否則會導(dǎo)致訓(xùn)練的回歸模型不work(當(dāng)Proposal跟GT離得較遠(yuǎn),就是復(fù)雜的非線性問題了,此時用線性回歸建模顯然不合理).這個也是G-CNN: an Iterative Grid Based Object Detector多次迭代實(shí)現(xiàn)目標(biāo)準(zhǔn)確定位的關(guān)鍵.?
線性回歸就是給定輸入的特征向量X,學(xué)習(xí)一組參數(shù)W,使得經(jīng)過線性回歸后的值跟真實(shí)值Y(Ground Truth)非常接近.即.那么Bounding-box中我們的輸入以及輸出分別是什么呢??

?????

? ? ? ? ? ? ? ? ? ? ?

6、Region Proposal Network

RPN的實(shí)現(xiàn)方式:在conv5-3的卷積feature map上用一個n*n的滑窗(論文中作者選用了n=3,即3*3的滑窗)生成一個長度為256(對應(yīng)于ZF網(wǎng)絡(luò))或512(對應(yīng)于VGG網(wǎng)絡(luò))維長度的全連接特征.然后在這個256維或512維的特征后產(chǎn)生兩個分支的全連接層:

(1)reg-layer,用于預(yù)測proposal的中心錨點(diǎn)對應(yīng)的proposal的坐標(biāo)x,y和寬高w,h;

(2)cls-layer,用于判定該proposal是前景還是背景.sliding window的處理方式保證reg-layer和cls-layer關(guān)聯(lián)了conv5-3的全部特征空間.事實(shí)上,作者用全連接層實(shí)現(xiàn)方式介紹RPN層實(shí)現(xiàn)容易幫助我們理解這一過程,但在實(shí)現(xiàn)時作者選用了卷積層實(shí)現(xiàn)全連接層的功能.

(3)個人理解:全連接層本來就是特殊的卷積層,如果產(chǎn)生256或512維的fc特征,事實(shí)上可以用Num_out=256或512, kernel_size=3*3, stride=1的卷積層實(shí)現(xiàn)conv5-3到第一個全連接特征的映射.然后再用兩個Num_out分別為2*9=18和4*9=36,kernel_size=1*1,stride=1的卷積層實(shí)現(xiàn)上一層特征到兩個分支cls層和reg層的特征映射.

(4)注意:這里2*9中的2指cls層的分類結(jié)果包括前后背景兩類,4*9的4表示一個Proposal的中心點(diǎn)坐標(biāo)x,y和寬高w,h四個參數(shù).采用卷積的方式實(shí)現(xiàn)全連接處理并不會減少參數(shù)的數(shù)量,但是使得輸入圖像的尺寸可以更加靈活.在RPN網(wǎng)絡(luò)中,我們需要重點(diǎn)理解其中的anchors概念,Loss fucntions計(jì)算方式和RPN層訓(xùn)練數(shù)據(jù)生成的具體細(xì)節(jié).

?

Anchors:字面上可以理解為錨點(diǎn),位于之前提到的n*n的sliding window的中心處.對于一個sliding window,我們可以同時預(yù)測多個proposal,假定有k個.k個proposal即k個reference boxes,每一個reference box又可以用一個scale,一個aspect_ratio和sliding window中的錨點(diǎn)唯一確定.所以,我們在后面說一個anchor,你就理解成一個anchor box 或一個reference box.作者在論文中定義k=9,即3種scales和3種aspect_ratio確定出當(dāng)前sliding window位置處對應(yīng)的9個reference boxes, 4*k個reg-layer的輸出和2*k個cls-layer的score輸出.對于一幅W*H的feature map,對應(yīng)W*H*k個錨點(diǎn).所有的錨點(diǎn)都具有尺度不變性.

Loss functions:

在計(jì)算Loss值之前,作者設(shè)置了anchors的標(biāo)定方法.正樣本標(biāo)定規(guī)則:

1)?? 如果Anchor對應(yīng)的reference box與ground truth的IoU值最大,標(biāo)記為正樣本;

2)?? 如果Anchor對應(yīng)的reference box與ground truth的IoU>0.7,標(biāo)記為正樣本.事實(shí)上,采用第2個規(guī)則基本上可以找到足夠的正樣本,但是對于一些極端情況,例如所有的Anchor對應(yīng)的reference box與groud truth的IoU不大于0.7,可以采用第一種規(guī)則生成.

3)?? 負(fù)樣本標(biāo)定規(guī)則:如果Anchor對應(yīng)的reference box與ground truth的IoU<0.3,標(biāo)記為負(fù)樣本.

4)?? 剩下的既不是正樣本也不是負(fù)樣本,不用于最終訓(xùn)練.

5)?? 訓(xùn)練RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重組成的.

計(jì)算softmax loss需要的是anchors對應(yīng)的groundtruth標(biāo)定結(jié)果和預(yù)測結(jié)果,計(jì)算regression loss需要三組信息:

?? i. ? ? 預(yù)測框,即RPN網(wǎng)絡(luò)預(yù)測出的proposal的中心位置坐標(biāo)x,y和寬高w,h;

?ii.????? 錨點(diǎn)reference box:

? ? ? ? 之前的9個錨點(diǎn)對應(yīng)9個不同scale和aspect_ratio的reference boxes,每一個reference boxes都有一個中心點(diǎn)位置坐標(biāo)x_a,y_a和寬高w_a,h_a;

iii. ?ground truth:標(biāo)定的框也對應(yīng)一個中心點(diǎn)位置坐標(biāo)x*,y*和寬高w*,h*.因此計(jì)算regression loss和總Loss方式如下:?

?

RPN訓(xùn)練設(shè)置:

(1)在訓(xùn)練RPN時,一個Mini-batch是由一幅圖像中任意選取的256個proposal組成的,其中正負(fù)樣本的比例為1:1.

(2)如果正樣本不足128,則多用一些負(fù)樣本以滿足有256個Proposal可以用于訓(xùn)練,反之亦然.

(3)訓(xùn)練RPN時,與VGG共有的層參數(shù)可以直接拷貝經(jīng)ImageNet訓(xùn)練得到的模型中的參數(shù);剩下沒有的層參數(shù)用標(biāo)準(zhǔn)差=0.01的高斯分布初始化.

?

7、RoI Pooling

ROI pooling layer實(shí)際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特征圖.對于VGG16網(wǎng)絡(luò)conv5_3有512個特征圖,這樣所有region proposal對應(yīng)了一個7*7*512維度的特征向量作為全連接層的輸入.

RoI Pooling就是實(shí)現(xiàn)從原圖區(qū)域映射到conv5區(qū)域最后pooling到固定大小的功能.

?

8、smooth L1 Loss

為了處理不可導(dǎo)的懲罰,Faster RCNN提出來的計(jì)算距離loss的smooth_L1_Loss.smooth L1近似理解見http://pages.cs.wisc.edu/~gfung/GeneralL1/L1_approx_bounds.pdf

?

C,https://www.cnblogs.com/wangyong/p/8513563.html

?

Faster RCNN 學(xué)習(xí)筆記

下面的介紹都是基于VGG16 的Faster RCNN網(wǎng)絡(luò),各網(wǎng)絡(luò)的差異在于Conv layers層提取特征時有細(xì)微差異,至于后續(xù)的RPN層、Pooling層及全連接的分類和目標(biāo)定位基本相同.

?

一)、整體框架

?

我們先整體的介紹下上圖中各層主要的功能

1)、Conv layers提取特征圖:

作為一種CNN網(wǎng)絡(luò)目標(biāo)檢測方法,Faster RCNN首先使用一組基礎(chǔ)的conv+relu+pooling層提取input image的feature maps,該feature maps會用于后續(xù)的RPN層和全連接層

2)、RPN(Region Proposal Networks):

??? RPN網(wǎng)絡(luò)主要用于生成region proposals,首先生成一堆Anchor box,對其進(jìn)行裁剪過濾后通過softmax判斷anchors屬于前景(foreground)或者后景(background),即是物體or不是物體,所以這是一個二分類;同時,另一分支bounding box regression修正anchor box,形成較精確的proposal(注:這里的較精確是相對于后面全連接層的再一次box regression而言)

3)、Roi Pooling:

該層利用RPN生成的proposals和VGG16最后一層得到的feature map,得到固定大小的proposal feature map,進(jìn)入到后面可利用全連接操作來進(jìn)行目標(biāo)識別和定位

4)、Classifier:

??? 會將Roi Pooling層形成固定大小的feature map進(jìn)行全連接操作,利用Softmax進(jìn)行具體類別的分類,同時,利用L1 Loss完成bounding box regression回歸操作獲得物體的精確位置.

?

)、網(wǎng)絡(luò)結(jié)構(gòu)

?

現(xiàn)在,通過上圖開始逐層分析

1)Conv layers

Faster RCNN首先是支持輸入任意大小的圖片的,比如上圖中輸入的P*Q,進(jìn)入網(wǎng)絡(luò)之前對圖片進(jìn)行了規(guī)整化尺度的設(shè)定,如可設(shè)定圖像短邊不超過600,圖像長邊不超過1000,我們可以假定M*N=1000*600(如果圖片少于該尺寸,可以邊緣補(bǔ)0,即圖像會有黑色邊緣)

①?? 13個conv層:kernel_size=3,pad=1,stride=1;

卷積公式:

? ? ? ? ? ? ?所以,conv層不會改變圖片大小(即:輸入的圖片大小=輸出的圖片大小)

②?? 13個relu層:激活函數(shù),不改變圖片大小

③?? 4個pooling層:kernel_size=2,stride=2;pooling層會讓輸出圖片是輸入圖片的1/2

? ? ? ?經(jīng)過Conv layers,圖片大小變成(M/16)*(N/16),即:60*40(1000/16≈60,600/16≈40);則,Feature Map就是60*40*512-d(注:VGG16是512-d,ZF是256-d),表示特征圖的大小為60*40,數(shù)量為512

?

2)RPN(Region Proposal Networks):

Feature Map進(jìn)入RPN后,先經(jīng)過一次3*3的卷積,同樣,特征圖大小依然是60*40,數(shù)量512,這樣做的目的應(yīng)該是進(jìn)一步集中特征信息,接著看到兩個全卷積,即kernel_size=1*1,p=0,stride=1;

?

如上圖中標(biāo)識:

①?? rpn_cls:60*40*512-d ⊕? 1*1*512*18 ==> 60*40*9*2?

? ? ? ? ?逐像素對其9個Anchor box進(jìn)行二分類

②?? rpn_bbox:60*40*512-d ⊕? 1*1*512*36==>60*40*9*4

????????? 逐像素得到其9個Anchor box四個坐標(biāo)信息(其實(shí)是偏移量,后面介紹)

? 如下圖所示:

??

?(2.1)、Anchors的生成規(guī)則

? ? ??前面提到經(jīng)過Conv layers后,圖片大小變成了原來的1/16,令feat_stride=16,在生成Anchors時,我們先定義一個base_anchor,大小為16*16的box(因?yàn)樘卣鲌D(60*40)上的一個點(diǎn),可以對應(yīng)到原圖(1000*600)上一個16*16大小的區(qū)域),源碼中轉(zhuǎn)化為[0,0,15,15]的數(shù)組,參數(shù)ratios=[0.5,?1,?2]scales=[8, 16, 32]

? ?先看[0,0,15,15],面積保持不變,長、寬比分別為[0.5,?1,?2]是產(chǎn)生的Anchors box

?

如果經(jīng)過scales變化,即長、寬分別均為 (16*8=128)、(16*16=256)、(16*32=512),對應(yīng)anchor box如圖

?

綜合以上兩種變換,最后生成9個Anchor box

?

? ?所以,最終base_anchor=[0,0,15,15]生成的9個Anchor box坐標(biāo)如下:

1 [[ -84. -40. 99. 55.] 2 [-176. -88. 191. 103.] 3 [-360. -184. 375. 199.] 4 [ -56. -56. 71. 71.] 5 [-120. -120. 135. 135.] 6 [-248. -248. 263. 263.] 7 [ -36. -80. 51. 95.] 8 [ -80. -168. 95. 183.] 9 [-168. -344. 183. 359.]]

? ??特征圖大小為60*40,所以會一共生成60*40*9=21600個Anchor box

? 源碼中,通過width:(0~60)*16,height(0~40)*16建立shift偏移量數(shù)組,再和base_ancho基準(zhǔn)坐標(biāo)數(shù)組累加,得到特征圖上所有像素對應(yīng)的Anchors的坐標(biāo)值,是一個[216000,4]的數(shù)組

?

?(2.2)、RPN工作原理解析

為了進(jìn)一步更清楚的看懂RPN的工作原理,將Caffe版本下的網(wǎng)絡(luò)圖貼出來,對照網(wǎng)絡(luò)圖進(jìn)行講解會更清楚

?

主要看上圖中框住的‘RPN’部分的網(wǎng)絡(luò)圖,其中‘rpn_conv/3*3’是3*3的卷積,上面有提到過,接著是兩個1*1的全卷積,分別是圖中的‘rpn_cls_score’和‘rpn_bbox_pred’,在上面同樣有提到過。接下來,分析網(wǎng)絡(luò)圖中其他各部分的含義

2.2.1)、rpn-data

1. layer { 2. name: 'rpn-data' 3. type: 'Python' 4. bottom: 'rpn_cls_score' #僅提供特征圖的height和width的參數(shù)大小 5. bottom: 'gt_boxes' #ground truth box 6. bottom: 'im_info' #包含圖片大小和縮放比例,可供過濾anchor box 7. bottom: 'data' 8. top: 'rpn_labels' 9. top: 'rpn_bbox_targets' 10. top: 'rpn_bbox_inside_weights' 11. top: 'rpn_bbox_outside_weights' 12. python_param { 13. module: 'rpn.anchor_target_layer' 14. layer: 'AnchorTargetLayer' 15. param_str: "'feat_stride': 16 \n'scales': !!python/tuple [8, 16, 32]" 16. } 17. }

這一層主要是為特征圖60*40上的每個像素生成9個Anchor box,并且對生成的Anchor box進(jìn)行過濾和標(biāo)記,參照源碼,過濾和標(biāo)記規(guī)則如下:

①??? 去除掉超過1000*600這原圖的邊界的anchor box

②??? 如果anchor box與ground truth的IoU值最大,標(biāo)記為正樣本,label=1

③??? 如果anchor box與ground truth的IoU>0.7,標(biāo)記為正樣本,label=1

④??? 如果anchor box與ground truth的IoU<0.3,標(biāo)記為負(fù)樣本,label=0

? ? ?剩下的既不是正樣本也不是負(fù)樣本,不用于最終訓(xùn)練,label=-1

? ? ?什么是IoU:

? ? ?

?

? ? ?除了對anchor box進(jìn)行標(biāo)記外,另一件事情就是計(jì)算anchor box與ground truth之間的偏移量

? ?令:ground truth:標(biāo)定的框也對應(yīng)一個中心點(diǎn)位置坐標(biāo)x*,y*和寬高w*,h*

??? anchor box: 中心點(diǎn)位置坐標(biāo)x_a,y_a和寬高w_a,h_a

??? 所以,偏移量:

??? △x=(x*-x_a)/w_a?? △y=(y*-y_a)/h_a?

? ?△w=log(w*/w_a)?? △h=log(h*/h_a)

? ??通過ground truth box與預(yù)測的anchor box之間的差異來進(jìn)行學(xué)習(xí),從而是RPN網(wǎng)絡(luò)中的權(quán)重能夠?qū)W習(xí)到預(yù)測box的能力

?

2.2.2) 、rpn_loss_cls、rpn_loss_bbox、rpn_cls_prob

下面集體看下這三個,其中‘rpn_loss_cls’、‘rpn_loss_bbox’是分別對應(yīng)softmax,smooth L1計(jì)算損失函數(shù),‘rpn_cls_prob’計(jì)算概率值(可用于下一層的nms非最大值抑制操作)

補(bǔ)充:

? ? ?①?? Softmax公式,計(jì)算各分類的概率值

? ? ? ② Softmax Loss公式,RPN進(jìn)行分類時,即尋找最小Loss值

在’rpn-data’中已經(jīng)為預(yù)測框anchor box進(jìn)行了標(biāo)記,并且計(jì)算出與gt_boxes之間的偏移量,利用RPN網(wǎng)絡(luò)進(jìn)行訓(xùn)練。

RPN訓(xùn)練設(shè)置:在訓(xùn)練RPN時,一個Mini-batch是由一幅圖像中任意選取的256個proposal組成的,其中正負(fù)樣本的比例為1:1。如果正樣本不足128,則多用一些負(fù)樣本以滿足有256個Proposal可以用于訓(xùn)練,反之亦然

?

2.2.3)、proposal

1. layer { 2. name: 'proposal' 3. type: 'Python' 4. bottom: 'rpn_cls_prob_reshape' #[1,18,40,60]==> [batch_size, channel,height,width]Caffe的數(shù)據(jù)格式,anchor box分類的概率 5. bottom: 'rpn_bbox_pred' # 記錄訓(xùn)練好的四個回歸值△x, △y, △w, △h 6. bottom: 'im_info' 7. top: 'rpn_rois' 8. python_param { 9. module: 'rpn.proposal_layer' 10. layer: 'ProposalLayer' 11. param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]" 12. } 13. }

在輸入中我們看到’rpn_bbox_pred’,記錄著訓(xùn)練好的四個回歸值△x, △y, △w, △h。

源碼中,會重新生成60*40*9個anchor box,然后累加上訓(xùn)練好的△x, △y, △w, △h,從而得到了相較于之前更加準(zhǔn)確的預(yù)測框region proposal,進(jìn)一步對預(yù)測框進(jìn)行越界剔除和使用nms非最大值抑制,剔除掉重疊的框;比如,設(shè)定IoU為0.7的閾值,即僅保留覆蓋率不超過0.7的局部最大分?jǐn)?shù)的box(粗篩)。最后留下大約2000個anchor,然后再取前N個box(比如300個);這樣,進(jìn)入到下一層ROI Pooling時region proposal大約只有300個

用下圖一個案例來對NMS算法進(jìn)行簡單介紹

?

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

  • 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
  • 取最大0.95的框?yàn)橐粋€物體框
  • 剩余5個框中,去掉與0.95框重疊率IoU大于0.6(可以另行設(shè)置),則保留0.9, 0.8, 0.7三個框
  • 重復(fù)上面的步驟,直到?jīng)]有框了,0.9為一個框
  • 選出來的為: 0.95, 0.9

所以,整個過程,可以用下圖形象的表示出來

?

其中,紅色的A框是生成的anchor box,而藍(lán)色的G’框就是經(jīng)過RPN網(wǎng)絡(luò)訓(xùn)練后得到的較精確的預(yù)測框,綠色的G是ground truth box

?

2.2.4)、roi_data

1. layer { 2. name: 'roi-data' 3. type: 'Python' 4. bottom: 'rpn_rois' 5. bottom: 'gt_boxes' 6. top: 'rois' 7. top: 'labels' 8. top: 'bbox_targets' 9. top: 'bbox_inside_weights' 10. top: 'bbox_outside_weights' 11. python_param { 12. module: 'rpn.proposal_target_layer' 13. layer: 'ProposalTargetLayer' 14. param_str: "'num_classes': 81" 15. } 16. }

為了避免定義上的誤解,我們將經(jīng)過‘proposal’后的預(yù)測框稱為region proposal(其實(shí),RPN層的任務(wù)其實(shí)已經(jīng)完成,roi_data屬于為下一層準(zhǔn)備數(shù)據(jù))

主要作用:

①?????? RPN層只是來確定region proposal是否是物體(是/否),這里根據(jù)region proposal和ground truth box的最大重疊指定具體的標(biāo)簽(就不再是二分類問題了,參數(shù)中指定的是81類)

②?????? 計(jì)算region proposal與ground truth boxes的偏移量,計(jì)算方法和之前的偏移量計(jì)算公式相同

經(jīng)過這一步后的數(shù)據(jù)輸入到ROI Pooling層進(jìn)行進(jìn)一步的分類和定位.

?

3)ROI Pooling:

1. layer { 2. name: "roi_pool5" 3. type: "ROIPooling" 4. bottom: "conv5_3" #輸入特征圖大小 5. bottom: "rois" #輸入region proposal 6. top: "pool5" #輸出固定大小的feature map 7. roi_pooling_param { 8. pooled_w: 7 9. pooled_h: 7 10. spatial_scale: 0.0625 # 1/16 11. } 12. }

從上述的Caffe代碼中可以看到,輸入的是RPN層產(chǎn)生的region proposal(假定有300個region proposal box)和VGG16最后一層產(chǎn)生的特征圖(60*40 512-d),遍歷每個region proposal,將其坐標(biāo)值縮小16倍,這樣就可以將在原圖(1000*600)基礎(chǔ)上產(chǎn)生的region proposal映射到60*40的特征圖上,從而將在feature map上確定一個區(qū)域(定義為RB*)。

在feature map上確定的區(qū)域RB*,根據(jù)參數(shù)pooled_w:7,pooled_h:7,將這個RB*區(qū)域劃分為7*7,即49個相同大小的小區(qū)域,對于每個小區(qū)域,使用max pooling方式從中選取最大的像素點(diǎn)作為輸出,這樣,就形成了一個7*7的feature map

? ? ? ?細(xì)節(jié)可查看:https://www.cnblogs.com/wangyong/p/8523814.html

以此,參照上述方法,300個region proposal遍歷完后,會產(chǎn)生很多個7*7大小的feature map,故而輸出的數(shù)組是:[300,512,7,7],作為下一層的全連接的輸入

?

4)、全連接層:

經(jīng)過roi pooling層之后,batch_size=300, proposal feature map的大小是7*7,512-d,對特征圖進(jìn)行全連接,參照下圖,最后同樣利用Softmax Loss和L1 Loss完成分類和定位

?

?

通過full connect層與softmax計(jì)算每個region proposal具體屬于哪個類別(如人,馬,車等),輸出cls_prob概率向量;同時再次利用bounding box regression獲得每個region proposal的位置偏移量bbox_pred,用于回歸獲得更加精確的目標(biāo)檢測框

即從PoI Pooling獲取到7x7大小的proposal feature maps后,通過全連接主要做了:

4.1)通過全連接和softmax對region proposals進(jìn)行具體類別的分類

4.2)再次對region proposals進(jìn)行bounding box regression,獲取更高精度的rectangle box

?

作為一枚技術(shù)小白,寫這篇筆記的時候參考了很多博客論文,在這里表示感謝,同時,未經(jīng)同意,請勿轉(zhuǎn)載....

?

轉(zhuǎn)載于:https://www.cnblogs.com/augustone/p/10535479.html

總結(jié)

以上是生活随笔為你收集整理的图像理解之物体检测object detection,模型rcnn/fastrcnn/fasterrcnn原理及概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。