介紹
R-CNN的創(chuàng)始人Girshick(同樣來自微軟)對(duì)R-CNN與SPP-Net有了更多思考后屯耸,對(duì)這種需要多階段進(jìn)行訓(xùn)練的目標(biāo)檢測(cè)框架做了重大更新。使得整體的目標(biāo)檢測(cè)這一部分不再由多階段來完成官地,而是統(tǒng)一使用一個(gè)CNN網(wǎng)絡(luò)來完成特征提取,區(qū)域提案分類及后期對(duì)檢測(cè)框的微調(diào)等三樣工作烙懦。這個(gè)創(chuàng)新算是不小驱入,相對(duì)于之間流程的復(fù)雜,簡(jiǎn)單后了的模型不只實(shí)現(xiàn)了訓(xùn)練與推理速度的提升,同時(shí)也帶來了目標(biāo)檢測(cè)精度的增加亏较。大牛水平就是高拜喊!往往能夠通過將模型簡(jiǎn)單化來使得問題得到更好的解決雪情。高山仰止遵岩!
R-CNN目標(biāo)檢測(cè)框架的缺點(diǎn)
- 它的訓(xùn)練是多階段的:我們?cè)谑褂孟馭elective Search等方法獲得圖片的區(qū)域提案后,先使用這些提案作為輸入來訓(xùn)練出一個(gè)收斂巡通、精度還算可以的CNN網(wǎng)絡(luò)尘执;然后去掉此CNN網(wǎng)絡(luò)最后的Softmax層/FC層后,直接使用網(wǎng)絡(luò)最后的CNN層輸出的feature maps作為一個(gè)SVM分類器的輸入扁达,對(duì)SVM分類器進(jìn)行訓(xùn)練以識(shí)別出此區(qū)域提案可能的分類正卧;最后第三個(gè)階段同樣是利用第一階段訓(xùn)練得到的CNN前端網(wǎng)絡(luò)拿到處理過的CNN層的feature maps,將之作為輸入來訓(xùn)練一個(gè)邏輯回歸模型以來對(duì)區(qū)域位置進(jìn)行較正跪解;多階段訓(xùn)練本身就是復(fù)雜的炉旷,難操作的;
- 訓(xùn)練時(shí)的空間與時(shí)間復(fù)雜度高:訓(xùn)練第二叉讥、三階段所用的SVM與邏輯回歸分類器都需要將圖片區(qū)域提案通過第一階段訓(xùn)練得到的CNN網(wǎng)絡(luò)以生成相應(yīng)的特征向量窘行;一般這些特征向量都會(huì)存儲(chǔ)在硬盤當(dāng)中;對(duì)于VGG16的前端CNN網(wǎng)絡(luò)图仓,一般需要2.5天的GPU時(shí)間來處理5000張VOC07 圖片罐盔,而這些圖片產(chǎn)生的特征向量則需要數(shù)百GB的硬盤空間來存儲(chǔ);
- 對(duì)象檢測(cè)慢:因?yàn)镽-CNN網(wǎng)絡(luò)需要對(duì)每個(gè)圖片之上的每一個(gè)區(qū)域提案進(jìn)行三階段處理救崔,因此需要的時(shí)間極長(zhǎng)惶看,當(dāng)使用VGG16網(wǎng)絡(luò)時(shí)一般需要47秒來處理一副圖片。
SPP-Net應(yīng)用在目標(biāo)檢測(cè)框架上的缺點(diǎn)
- 它的訓(xùn)練同樣是多階段的六孵,所以與前面章節(jié)所說的R-CNN有著類似的缺點(diǎn)纬黎;
- 由于SPP層的引入,它可以對(duì)整張圖直接計(jì)算劫窒,以節(jié)省同張圖上面多個(gè)區(qū)域提案在前端網(wǎng)絡(luò)計(jì)算上所需的時(shí)本今,但在使用finetue方式進(jìn)行訓(xùn)練模型增強(qiáng)時(shí)只對(duì)SPP層之后的FC層進(jìn)行finetune,因此整體模型的準(zhǔn)確度會(huì)受些影響主巍。
Fast_R-CNN帶來的改進(jìn)
- 它在多個(gè)數(shù)據(jù)集上取得了比R-CNN與SPP-Net更高的mAP準(zhǔn)確率冠息;
- 使用單個(gè)階段完成目標(biāo)區(qū)域檢測(cè);(可以說是最本質(zhì)的創(chuàng)新)
- 訓(xùn)練時(shí)對(duì)所有的層進(jìn)行同步更新孕索;
- 因?yàn)槭菃坞A段訓(xùn)練所以不需要額外的硬盤空間來存儲(chǔ)中間特征逛艰。
Fast_R-CNN網(wǎng)絡(luò)結(jié)構(gòu)
下圖所示為Fast_R-CNN的基本網(wǎng)絡(luò)結(jié)構(gòu),同過跟上篇的SPP-Net的網(wǎng)絡(luò)結(jié)構(gòu)對(duì)比搞旭,我們能夠發(fā)現(xiàn)它結(jié)構(gòu)最本質(zhì)的創(chuàng)新即在于直接將最后FC層后得到的特征向量分別使用Softmax層與Regressor層來直接對(duì)區(qū)域方案的類別與位置進(jìn)行預(yù)測(cè)與調(diào)整散怖,這一網(wǎng)絡(luò)結(jié)構(gòu)改進(jìn)后來也為其它的模型像Yolo系列與SSD所采用唐断。
- ROI池化層: ROI層的引入本質(zhì)上是Fast_R-CNN對(duì)SPP-Net里面idea的最大借鑒;ROI池化層有兩個(gè)參數(shù)H杭抠,W,分別表示此池化層處理后最終能得到的feature map的高與寬恳啥;任意一個(gè)ROI特征(經(jīng)過之間的CNN網(wǎng)絡(luò)處理后)都可以視為一個(gè)(r,c,h,w)的四元組偏灿,其中(r,c)表示區(qū)域左上角的位置,(h,w)則為此區(qū)域的高寬大卸鄣摹翁垂;ROI層在對(duì)這么一個(gè)ROI特征四元組進(jìn)行處理時(shí),會(huì)先將其分別H x W個(gè)網(wǎng)格單元硝桩,每個(gè)單元的大小為h/H x w/W沿猜,然后分別對(duì)每個(gè)單元做MaxPool處理以得到一個(gè)極大值,這樣最終就能得到一個(gè)大小為H x W的特征輸出碗脊。就此我們?nèi)菀卓闯霰举|(zhì)上ROI層是只有一個(gè)空間池化級(jí)別的金字塔式空間池化層啼肩。
- 前端CNN網(wǎng)絡(luò)的初始化:任意一個(gè)CNN分類網(wǎng)絡(luò)都可作為它的前端CNN網(wǎng)絡(luò);不過對(duì)用于分類的CNN網(wǎng)絡(luò)我們需要進(jìn)行一些變形以來滿足Fast_R-CNN需求衙伶,首先需要將最后一個(gè)MaxPool層替換為ROI層以來輸出與接下來FC層輸入大小相匹配的feature maps祈坠;另外則需要將CNN分類網(wǎng)絡(luò)最后端的FC層(如對(duì)于Imagenet相關(guān)的CNN網(wǎng)絡(luò)即其最后的1000維輸入的FC層)替換為兩個(gè)兄弟層,一個(gè)為用于分類的Softmax層矢劲,另一個(gè)則用于區(qū)域位置檢測(cè)的回歸層赦拘,一般為L(zhǎng)1回歸;最后整個(gè)CNN網(wǎng)絡(luò)的輸入需要由兩部分組成芬沉,分別為輸入圖片數(shù)據(jù)與對(duì)應(yīng)的ROI區(qū)域位置提案躺同。
- Fast_R-CNN的訓(xùn)練損失函數(shù):如下所示,可以知道它共有兩個(gè)部分構(gòu)成丸逸,分別對(duì)應(yīng)兩個(gè)層的輸出(Softmax層與L1回歸層)蹋艺;
L(P, U, Tu, V) = Lcls(P, U) + λ[U ≥ 1]Lloc(Tu, V), 其中Lcls(P, U) = ? log Pu是ROI計(jì)算得到的相對(duì)于正確類別U的交叉熵?fù)p失;而Lloc 則是此ROI最終調(diào)整過后得到的目標(biāo)區(qū)域與正確目標(biāo)區(qū)域之間的L1損失椭员。
Fast_R-CNN檢測(cè)模型部署
一旦我們訓(xùn)練出了正確的Fast_R-CNN模型车海,那么可按以下步驟來進(jìn)行模型部署。
- 以一張圖片及其上的R個(gè)目標(biāo)提案作為輸入隘击;(R一般為2000左右)
- 一個(gè)前向運(yùn)算后我們能得出每個(gè)ROI所對(duì)應(yīng)的類別分布與相應(yīng)的目標(biāo)位置框的位置偏移(相對(duì)于輸入的RoI窗口位置)侍芝;
- 接下來可使用與R—CNN類似的NMS(非最大值抑制)方法來減少預(yù)測(cè)得到的目標(biāo)檢測(cè)框的數(shù)目,最終得到的類別及框位置即為此圖片所檢測(cè)得到的類別與框埋同。
實(shí)驗(yàn)得到的發(fā)現(xiàn)
- 作者通過實(shí)驗(yàn)證實(shí)通過多目標(biāo)學(xué)習(xí)來一起學(xué)習(xí)目標(biāo)類別與位置相對(duì)于像之前R-CNN或SPP-Net那樣對(duì)目標(biāo)類別與位置分別進(jìn)行學(xué)習(xí)相比州叠,多目標(biāo)學(xué)習(xí)可取得更好的mAP值;
- 較深的網(wǎng)絡(luò)在進(jìn)行圖片特征學(xué)習(xí)時(shí)會(huì)自動(dòng)地學(xué)會(huì)圖片大小無關(guān)的特征提取方法凶赁;因此作者認(rèn)為在使用像VGG16這樣較深的網(wǎng)絡(luò)時(shí)咧栗,只使用單一縮放圖片數(shù)據(jù)集進(jìn)行模型訓(xùn)練在時(shí)間與精度權(quán)衡上效果更好逆甜。
Fast_R-CNN Caffe代碼
本質(zhì)上它相對(duì)于SPP-Net的主要改進(jìn)在于將原來R-CNN框架下分為三個(gè)階段去做的事情整合為一個(gè)階段,反映在caffe model 上面即是最終的loss層實(shí)現(xiàn)了多目標(biāo)損失函數(shù)學(xué)習(xí)致板。另外因?yàn)镽OI層也是SPP層的一個(gè)特例交煞,因此我們也放在這里。
---------------ROI層-----------------------
layer {
name: "roi_pool5"
type: "ROIPooling"
bottom: "conv5"
bottom: "rois"
top: "pool5"
roi_pooling_param {
pooled_w: 6
pooled_h: 6
spatial_scale: 0.0625 # 1/16
}
}
---------------最后幾層的損失函數(shù)層----------------------
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 21
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 84
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "loss_cls"
type: "SoftmaxWithLoss"
bottom: "cls_score"
bottom: "labels"
top: "loss_cls"
loss_weight: 1
}
layer {
name: "loss_bbox"
type: "SmoothL1Loss"
bottom: "bbox_pred"
bottom: "bbox_targets"
bottom: "bbox_loss_weights"
top: "loss_bbox"
loss_weight: 1
}
參考文獻(xiàn)
- Fast R-CNN, Ross Girshick, 2015
- https://github.com/rbgirshick/fast-rcnn/