機器視覺領(lǐng)域的核心問題之一就是目標(biāo)檢測(Object Detection),它的任務(wù)是找出圖像當(dāng)中所有感興趣的目標(biāo)(物體),確定其位置和大小。
作為經(jīng)典的目標(biāo)檢測框架Faster R-CNN,雖然是2015年的論文,但是它至今仍然是許多目標(biāo)檢測算法的基礎(chǔ),這在飛速發(fā)展的深度學(xué)習(xí)領(lǐng)域十分難得。而在Faster R-CNN的基礎(chǔ)上改進的Mask R-CNN在2018年被提出,并斬獲了ICCV2017年的最佳論文。Mask R-CNN可以應(yīng)用到人體姿勢識別,并且在實例分割、目標(biāo)檢測、人體關(guān)鍵點檢測三個任務(wù)都取得了很好的效果。
因此,一些深度學(xué)習(xí)框架如百度PaddlePaddle開源了用于目標(biāo)檢測的RCNN模型,從而可以快速構(gòu)建滿足各種場景的應(yīng)用,包括但不僅限于安防監(jiān)控、醫(yī)學(xué)圖像識別、交通車輛檢測、信號燈識別、食品檢測等等。
目標(biāo)檢測(Object Detection)與實例分割(Instance Segmentation)
目標(biāo)檢測的任務(wù)就是確定圖像當(dāng)中是否有感興趣的目標(biāo)存在,接著對感興趣的目標(biāo)進行精準定位。當(dāng)下非?;馃岬?a target="_blank">無人駕駛汽車,就非常依賴目標(biāo)檢測和識別,這需要非常高的檢測精度和定位精度。
目前,用于目標(biāo)檢測的方法通常屬于基于機器學(xué)習(xí)的方法或基于深度學(xué)習(xí)的方法。 對于機器學(xué)習(xí)方法,首先使用SIFT、HOG等方法定義特征,然后使用支持向量機(SVM)、Adaboost等技術(shù)進行分類。 對于深度學(xué)習(xí)方法,深度學(xué)習(xí)技術(shù)能夠在沒有專門定義特征的情況下進行端到端目標(biāo)檢測,并且通常基于卷積神經(jīng)網(wǎng)絡(luò)(CNN)。但是傳統(tǒng)的目標(biāo)檢測方法有如下幾個問題:光線變化較快時,算法效果不好;緩慢運動和背景顏色一致時不能提取出特征像素點;時間復(fù)雜度高;抗噪性能差。
因此,基于深度學(xué)習(xí)的目標(biāo)檢測方法得到了廣泛應(yīng)用,該框架包含有Faster R-CNN,Yolo,Mask R-CNN等,圖1和圖2分別顯示的是基于PaddlePaddle深度學(xué)習(xí)框架訓(xùn)練的Faster R-CNN和Mask R-CNN模型對圖片中的物體進行目標(biāo)檢測。
從圖1中可以看出,目標(biāo)檢測主要是檢測一張圖片中有哪些目標(biāo),并且使用方框表示出來,方框中包含的信息有目標(biāo)所屬類別。圖2與圖1的最大區(qū)別在于,圖2除了把每一個物體的方框標(biāo)注出來,并且把每個方框中像素所屬的類別也標(biāo)記了出來。
圖1 基于paddlepaddle訓(xùn)練的Faster R-CNN模型預(yù)測結(jié)果
圖2 基于paddlepaddle訓(xùn)練的Mask R-CNN模型預(yù)測結(jié)果
從R-CNN到Mask R-CNN
Mask R-CNN是承繼于Faster R-CNN,Mask R-CNN只是在Faster R-CNN上面增加了一個Mask Prediction Branch(Mask預(yù)測分支),并且在ROI Pooling的基礎(chǔ)之上提出了ROI Align。所以要想理解Mask R-CNN,就要先熟悉Faster R-CNN。同樣的,F(xiàn)aster R-CNN是承繼于Fast R-CNN,而Fast R-CNN又承繼于R-CNN,因此,為了能讓大家更好的理解基于CNN的目標(biāo)檢測方法,我們從R-CNN開始切入,一直介紹到Mask R-CNN。
R-CNN
區(qū)域卷積神經(jīng)網(wǎng)絡(luò)(Regions with CNN features)使用深度模型來解決目標(biāo)檢測。
R-CNN的操作步驟
Selective search(選擇性搜索):首先對每一張輸入圖像使用選擇性搜索來選取多個高質(zhì)量的提議區(qū)域(region proposal),大約提取2000個左右的提議區(qū)域;
Resize(圖像尺寸調(diào)整):接著對每一個提議區(qū)域,將其縮放(warp)成卷積神經(jīng)網(wǎng)絡(luò)需要的輸入尺寸(277*277);
特征抽?。哼x取一個預(yù)先訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò),去掉最后的輸出層來作為特征抽取模塊;
SVM(類別預(yù)測):將每一個提議區(qū)域提出的CNN特征輸入到支持向量機(SVM)來進行物體類別分類。注:這里第 i 個 SVM 用來預(yù)測樣本是否屬于第 i 類;
Bounding Box Regression(邊框預(yù)測):對于支持向量機分好類的提議區(qū)域做邊框回歸,訓(xùn)練一個線性回歸模型來預(yù)測真實邊界框,校正原來的建議窗口,生成預(yù)測窗口坐標(biāo)。
R-CNN優(yōu)缺點分析
優(yōu)點:R-CNN 對之前物體識別算法的主要改進是使用了預(yù)先訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)來抽取特征,有效的提升了識別精度。
缺點:速度慢。對一張圖像我們可能選出上千個興趣區(qū)域,這樣導(dǎo)致每張圖像需要對卷積網(wǎng)絡(luò)做上千次的前向計算。
Fast R-CNN
R-CNN 的主要性能瓶頸在于需要對每個提議區(qū)域(region proposal)獨立的抽取特征,這會造成區(qū)域會有大量重疊,獨立的特征抽取導(dǎo)致了大量的重復(fù)計算。因此,F(xiàn)ast R-CNN 對 R-CNN 的一個主要改進在于首先對整個圖像進行特征抽取,然后再選取提議區(qū)域,從而減少重復(fù)計算。
Fast R-CNN 的操作步驟
Selective Search(選擇性搜索):首先對每一張輸入圖像使用選擇性搜索(selective search)算法來選取多個高質(zhì)量的提議區(qū)域(region proposal),大約提取2000個左右的提議區(qū)域;
將整張圖片輸入卷積神經(jīng)網(wǎng)絡(luò),對全圖進行特征提??;
把提議區(qū)域映射到卷積神經(jīng)網(wǎng)絡(luò)的最后一層卷積(feature map)上;
RoI Pooling:引入了興趣區(qū)域池化層(Region of Interest Pooling)來對每個提議區(qū)域提取同樣大小的輸出;
Softmax:在物體分類時,F(xiàn)ast R-CNN 不再使用多個 SVM,而是像之前圖像分類那樣使用 Softmax 回歸來進行多類預(yù)測。
Fast R-CNN優(yōu)缺點分析
優(yōu)點:對整個圖像進行特征抽取,然后再選取提議區(qū)域,從而減少重復(fù)計算;
缺點:選擇性搜索費時;
缺點:不用Resize,不適合求導(dǎo);
Faster R-CNN
Faster R-CNN 對 Fast R-CNN 做了進一步改進,它將 Fast R-CNN 中的選擇性搜索替換成區(qū)域提議網(wǎng)絡(luò)(region proposal network)。RPN 以錨框(anchors)為起始點,通過一個小神經(jīng)網(wǎng)絡(luò)來選擇區(qū)域提議。
Faster R-CNN整體網(wǎng)絡(luò)可以分為4個主要內(nèi)容:
基礎(chǔ)卷積層(CNN):作為一種卷積神經(jīng)網(wǎng)絡(luò)目標(biāo)檢測方法,F(xiàn)aster R-CNN首先使用一組基礎(chǔ)的卷積網(wǎng)絡(luò)提取圖像的特征圖。特征圖被后續(xù)RPN層和全連接層共享。本示例采用ResNet-50作為基礎(chǔ)卷積層。
區(qū)域生成網(wǎng)絡(luò)(RPN):RPN網(wǎng)絡(luò)用于生成候選區(qū)域(proposals)。該層通過一組固定的尺寸和比例得到一組錨點(anchors), 通過softmax判斷錨點屬于前景或者背景,再利用區(qū)域回歸修正錨點從而獲得精確的候選區(qū)域。
RoI Pooling:該層收集輸入的特征圖和候選區(qū)域,將候選區(qū)域映射到特征圖中并池化為統(tǒng)一大小的區(qū)域特征圖,送入全連接層判定目標(biāo)類別, 該層可選用RoIPool和RoIAlign兩種方式,在config.py中設(shè)置roi_func。
檢測層:利用區(qū)域特征圖計算候選區(qū)域的類別,同時再次通過區(qū)域回歸獲得檢測框最終的精確位置。
Faster R-CNN優(yōu)缺點分析
優(yōu)點:RPN 通過標(biāo)注來學(xué)習(xí)預(yù)測跟真實邊界框更相近的提議區(qū)域,從而減小提議區(qū)域的數(shù)量同時保證最終模型的預(yù)測精度。
缺點:無法達到實時目標(biāo)檢測。
Mask R-CNN
Faster R-CNN 在物體檢測中已達到非常好的性能,Mask R-CNN在此基礎(chǔ)上更進一步:得到像素級別的檢測結(jié)果。 對每一個目標(biāo)物體,不僅給出其邊界框,并且對邊界框內(nèi)的各個像素是否屬于該物體進行標(biāo)記。Mask R-CNN同樣為兩階段框架,第一階段掃描圖像生成候選框;第二階段根據(jù)候選框得到分類結(jié)果,邊界框,同時在原有Faster R-CNN模型基礎(chǔ)上添加分割分支,得到掩碼結(jié)果,實現(xiàn)了掩碼和類別預(yù)測關(guān)系的解藕。
圖3 Mask R-CNN網(wǎng)絡(luò)結(jié)構(gòu)泛化圖
Mask R-CNN的創(chuàng)新點
解決特征圖與原始圖像上的RoI不對準問題:在Faster R-CNN中,沒有設(shè)計網(wǎng)絡(luò)的輸入和輸出的像素級別的對齊機制(pixel to pixel)。為了解決特征不對準的問題,文章作者提出了RoIAlign層來解決這個問題,它能準確的保存空間位置,進而提高mask的準確率。
將掩模預(yù)測(mask prediction)和分類預(yù)測(class prediction)拆解:該框架結(jié)構(gòu)對每個類別獨立的預(yù)測一個二值mask,不依賴分類(classification)分支的預(yù)測結(jié)果
掩模表示(mask representation):有別于類別,框回歸,這幾個的輸出都可以是一個向量,但是mask必須要保持一定的空間結(jié)構(gòu)信息,因此作者采用全連接層(FCN)對每一個RoI中預(yù)測一個m*m的掩模。
圖4展示了Mask R-CNN在像素級別的目標(biāo)檢測結(jié)果:
圖4 Mask R-CNN:像素級別的目標(biāo)檢測
基于PaddlePaddle的實戰(zhàn)
環(huán)境準備:需要PaddlePaddle Fluid的v.1.3.0或以上的版本。如果你的運行環(huán)境中的PaddlePaddle低于此版本,請根據(jù)安裝文檔中的說明來更新PaddlePaddle。
數(shù)據(jù)準備:在MS-COCO數(shù)據(jù)集上進行訓(xùn)練,可以通過腳本來直接下載數(shù)據(jù)集:
cddataset/coco./download.sh
數(shù)據(jù)目錄結(jié)構(gòu)如下:
data/coco/├──annotations│├──instances_train2014.json│├──instances_train2017.json│├──instances_val2014.json│├──instances_val2017.json|...├──train2017│├──000000000009.jpg│├──000000580008.jpg|...├──val2017│├──000000000139.jpg│├──000000000285.jpg|...
模型訓(xùn)練:下載預(yù)訓(xùn)練模型:本示例提供Resnet-50預(yù)訓(xùn)練模型,該模性轉(zhuǎn)換自Caffe,并對批標(biāo)準化層(Batch Normalization Layer)進行參數(shù)融合。采用如下命令下載預(yù)訓(xùn)練模型。
sh./pretrained/download.sh
通過初始化pretrained_model加載預(yù)訓(xùn)練模型。同時在參數(shù)微調(diào)時也采用該設(shè)置加載已訓(xùn)練模型。 請在訓(xùn)練前確認預(yù)訓(xùn)練模型下載與加載正確,否則訓(xùn)練過程中損失可能會出現(xiàn)NAN。
安裝cocoapi:
訓(xùn)練前需要首先下載cocoapi:
gitclonehttps://github.com/cocodataset/cocoapi.gitcdcocoapi/PythonAPI#ifcythonisnotinstalledpipinstallCython#Installintoglobalsite-packagesmakeinstall#Alternatively,ifyoudonothavepermissionsorprefer#nottoinstalltheCOCOAPIintoglobalsite-packagespython2setup.pyinstall--user
數(shù)據(jù)準備完畢后,可以通過如下的方式啟動訓(xùn)練:
Faster RCNN
pythontrain.py--model_save_dir=output/--pretrained_model=${path_to_pretrain_model}--data_dir=${path_to_data}--MASK_ON=False
Mask RCNN
pythontrain.py--model_save_dir=output/--pretrained_model=${path_to_pretrain_model}--data_dir=${path_to_data}--MASK_ON=False
通過設(shè)置export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7指定8卡GPU訓(xùn)練。
通過設(shè)置MASK_ON選擇Faster RCNN和Mask RCNN模型。
可選參數(shù)見:
python train.py –help
數(shù)據(jù)讀取器說明:
數(shù)據(jù)讀取器定義在reader.py中。所有圖像將短邊等比例縮放至scales,若長邊大于max_size, 則再次將長邊等比例縮放至max_size。在訓(xùn)練階段,對圖像采用水平翻轉(zhuǎn)。支持將同一個batch內(nèi)的圖像padding為相同尺寸。
模型設(shè)置:
分別使用RoIAlign和RoIPool兩種方法。
訓(xùn)練過程pre_nms=12000,post_nms=2000,測試過程pre_nms=6000, post_nms=1000。nms閾值為0.7。
RPN網(wǎng)絡(luò)得到labels的過程中,fg_fraction=0.25,fg_thresh=0.5,bg_thresh_hi=0.5,bg_thresh_lo=0.0
RPN選擇anchor時,rpn_fg_fraction=0.5,rpn_positive_overlap=0.7,rpn_negative_overlap=0.3
訓(xùn)練策略:
采用momentum優(yōu)化算法訓(xùn)練,momentum=0.9。
權(quán)重衰減系數(shù)為0.0001,前500輪學(xué)習(xí)率從0.00333線性增加至0.01。在120000,160000輪時使用0.1,0.01乘子進行學(xué)習(xí)率衰減,最大訓(xùn)練180000輪。同時我們也提供了2x模型,該模型采用更多的迭代輪數(shù)進行訓(xùn)練,訓(xùn)練360000輪,學(xué)習(xí)率在240000,320000輪衰減,其他參數(shù)不變,訓(xùn)練最大輪數(shù)和學(xué)習(xí)率策略可以在config.py中對max_iter和lr_steps進行設(shè)置。
非基礎(chǔ)卷積層卷積bias學(xué)習(xí)率為整體學(xué)習(xí)率2倍。
基礎(chǔ)卷積層中,affine_layers參數(shù)不更新,res2層參數(shù)不更新。
模型評估:模型評估是指對訓(xùn)練完畢的模型評估各類性能指標(biāo)。本示例采用COCO官方評估。eval_coco_map.py是評估模塊的主要執(zhí)行程序,調(diào)用示例如下:
Faster RCNN
pythoneval_coco_map.py--dataset=coco2017--pretrained_model=${path_to_trained_model}--MASK_ON=False
Mask RCNN
pythoneval_coco_map.py--dataset=coco2017--pretrained_model=${path_to_trained_model}--MASK_ON=True
通過設(shè)置--pretrained_model=${path_to_trained_model}指定訓(xùn)練好的模型,注意不是初始化的模型。
通過設(shè)置export CUDA\_VISIBLE\_DEVICES=0指定單卡GPU評估。
通過設(shè)置MASK_ON選擇Faster RCNN和Mask RCNN模型。
模型精度:下表為模型評估結(jié)果。
Faster RCNN:
End2End Faster R-CNN: 使用RoIPool,不對圖像做填充處理。
End2End Faster R-CNN RoIAlign 1x:使用RoIAlign,不對圖像做填充處理。
End2End Faster R-CNN RoIAlign 2x:使用RoIAlign,不對圖像做填充處理。訓(xùn)練360000輪,學(xué)習(xí)率在240000,320000輪衰減。
Mask RCNN:
End2End Mask R-CNN: 使用RoIAlign,不對圖像做填充處理。
模型推斷:模型推斷可以獲取圖像中的物體及其對應(yīng)的類別,infer.py是主要執(zhí)行程序,調(diào)用示例如下:
pythoninfer.py--pretrained_model=${path_to_trained_model}--image_path=dataset/coco/val2017/000000000139.jpg--draw_threshold=0.6
注意,請正確設(shè)置模型路徑${path_to_trained_model}和預(yù)測圖片路徑。默認使用GPU設(shè)備,也可通過設(shè)置--use_gpu=False使用CPU設(shè)備??赏ㄟ^設(shè)置draw_threshold調(diào)節(jié)得分閾值控制檢測框的個數(shù)。
-
機器視覺
+關(guān)注
關(guān)注
161文章
4369瀏覽量
120278 -
無人駕駛
+關(guān)注
關(guān)注
98文章
4054瀏覽量
120446 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111
原文標(biāo)題:完整代碼+實操!手把手教你操作Faster R-CNN和Mask R-CNN
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論