最近在進行視訊行人檢測優化的課題,需要進行相關領域的技術和背景調研,完成開題同時,了解相關技術,為後面的隊伍的proposal和項目做準備,技術調研報告如下:
一、目标檢測發展
1、概述Faster-RCNN相關技術發展簡圖
所謂目标檢測,實則是從屬于計算機視覺中的一項任務。它的目标是定位出圖像中的物體,并且給出其具體類别。在自動駕駛車輛,智能監控中,目标檢測的意義十分重大。而作為評判一個目标檢測系統的标準,我們有三個重要的名額。
第一,IOU,也即判别預測的方框和真實的方框有多接近的一個名額。
第二,是 mAP(mean Average Presion),在多個類别的檢測中,每一個類别都可以調整門檻值,算出召回率從0到1時的準确率(同一召回率取最高的準确率),計算準确率的平均值,而後再對于所有類求平均得到 mAP。這個值介于0到1之間,且越大越好。
第三,是 fps,用于評判系統速度有多快。
目标檢測算法的目标即為:定位更準、速度更快、分類更精确。有了這些名額,還需要有資料集來對算法進行評估。這裡介紹一下兩類最常用的通用資料集:
1、PASCAL VOC 資料集。這個資料集中有20個類别,如person,bird,cat,bicycle等。
2、微軟的 COCO 資料集,這個資料集中一共有80個類别,面向于室内,室外。
它們大多面向于這類生活中的場景。在目标檢測的特定領域應用中,也有特定的資料集。如,加州理工行人檢測資料集,KITTI 自動駕駛算法資料集,可以看到它們的場景都是用車輛在實際的路口中拍攝的。
左為加州理工行人資料集,右為KITTI
豐富而巨大的資料集極大地推動了目标檢測領域的發展。與之對應的,還有不停提升的計算力和算法的更新。随着 2012 年 AlexNet 卷積神經網絡赢得 ImageNet 分類賽的冠軍,應用了深度學習的計算機視覺取得了一系列重大突破,其中最亮眼之一目标檢測領域,一系列優秀的架構被提出,不少已經投入商用。
從圖像識别的任務本質上就是兩個問題:一:圖像識别,二:定位。整個的目标檢測架構也分為兩大類。
第一是 two-stage 兩步走的架構,先進行區域推薦,再進行目标分類;另一個是 one-stage 端到端的架構,應用一個網絡把所有事情都做了,一步輸出結果。除此之外,還有free anchor,聯級分類等。
目标檢測架構的兩種分類
2、one_stage架構2014 年 R-CNN 架構的提出是最早将卷積網絡應用到目标檢測上的方法之一。R-CNN 首先利用選擇性搜尋這類圖像分割的算法進行區域推薦,而後将這些區域分别裁剪下來,縮放送入卷積網絡,來做判定。在 VOC 資料集上,它一下就提升了 20% 多的 mAP。但是這樣就會造成速度慢,因為給出的推薦區域通常有 2000 多個。
RCNN相關技術發展圖示
其基礎上改進的 Fast R-CNN 通過在卷積層的最後一層添加一個區域池化層,使得推薦區域能夠直接映射到這裡來提取特征,減少了數千次重複的卷積運算,大大提升了速度。但它的區域推薦方法還是使用的選擇性搜尋,不能和 CNN 共享計算,速度瓶頸仍然存在。而 Faster R-CNN 則推出了區域建議網絡 RPN,将這一步也用 CNN 來做,并且讓區域建議網絡和分類網絡共享卷積特征,使得目标檢測架構幾乎達到實時,并且 mAP 達到了極高。還有2018年的mask R_CNN,把原有的Faster-RCNN進行擴充,添加一個分支(FPN)使用現有的檢測對目标進行并行預測,可以有效地目标檢測的同時完成了高品質的語義分割,但是速度較慢,在現實應用方面還需要優化。
2、one_stage架構兩種one_stage目标檢測方法
在YOLO中,它将圖像分成 S*S 個單元,每個單元分别去預測方框,利用網絡對這些方框直接去學習真實方框和所屬類别。YOLO 非常快,小型的模型可以達到 155 fps ,但是随之而來的是 mAP 的降低,以及定位不準的問題。而 SSD 則有點像 Faster R-CNN 中的多類别 RPN 網絡,是一個十分成功的檢測架構。它采用特征金字塔的多層預測方法,在不同的卷積層上設定前景方框,在不同大小的特征圖上考慮不同的尺度,相當于每個層分開預測,最後一起得到結果。
二、faster-RCNN形成相關學習
1、基于候選窗和深度學習的目标檢測方法發展,即one-stageRCNN
(1).在圖像中确定約1000-2000個候選框 (使用選擇性搜尋Selective Search)
(2).每個候選框内圖像塊縮放至相同大小,并輸入到CNN内進行特征提取
(3).對候選框中提取出的特征,使用分類器判别是否屬于一個特定類
(4).對于屬于某一類别的候選框,用回歸器進一步調整其位置
許多候選框(如兩千個)-->CNN-->得到每個候選框的特征-->分類+回歸Fast R-CNN
(1).在圖像中确定約1000-2000個候選框 (使用選擇性搜尋)
(2).對整張圖檔輸進CNN,得到feature map
(3).找到每個候選框在feature map上的映射patch,将此patch作為每個候選框的卷積特征輸入到SPP layer和之後的層
(4).對候選框中提取出的特征,使用分類器判别是否屬于一個特定類
(5).對于屬于某一類别的候選框,用回歸器進一步調整其位置
一張完整圖檔-->CNN-->得到每張候選框的特征-->分類+回歸Faster R-CNN
(1).對整張圖檔輸進CNN,得到feature map
(2).卷積特征輸入到RPN,得到候選框的特征資訊
(3).對候選框中提取出的特征,使用分類器判别是否屬于一個特定類
(4).對于屬于某一類别的候選框,用回歸器進一步調整其位置
一張完整圖檔-->CNN-->RPN-->得到候選框的特征-->分類+回歸Mask R-CNN
(1).對整張圖檔輸進CNN,得到feature map
(2).卷積特征輸入到RPN,得到候選框的特征資訊
(3).對候選框中提取出的特征(通過ROI),使用分類器判别是否屬于一個特定類,進一步調整候選框位置。
(4)與第(3)步同時進行,利用FPN,輸出物體掩膜(
object mask
),完成語義分割。
2、算法比較Faster-RCNN通過交叉訓練方式,共享卷積特征,進而大幅縮減了訓練參數,除了CNN網絡架構本身具有的權值共享,通過交替訓練兩個類型的網絡達到cost free。
首先,Fast-RCNN:與典型的RCNN不同的是,典型的RCNN使用Selective Search;而Fast-RCNN使用EdgeBoxes。直接取得性能上的優勢,論文給出的資料是,Selective Search:2 seconds per image,而使用EdgeBoxes是0.2 seconds per image,也就是Fast-RCNN提高了十倍的速度。
然後,Faster-RCNN( 可以看做是對 Fast-RCNN 的再次改進版):主要解決的是如何在RPN網絡中快速獲得 proposal,
卷積後的特征圖其實是可以用來生成 region proposals。 是以,作者通過增加兩個獨立平行的全連接配接層來實作 Region Proposal Networks (RPN) , 一個用來以回歸方式生成推薦區域(region bounds),另一個則是objectness score。為了面對平移(縮放)不變性,經典做法有:對輸入圖檔或者卷積網絡裡的濾波器進行整體尺度矩形長寬比例的采樣;而作者的做法是:對推薦區域(novel “anchor” boxes)進行尺度矩形比例的采樣.結果是,對推薦區域采樣的模型,不管是速度還是準确率都取得很好的性能.
最後,為了将fully-convolutional network (FCN)的RPN 與 Fast-RCNN 相結合,用一種簡單的訓練方法:
固定 proposals數目, 為訓練RPN和Fast-RCNN, 這兩個訓練的task交替微調網絡 ,交替過程實作卷積特征共享。是以不需要重複的卷積計算, 共享卷積特征也讓兩個網絡快速地收斂,是以,大幅地提高了網絡的訓練和測試(應用)速度。
三、faster-RCNN過程結構分析學習從上面的過程總結可以看出faster-RCNN的優勢在于在候選框的生成方面使用RPN(Region Proposal Networks)代替Selective Search算法。有了一個大緻了解後,再根據下圖,我們可以将其過程分成幾個部分:
(1)、特征提取(CNN):用一串卷積和池化從原圖中提取出feature map;
(2)、RPN網絡:通過網絡訓練的方式從feature map中
擷取多個候選框的大緻位置;
(3)、ROI Pooling部分:利用前面擷取到的精确位置,從feature map中摳出要用于分類的目标,并pooling成固定長度的資料(
将不同大小的輸入轉換為固定大小的輸出);
(4)、分類和回歸:這一層的輸出是最終目的,輸出候選區域所屬的類,候選區域在圖像中的精确位置。
Faster R-CNN大體結構
Faster R-CNN詳細結構
下面主要分析RPN網絡部分和ROI pooling部分
1、 Region Proposal Networks(RPN)
RPN網絡結構
上圖展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得positive和negative分類,下面一條用于計算對于anchors的bounding box regression偏移量,以獲得精确的proposal。而最後的Proposal層則負責綜合positive anchors和對應bounding box regression偏移量擷取proposals,同時剔除太小和超出邊界的proposals。其實整個網絡到了Proposal Layer這裡,就完成了相當于
目标定位的功能。
1.1、Anchor在RPN中,作者提出了anchor。Anchor是大小和尺寸固定的候選框。論文中用到的anchor有三種尺寸和三種比例,如下圖所示,三種尺寸分别是小(藍128)中(紅256)大(綠512),三個比例分别是1:1,1:2,2:1。3×3的組合總共有9種anchor。
各種形式anchor
然後用這9種anchor在特征圖(feature)左右上下移動,每一個特征圖上的點都有9個anchor,最終生成了 (H/16)× (W/16)×9個anchor. 對于一個512×62×37的feature map,有 62×37×9~ 20000個anchor。 也就是對一張圖檔,有20000個左右的anchor,基本是cover了800x600的各個尺度和形狀。
1.2、訓練RPNRPN的總體架構如下圖所示:
RPN架構
anchor的數量和feature map相關,不同的feature map對應的anchor數量也不一樣。RPN在Extractor輸出的feature maps的基礎之上,先增加了一個卷積,然後利用兩個1x1的卷積分别進行
二分類(是否為正樣本)和位置回歸。進行分類的卷積核通道數為9×2(9個anchor,每個anchor二分類,使用交叉熵損失),進行回歸的卷積核通道數為9×4(9個anchor,每個anchor有4個位置參數)。
RPN是一個全卷積網絡(fully convolutional network),這樣對輸入圖檔的尺寸就沒有要求了。
接下來RPN做的事情就是利用(AnchorTargetCreator)将20000多個候選的anchor選出256個anchor進行分類和回歸位置。選擇過程如下:
1)對于每一個ground truth bounding box (gt_bbox),選擇和它重疊度(IoU)最高的一個anchor作為正樣本。
2)對于剩下的anchor,從中選擇和任意一個gt_bbox重疊度超過0.7的anchor,作為正樣本,正樣本的數目不超過128個。
3)随機選擇和gt_bbox重疊度小于0.3的anchor作為負樣本。負樣本和正樣本的總數為256。如下圖所示。
softmax判定positive與negative
其實RPN最終就是在原圖尺度上,設定了密密麻麻的候選Anchor。然後用cnn去判斷哪些Anchor是裡面有目标的positive anchor,哪些是沒目标的negative anchor。是以,僅僅是個二分類而已
對于每個anchor, gt_label 要麼為1(前景),要麼為0(背景),而gt_loc則是由4個位置參數(tx,ty,tw,th)組成,這樣比直接回歸座标更好。
計算分類損失用的是交叉熵損失,而計算回歸損失用的是Smooth_l1_loss. 在計算回歸損失的時候,隻計算正樣本(前景)的損失,不計算負樣本的位置損失。
1.3、RPN生成RoIsProposal Layer負責綜合所有候選框變換量和positive anchors,計算出精準的proposal,送入後續RoI Pooling Layer。RPN生成RoIs的過程(ProposalCreator)如下:
1)對于每張圖檔,利用它的feature map, 計算 (H/16)× (W/16)×9(大概20000)個anchor屬于前景的機率,以及對應的位置參數。
2)選取機率較大的12000個anchor
3)利用回歸的位置參數,修正這12000個anchor的位置,得到RoIs
4)利用非極大值((Non-maximum suppression, NMS)抑制,選出機率最大的2000個RoIs
注意:在inference的時候,為了提高處理速度,12000和2000分别變為6000和300。RPN的輸出:RoIs(形如2000×4或者300×4的tensor)
RPN網絡結構總結起來就是:
生成anchors -> softmax分類器提取positvie anchors -> bbox reg回歸positive anchors -> Proposal Layer生成proposals2、RIO pooling
而RoI Pooling層則負責收集proposal,并計算出proposal feature maps,送入後續網絡。從圖2中可以看到Rol pooling層有2個輸入:
原始的feature maps
RPN輸出的proposal boxes(大小各不相同)
由于RoIs給出的2000個候選框,分别對應feature map不同大小的區域。首先利用ProposalTargetCreator 挑選出128個sample_rois, 然後
使用了RoIPooling 将這些不同尺寸的區域全部pooling到同一個尺度(7×7)上。下圖就是一個例子,對于feature map上兩個不同尺度的RoI,經過RoIPooling之後,最後得到了3×3的feature map。
RoI Pooling 是一種特殊的Pooling操作,給定一張圖檔的Feature map (512×H/16×W/16) ,和128個候選區域的座标(128×4),RoI Pooling将這些區域統一下采樣到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一個batch-size=128,通道數為512,7×7的feature map。
如圖所示:
3、分類
Classification部分利用已經獲得的proposal feature maps,通過full connect層與softmax計算每個proposal
具體屬于那個類别(如人,車,電視等),輸出cls_prob機率向量;同時再次利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,
用于回歸更加精确的目标檢測框。結構流程如下圖所示:
暫時粗淺認知,需要繼續深入細節以及代碼實踐。
參考部落格:
目标檢測參考部落格:http://bbs.cvmart.net/articles/238/hou-r-cnn-shi-dai-faster-r-cnn-ssd-yolo-ge-lei-bian-ti-tong-zhi-xia-de-mu-biao-jian-ce-zong-shu-faster-r-cnn-xi-lie-sheng-le-ma
文章标題:從程式設計實作角度學習Faster R-CNN(附極簡實作);文章位址:https://zhuanlan.zhihu.com/p/32404424
https://zhuanlan.zhihu.com/p/31426458
文章标題:從結構、原理到實作,Faster R-CNN全解析;文章位址:https://www.jianshu.com/p/ab1ebddf58b1
參考論文:
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks:
https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
github相關代碼位址連結:
https://github.com/endernewton/tf-faster-rcnn
https://github.com/hoya012/deep_learning_object_detection