Python影像辨識筆記(九之三):YOLOv3結合深度學習的Object Detector

原文Training YOLOv3 : Deep Learning based Custom Object Detector

Github程式碼Repo:https://github.com/spmallick/learnopencv/tree/master/YOLOv3-Training-Snowman-Detector

YOLOv3的訓練流程

取得資料

要分類的照片
python3 getDataFromOpenImages_snowman.py
已經標記的Class名稱.csv
(wget https://storage.googleapis.com/openimages/2018_04/class-descriptions-boxable.csv)
需要被標記的檔案.csv
(wget https://storage.googleapis.com/openimages/2018_04/train/train-annotations-bbox.csv)

切成訓練集和測試集

測試集10~30%

python3 splitTrainAndTest.py /full/path/to/snowman/JPEGImages/

Darknet

cd ~git clone https://github.com/pjreddie/darknetcd darknetmake修改examples/detector.c的內容

if(i%10000==0 || (i < 1000 && i%100 == 0)){
改成:if(i%1000==0 || (i < 2000 && i%200 == 0)){#每200次迭代存檔一次,2000次後,每1000次迭代存檔一次

資料標記

Labels資料夾中的檔案有:<object-class-id> <center-x> <center-y> <width> <height>object-class-id是物件的class屬性(只辨識1種就寫0就好)center-x和center-y代表著標記框框的中心X座標和中心Y座標(px為單位)width和height代表標記框框的寬度和高度(px為單位)
Image for post
Image for post

下載預先訓練的模型

cd ~/darknetwget https://pjreddie.com/media/files/darknet53.conv.74 -O ~/darknet/darknet53.conv.74

資料檔案

針對darknet.data,提供連結到相關檔案的路徑#只訓練一種標籤的話,classes必須=1#路徑必須為絕對路徑#classes.names檔案包含有classes的名稱#backup資料夾用來保存訓練的weights存放路徑classes = 1train = /path/to/snowman/snowman_train.txtvalid = /path/to/snowman/snowman_test.txtnames = /path/to/snowman/classes.namesbackup = /path/to/snowman/weights/

YOLOv3的參數設定

[net]# Testing# batch=1# subdivisions=1# Trainingbatch=64subdivisions=16#batch=64代表在一次迭代中,有64張圖片被拿來訓練,以更新神經網路的參數#subdivisions是拿來處理GPU記憶體不足的問題,可以使用1,2,4,8,16來測測看#subdivisions=16代表GPU每次處理(batch/subdivisions)=64/16=4張圖片#在測試過程中batch和subdivisions都會被設定成1width=416 #代表圖片寬度將被修改尺寸成416height=416 #代表圖片高度將被修改尺寸成416channels=3 #代表使用RGB,共3個頻道來處理圖片momentum=0.9 #拿來懲罰權重變動太過劇烈(防止Over-fitting)decay=0.0005 #預設值即可,同樣拿來處理Over-fittinglearning_rate=0.001 
policy=steps
steps=3800scales=.1burn_in=400# learning_rate控制學習的幅度(通常在0.01~0.0001),剛開始訓練時,因為對資料不了解,學習率高一點(大膽的學習),隨著對資料的熟悉,必須下降學習率(謹慎的學習)#在上面的案例中,學習率會在達到第3800次迭代時,乘上scales(此例為.1),來獲取新的學習率。我們也可以指定多個steps和scales。#burn_in peroid參數又被稱作為warm-up period

Data augmentation(資料增強)

#同樣的雪人圖片,使用不同的角度、飽和度、曝光、色調,依舊還是雪人的圖片angle=0 #角度saturation = 1.5 #飽和度exposure = 1.5 #曝光hue=.1 #色調#使用預設值做訓練

Number of iterations迭代的次數

max_batches=5200#1個class標籤有5200次迭代已經很充足了#對一個擁有n個標籤的物件偵測器,至少需要訓練2000*n個batches

訓練YOLOv3

cd ~/darknet./darknet detector train /path/to/snowman/darknet.data /path/to/snowman/darknet-yolov3.cfg ./darknet53.conv.74 > /path/to/snowman/train.log#確保給予正確的路徑,避免出現錯誤#訓練記錄保存在train.log中#即時監控訓練losss
grep “avg” /path/to/snowman/train.log
#顯示目前batch中的batch number、loss、截至目前為止的平均batch、目前的學習率、此次batch所花費的時間、截至目前為止已經使用的圖片數量(batch number, loss in the current batch, average loss till the current batch, current learning rate, time taken for the batch and images used till current batch.)

何時停止訓練?

#繪製avg losspython3 plotTrainLoss.py /full/path/to/train.log
Image for post
Image for post

測試訓練出來的Model

用嶄新的資料來測試我們訓練出來的模型提供object_detection_yolo.py中,modelConfiguration和modelWeights的正確路徑#測試modelpython3 object_detection_yolo.py — image=snowmanImage.jpg

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store