利用更快的r-cnn深度學習進行目標檢測


此示例演示如何使用名為“更快r-cnn(具有卷積神經網絡的區域)”的深度學習技術來訓練對象探測器。

概述

此示例演示如何訓練用於檢測車輛的更快r-cnn對象探測器。更快的r-nnn [1]是r-cnn [2]和快速r-nnn [3]對象檢測技術的引伸。所有這三種技術都使用卷積神經網絡(cnn)。它們之間的區別在於它們如何選擇要處理的區域以及如何對這些區域進行分類.r-cnn和快速r-概算在運行美國有線電視新聞網之前使用區域建議算法作為預處理步驟。提議算法通常是技術例如edgox [4]或選擇性搜索[5],是獨立的美國有線電視新聞網。在快速r-cnn的情況下,與運行cnn相比,使用這些技術成為處理瓶頸。更快的r-cnn通過使用美國有線電視新聞網實施區域提案機制來解決這一問題,從而使區域提案成為美國有線電視新聞網培訓和預測步驟的一部分。

在該中心中, 使用trainFasterRCNNObjectDetector , 自機視覺系統工具箱 tm .該方案:

  • 為我服務。

  • 網絡 (cnn)。

  • 把他放在

  • h. p。

  • 愛的人

* 請將設備與設備、設備和設備

已經成功,有3.0 或高價值使用需要並行計算工具箱™。

為我服務

本示例使用包含295張圖像的小型車輛數據集。每個圖像包含一個或兩個標記的車輛實例。一個小的數據集對於探索更快的r-cnn訓練過程很有用,但實際上,需要更多的標記圖像來訓練一個強大的探測器

%加載車輛數據集 
data = load('fasterRCNNVehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;

訓練數據存儲在表中。第一列包含圖像文件的路徑。其余列包含車輛的roi標簽。

%顯示數據集的前幾行。
vehicleDataset(1:4,:)
ans = 4×2表 imageFilename車輛  __________________________ ____________
 'vehicles / image_00001.jpg'[1x4 double] 'vehicles / image_00002.jpg'[1x4 double] 'vehicles / image_00003.jpg'[1x4 double] 'vehicles / image_00004.jpg'[1x4 double]

顯示數據集中的一個圖像,以了解它所包含的圖像類型。

%將完整路徑添加到本地車輛數據文件夾。
dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir,vehicleDataset.imageFilename);

%閱讀其中一張圖片。
我= imread(vehicleDataset.imageFilename {10});

%插入ROI標簽。
I = insertShape(I,'Rectangle',vehicleDataset.vehicle {10});

%調整大小並顯示圖像。
我= imresize(I,3);
數字
imshow(I)

將數據集拆分為訓練檢測器的訓練集和評估檢測器的測試集。選擇60%的培訓數據。使用其余的進行評估。

%將數據拆分為訓練和測試集。
idx = floor(0.6 * height(vehicleDataset));
trainingData = vehicleDataset(1:idx,:);
testData = vehicleDataset(idx:end,:);

創建一個卷積神經網絡(cnn)

美國有線電視新聞網是更快的r-cnn物體探測器的基礎。使用深度學習工具箱™功能逐層創建cnn。

imageInputLayer,它定義了輸入層的類型和大小。對於分類任務,輸入大小通常是訓練圖像的大小。對於檢測任務,cnn需要分析圖像的較小部分,因此輸入大小必須與數據集中最小的對象相似。在此數據集中,所有對象都大於[16 16],因此請選擇[32 32]的輸入大小。此輸入大小是cnn需要解析的處理時間和空間細節量之間的平衡。

%創建圖像輸入圖層。
inputLayer = imageInputLayer([32 32 3]);

接下來,定義網絡的中間層。中間層由convolution2dLayerreluLayer單元和maxPooling2dLayer的重復塊組成。這些層構成了卷積神經網絡的核心組成部分。

%定義卷積層參數。
filterSize = [3 3];
numFilters = 32;

%創建中間層。
middleLayers = [
                
    convolution2dLayer(filterSize,numFilters,'Padding',1)   
    reluLayer()
    convolution2dLayer(filterSize,numFilters,'Padding',1)  
    reluLayer() 
    maxPooling2dLayer(3,'Stride',2)    
    
    ]。

您可以通過重復這些基本圖層來創建更深的網絡。但是,為了避免過早地向下采樣數據,請將池層的數量保持在較低的水平。在網絡早期進行向下采樣會丟棄對學習有用的圖像信息。

有線電視美國新聞網的求最后一層通常由fullyConnectedLayer狀語從句:softmaxLayer組成

finalLayers = [
    
    %添加具有64個輸出神經元的完全連接的層。
    此圖層的輸出大小%將是一個長度為64的數組。
    fullyConnectedLayer(64)

    %添加ReLU非線性。
    reluLayer()

    %添加最后一個完全連接的圖層。此時,網絡必須
    %生成可用於測量輸入圖像
    %
    是否屬於對象類或背景之一的輸出。使用隨后的損耗層進行該測量%。
    fullyConnectedLayer(寬度(vehicleDataset))

    %添加softmax損耗圖層和分類圖層。 
    softmaxLayer()
    classificationLayer()
]。

合並輸入,中間和最終圖層。

layers = [
    inputLayer
    middleLayers
    finalLayers
    ]
layers = 
  帶有圖層的11x1圖層數組:

     1''圖像輸入帶有'zerocenter'標准化的32x32x3圖像
     2''卷積32 3x3卷積,步幅[1 1]和填充[1 1 1 1]
     3''ReLU ReLU
     4''卷積32 3x3卷積,步幅[1 1]和填充[1 1 1 1]
     5''ReLU ReLU
     6''Max Pooling 3x3 max pooling with stride [2 2]和padding [0 0 0 0]
     7''完全連接64完全連接層
     8''ReLU ReLU
     9''完全連接2完全連接層
    10''Softmax softmax
    11''分類輸出crossentropyex

配置培訓選項

trainFasterRCNNObjectDetector步驟訓練探測器。前兩個步驟培訓了該地區的建議和檢測網絡,用於更快的r-cnn。最后兩個步驟將前兩個步驟中的網絡組合在一起,以便創建一個用於檢測的網絡[1]。每個訓練步驟可以有不同的收斂速度,因此為每個步驟指定獨立的訓練選項是有益的。若要指定網絡培訓選項,請使用 trainingOptions 

步驟1的選項%optionsStage1 = trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

步驟2的選項%optionsStage2 = trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

步驟3的選項%optionsStage3 = trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

%選項步驟4. optionsStage4 = trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

options = [
    optionsStage1
    optionsStage2
    optionsStage3
    optionsStage4
    ]。

在這里,前兩個步驟的學習速率設置為高於最后兩個步驟。由於最后兩個步驟是微調步驟,因此網絡權重的修改速度可能比前兩個步驟慢。對於更快的r-cnn訓練,迷你批處理大小必須為1,每次迭代都會從一個訓練圖像處理多個圖像區域。

此外,'CheckpointPath'設置為所有培訓選項的臨時位置。通過此名稱值對,可以在訓練過程中節省部分訓練的檢測器。如果培訓中斷(例如由於停電或系統故障),您可以從保存的檢查點恢復培訓。

火車更快r-cnn

現在已經定義了cnn和訓練選項,您可以使用trainFasterRCNNObjectDetector訓練探測器

在訓練過程中,從訓練圖像中處理多個圖像區域。每個圖像的圖像區域數由'NumRegionsToSample'“控制。'PositiveOverlapRange''NegativeOverlapRange'名稱 - 值對控制用於訓練的圖像區域。正訓練樣本是指那些與地面真相框重疊0.6到1.0的樣本,用聯合度量的邊界框交點來衡量。負訓練樣本是那些重疊0到0.3的樣本。應通過在驗證集中測試訓練的檢測器來選擇這些參數的最佳值。

對於更快的r-cnn培訓,強烈建議使用一個並行的matlab工作人員池,以減少培訓時間trainFasterRCNNObjectDetector您的並行首選項設置,自動創建並使用並行池。確保在培訓之前啟用了並行池的使用。

高度推薦具有cvida™以上計算能力的nvidia™依照gpu進行培訓。

為了運動此示例時節省時間,將從磁盤加載預培訓的網絡。要自己訓練網絡,請將此處顯示的doTrainingAndEval變量設置為真。

%運行
%示例時,從磁盤加載經過訓練的網絡以節省時間將此標志設置為true以訓練網絡。
doTrainingAndEval = false;

if doTrainingAndEval
     %設置隨機種子以確保示例訓練可重復性。
    RNG(0);
    
    %訓練更快的R-CNN探測器。選擇BoxPyramidScale為1.2以允許
    %以獲得更精細的多尺度對象檢測分辨率。
    detector = trainFasterRCNNObjectDetector(trainingData,layers,options,... 
        'NegativeOverlapRange',[0 0.3],... 
        'PositiveOverlapRange',[0.6 1],... 
        'NumRegionsToSample',[256 128 256 128],.. 。
        'BoxPyramidScale',1.2);
else 
    %負載預訓練檢測器的例子。
    detector = data.detector;
結束

若要快速驗證訓練,請在測試圖像上運行檢測器。

%讀取測試圖像。
I = imread(testData.imageFilename {1});

%運行檢測器。
[bboxes,scores] = detect(detector,I);

%注釋圖像中的檢測。
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
數字
imshow(I)

盡管測試一張圖像顯示出很有希望的結果,但並非所有測試圖像都能產生檢測結果。請在整個測試集中評估檢測器,請按照下一節中概述的評估程序進行操作。

使用測試集評估檢測器

計算機視覺系統工具箱™提供對象檢測器評估功能,以測量常見的指標,如evaluateDetectionPrecision平均精度)和對數平均漏診率()。在這里,使用平均精度度量。平均精度提供了一個數字,其中包含了檢測器進行正確分類的能力(精度)和檢測器查找所有相關對象的能力(召回)。evaluateDetectionMissRate

檢測器評估的第一步是通過在測試裝置上運行檢測器來收集檢測結果。為了避免較長的評估時間,將從磁盤加載結果。將上一節doTrainingAndEval標志設置為真,以便在本地執行評估。

if doTrainingAndEval
     %在測試集中的每個圖像上運行檢測器並收集結果。
    resultsStruct = struct([]);
    for i = 1:height(testData)
        
        %閱讀圖像。
        I = imread(testData.imageFilename {i});
        
        %運行檢測器。
        [bbox,分數,標簽] =檢測(檢測器,I);
        
        %收集結果。
        resultsStruct(i).Boxes = bboxes;
        resultsStruct(i).Scores =得分;
        resultsStruct(i)。標簽=標簽;
    結束
    
    %將結果轉換為表格。
    results = struct2table(resultsStruct);
else 
    %從磁盤加載結果。
    results = data.results;
結束

%從測試數據中提取預期的邊界框位置。
expectedResults = testData(:,2:end);

%使用“平均精度”度量標准評估對象檢測器。
[ap,recall,precision] = evaluateDetectionPrecision(results,expectedResults);

精確召回(pr)曲線突出了探測器在不同召回水平下的精度。理想情況下,所有召回級別的精度為1. 在網絡中使用其他圖層有助於提高平均精度,但可能需要額外的培訓數據和更長的培訓時間。

%繪圖精度/召回曲線
數字
圖(召回,精度)
xlabel('召回'
ylabel('精確'
網格 
的標題(sprintf的('平均精密=%.2f',AP))

總結

這個例子展示了如何使用深度學習來訓練車輛檢測器您可以按照類似的步驟為交通標志,行人或其他物體訓練探測器。

引用

[1]任,s。,k。他,r。gershick和j。太陽。“更快的řCN:d ----使用區域建議網絡實現實時目標檢測”。模式分析與機器智能的IEEE交易第39卷,第6期,2017年6月,1137至1149年頁。

[2] girshick,r。,j。donahue,t。達雷爾和j。malik。“用於精確對象檢測和語義分割的豐富特征層次結構。2014年ieee計算機視覺和模式識別會議論文集俄亥俄州哥倫布市,2014年6月,580-587頁。

[3] girshick,r。“快速r-nnn”。2015年ieee計算機視覺國際會議論文集智利聖地亞哥,2015年12月,第1440-1448頁。

[4] zitnick,cl,p。美元。“邊緣框:邊緣從定位對象建議歐洲計算機視覺會議瑞士蘇黎世,2014年9月,第3391-405頁。

[5] uijlings,jrr,kea van de sande,t。gevers和awm meulders。“選擇性搜索對象識別。國際計算機視覺雜志第104卷,第2期,2013年9月,154-171頁。

 

關注公眾號: MATLAB基於模型的設計 (ID:xaxymaker) ,每天推送MATLAB學習最常見的問題,每天進步一點點,業精於勤荒於嬉

 打開微信掃一掃哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM