目标检测发展路程(一)——Two stage
目標(biāo)檢測(cè)是計(jì)算機(jī)視覺領(lǐng)域中非常重要的一個(gè)研究方向,它是將圖像或者視頻中目標(biāo)與其他不感興趣的部分進(jìn)行區(qū)分,判斷是否存在目標(biāo),確定目標(biāo)位置,識(shí)別目標(biāo)種類的任務(wù),即定位+分類。傳統(tǒng)的目標(biāo)檢測(cè)模型有VJ.Det[1,2],HOG.Det[3],DPM[4,5,6],直到2012年,CNN模型日益成熟化,以深度學(xué)習(xí)為基礎(chǔ)的目標(biāo)檢測(cè)模型開始發(fā)展,主要分為單階段模型(One stage)和兩階段模型(Two stage),發(fā)展路徑如下:
目標(biāo)檢測(cè)也面臨許多挑戰(zhàn):
- 環(huán)境影響
- 密集
- 遮擋
- 重疊
- 多尺度:大目標(biāo)、小目標(biāo)
- 小樣本
- 旋轉(zhuǎn)框
目標(biāo)檢測(cè)也細(xì)分了很多領(lǐng)域
- 通用檢測(cè):
- 行人檢測(cè):行人違規(guī)檢測(cè)
- 車輛檢測(cè):車輛違規(guī)檢測(cè)、車輛牌照識(shí)別等
- 人臉檢測(cè):人臉口罩檢測(cè),人臉識(shí)別打卡等
- 文字檢測(cè):OCR(光學(xué)字符識(shí)別)的文本檢測(cè),常見算法:DBNet
1、常見術(shù)語介紹
(1)BBox(邊界框)
BBox:Bounding Box,邊界框,邊界框分為兩種:Groud-truth(真實(shí)框,也簡(jiǎn)稱gt_box)和prediction box(預(yù)測(cè)框,也簡(jiǎn)稱pred_box),使用邊界框(bounding?box)來表示物體的位置,邊界框是正好能包含物體的矩形框,通常有兩個(gè)格式
-
(x1,y1,x2,y2)
?? ?? ? (x1,y1)是矩形框的左上角的坐標(biāo),(x2,y2)是矩形框的右上角的坐標(biāo)。
-
?(x ,y ,w ,h )
? ? ? ? ? (x,y)是矩形框中心點(diǎn)的坐標(biāo),w ww是矩形框的寬度,h hh是矩形框的高度。
(2)Anchor(錨框)
錨框與物體邊界框不同,是由人們假想出來的一種框。先設(shè)定好錨框的大小和形狀,再以圖像上某一個(gè)點(diǎn)為中心畫出矩形框, 將這些錨框當(dāng)成可能的候選區(qū)域。
(3)RoI(Region of Interest):特定的感興趣區(qū)域
(4)Region Proposal :候選區(qū)域
(5)RPN(Pegion Proposal Network):區(qū)域生成網(wǎng)絡(luò),用于生成候選區(qū)域的網(wǎng)絡(luò)。
(6)IoU(Intersaction over Union)
在檢測(cè)任務(wù)中,使用交并比(Intersection of Union,IoU)作為衡量指標(biāo)。這一概念來源于數(shù)學(xué)中的集合,用來描述兩個(gè)集合A AA和B BB之間的關(guān)系,它等于兩個(gè)集合的交集里面所包含的元素個(gè)數(shù),除以它們的并集里面所包含的元素個(gè)數(shù),具體計(jì)算公式如下:
我們將用這個(gè)概念來描述兩個(gè)框之間的重合度。兩個(gè)框可以看成是兩個(gè)像素的集合,它們的交并比等于兩個(gè)框重合部分的面積除以它們合并起來的面積。
(7)mAP
AP(Average Precision)是某一類以Precision、Recall為縱、橫坐標(biāo)的曲線下的面積,mAP(mean Average Precision)是所有類別AP平均。
(8)NMS
搜索局部最大值,抑制極大值。
2、深度學(xué)習(xí)的目標(biāo)檢測(cè)方案
在Ross Girshick等人提出DPM方法后,目標(biāo)檢測(cè)進(jìn)入瓶頸期,圖像特征提取成為難點(diǎn),隨著CNN的發(fā)展,也開始嘗試將神經(jīng)網(wǎng)絡(luò)加入到目標(biāo)檢測(cè)任務(wù)中。該圖是幾個(gè)模型的差異對(duì)比:
?(1)R-CNN
R-CNN的全稱是Region-CNN,是第一個(gè)成功將深度學(xué)習(xí)應(yīng)用到目標(biāo)檢測(cè)中的算法,傳統(tǒng)的目標(biāo)檢測(cè)方法是在圖片上窮舉出所有物體可能出現(xiàn)的區(qū)域框,對(duì)這些區(qū)域提取特征并進(jìn)行分類,得到所有分類成功的區(qū)域,通過非極大值抑制(Non-maximum suppression)輸出結(jié)果。R-CNN的實(shí)現(xiàn)步驟是
-
采用提取框(Selective?Search):搜索候選區(qū)域,并對(duì)候選區(qū)域提取特征,并將提取到的特征存儲(chǔ)起來。
-
對(duì)每個(gè)框提取特征(CNN):在數(shù)據(jù)集上訓(xùn)練CNN,R-CNN論文中使用的網(wǎng)絡(luò)是AlexNet,數(shù)據(jù)集是ImageNet,在目標(biāo)檢測(cè)的數(shù)據(jù)集上,對(duì)訓(xùn)練好的CNN做微調(diào)。
-
圖像分類(SVM):使用分類模型SVM進(jìn)行訓(xùn)練
-
邊框回歸:通過非最大抑制策略對(duì)同一類別的ROI(region of interest)進(jìn)行合并得到最終的檢測(cè)結(jié)果,即得到每個(gè)矩形框的置信度。
不足:
- 每個(gè)候選區(qū)域都需要通過CNN計(jì)算特征,計(jì)算量大
- Selective Search提取的區(qū)域質(zhì)量不夠好
- 特征提取、SVM分類器是分模塊獨(dú)立訓(xùn)練的,沒有聯(lián)合起來系統(tǒng)性優(yōu)化,訓(xùn)練耗時(shí)長
(2)Fast R-CNN
在改進(jìn)Fast R-CNN之前,有一個(gè)版本是SPPNet(Spatial?Pyramind?Pooling?Convolutional?
Networks),將CNN的輸入從固定尺寸改進(jìn)為任意尺寸,加入ROI池化層(即對(duì)ROI的區(qū)域進(jìn)行池化),使得網(wǎng)絡(luò)的輸入圖像可以是任意尺寸,輸出則不變,是固定維數(shù)的向量。
Fast?R-CNN在SPPNet的基礎(chǔ)上,將?SVM分類改成了神經(jīng)網(wǎng)絡(luò)進(jìn)行分類,全連接層有兩個(gè)輸出,一個(gè)輸出負(fù)責(zé)分類(softmax),另一個(gè)輸出負(fù)責(zé)框回歸(bbox?regressor)。
最終得到兩個(gè)結(jié)果:softmax分類以及L2回歸,損失函數(shù)是分類和回歸的加權(quán)和。
不足:
- 仍用Selective Search提取候選區(qū)域
ROI Pooling的不足:
- 在候選框的位置和提取特征時(shí)兩次取整,會(huì)導(dǎo)致檢測(cè)信息和提取出的特征不匹配
(3)Faster R-CNN
為了解決Selective Search帶來的耗時(shí)問題,Faster R-CNN引用了RPN來進(jìn)行候選區(qū)域的提取,RPN是一個(gè)全卷積神經(jīng)網(wǎng)絡(luò)(Fully Convolutional Network),輸入是前一層任意大小的特征圖,輸出是一系列的矩形目標(biāo)候選區(qū),在卷積神經(jīng)網(wǎng)絡(luò)的最后一個(gè)特征層上滑動(dòng)。
?為了適應(yīng)多種形狀的物體,RPN定義了k種不同尺度的滑窗,并將這些滑窗成為anchor,在Faster R-CNN論文中,用了9種anchor。
在分類任務(wù)中,需計(jì)算每個(gè)anchor和真實(shí)標(biāo)記矩形框gt_box的IOU
- 當(dāng)IOU>0.7時(shí),認(rèn)為該anchor包含目標(biāo)物體,為正樣本
- 當(dāng)IOU在0.3-0.7之間時(shí),不參與網(wǎng)絡(luò)訓(xùn)練的迭代過程
- 當(dāng)IOU<0.3時(shí),認(rèn)為該anchor不包含目標(biāo)物體,為負(fù)樣本
在回歸任務(wù)中,需計(jì)算anchor和gt_box的橫、縱坐標(biāo)及寬高的偏移量,Loss函數(shù)的是通過smooth L1進(jìn)行計(jì)算的,公式為
ROI Align:消除ROI Padding的誤差
?在區(qū)域內(nèi)均勻的取N個(gè)點(diǎn),找到特征圖上離每個(gè)點(diǎn)最近的四個(gè)點(diǎn),再通過雙線性插值的方式,得到點(diǎn)的輸出值,最后對(duì)N個(gè)點(diǎn)取平均得到區(qū)域的輸出。
(4)進(jìn)階模型
- FPN(解決多尺度問題)
方案可以構(gòu)造多尺度金字塔,期望模型能夠具備檢測(cè)不同大小尺度物體的能力,具體方案如下圖:
- a是將特征縮放到不同尺度,使用多個(gè)模型進(jìn)行預(yù)測(cè)
- b是僅使用最后一層的特征作為檢測(cè)模型后續(xù)部分的輸入
- c是每個(gè)層級(jí)分別預(yù)測(cè)
- d是使用不同層級(jí)特征進(jìn)行融合,在分級(jí)預(yù)測(cè)(FPN)
FPN是以骨干網(wǎng)絡(luò)的輸出為輸入,將特征進(jìn)行上采樣并與上一層特征相加得到FPN結(jié)構(gòu)每一層的輸出,網(wǎng)絡(luò)結(jié)構(gòu)圖如下
在FPN結(jié)構(gòu)中,會(huì)存在多個(gè)ROI Align,將FPN的特征金字塔類比為圖像金字塔,可以通過面積來對(duì)候選框進(jìn)行分配。
- Cascade R-CNN(IoU)
Cascade R-CNN主要是對(duì)IoU指標(biāo)的改進(jìn),IoU是計(jì)算兩個(gè)框之間的重疊區(qū)域,在模型中涉及到的細(xì)節(jié)有:一、計(jì)算基于Anchor和GT框的IoU值,二是基于預(yù)測(cè)框和真實(shí)框的IoU值。通過調(diào)整IoU的閾值并未對(duì)模型有較大提升,單一閾值訓(xùn)練的模型有限,因此,對(duì)模型進(jìn)行多Head改進(jìn)。
- Libra R-CNN
Libra R-CNN進(jìn)行三方面的改進(jìn),分別是特征融合、采樣策略、損失函數(shù)。
?增強(qiáng)FPN的特征融合:
采樣策略:
Loss(Smooth L1 loss--->Balanced L1 loss):
還有Mask R-CNN、RFCN、Light-Head R-CNN等模型的改進(jìn)
3、深度學(xué)習(xí)的目標(biāo)檢測(cè)實(shí)現(xiàn)
3.1. PaddleDetection的安裝和使用
(1)安裝
#下載PaddleDetection ! git clone https://github.com/PaddlePaddle/PaddleDetection #解壓 ! unzip -o PaddleDetection.zip #安裝cocoapi ! pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI" #安裝需求包,在PaddleDetection路徑下 !pip install -r requirements.txt#配置環(huán)境變量 %env PYTHONPATH=.:$PYTHONPATH %env CUDA_VISIBLE_DEVICES=0#驗(yàn)證 ! python ppdet/modeling/tests/test_architectures.py(2)介紹
在PaddleDetection中實(shí)現(xiàn)目標(biāo)檢測(cè)、關(guān)鍵點(diǎn)檢測(cè)、實(shí)例分割等算法,具體模型如下:
?(3)模型包內(nèi)容拆解
核心文件有四個(gè)configs、dataset、demo、tools,?包含了數(shù)據(jù)集、測(cè)試、模型、訓(xùn)練整個(gè)過程,可以按需調(diào)整實(shí)現(xiàn)。
教程參考:飛槳AI Studio - 人工智能學(xué)習(xí)與實(shí)訓(xùn)社區(qū)
(4)實(shí)現(xiàn)
#運(yùn)行代碼---訓(xùn)練操作,并進(jìn)行驗(yàn)證集驗(yàn)證 ! python -u tools/train.py -c ../faster_rcnn_r34_1x.yml --eval其中,faster_rcnn_r34_1x.yml為配置文件,內(nèi)容如下
- 超參數(shù)配置
DataReader配置:
- image_dir: images 圖片路徑
- anno_path: Annotations/train_cpu.json 標(biāo)注文件
- dataset_dir: /home/aistudio/work/PCB_DATASET 數(shù)據(jù)路徑
其他模型實(shí)現(xiàn)步驟跟faster R-CNN相似!
2、torchvision實(shí)現(xiàn)(基于pytorch)
(1)安裝
直接用pip就能完成安裝操作,故忽略。
(2)實(shí)現(xiàn)(參考pytorch教程文檔)
import torchvision from torchvision.models.detection.faster_rcnn import FastRCNNPredictor from torchvision.models.detection.mask_rcnn import MaskRCNNPredictordef get_model_instance_segmentation(num_classes):# load an instance segmentation model pre-trained on COCOmodel = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)# get number of input features for the classifierin_features = model.roi_heads.box_predictor.cls_score.in_features# replace the pre-trained head with a new onemodel.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)# now get the number of input features for the mask classifierin_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channelshidden_layer = 256# and replace the mask predictor with a new onemodel.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask,hidden_layer,num_classes)return model(3)實(shí)現(xiàn)細(xì)節(jié)
- backbone:骨干網(wǎng)絡(luò)(提取圖片特征,基本是卷積神經(jīng)網(wǎng)絡(luò)),需要知道Module的out_channels
- rpn:區(qū)域預(yù)測(cè)網(wǎng)絡(luò)
- roi_heads:里邊的方法有RoI Pooling 轉(zhuǎn)成RoI Align。
- transform
總結(jié)
以上是生活随笔為你收集整理的目标检测发展路程(一)——Two stage的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 打印三维数组_Java基础第三
- 下一篇: 清除Tomcat日志