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