怎样训练YOLOv3
怎樣訓(xùn)練YOLOv3
Training YOLOv3 : Deep Learning based Custom
Object Detector
本文將在一些公開(kāi)的雪人圖片和視頻上分享訓(xùn)練過(guò)程、有助于訓(xùn)練的腳本和結(jié)果。可以使用相同的過(guò)程來(lái)訓(xùn)練具有多個(gè)目標(biāo)檢測(cè)。
先下載代碼,例如,
下載地址一:https://github.com/madhawav/YOLO3-4-Py
下載地址二:https://github.com/Eric3911/yolov3_darknet
- 數(shù)據(jù)集
與任何深度學(xué)習(xí)任務(wù)一樣,第一個(gè)最重要的任務(wù)是準(zhǔn)備數(shù)據(jù)集。將使用谷歌OpenImagesV4數(shù)據(jù)集中的雪人圖片,該數(shù)據(jù)集在網(wǎng)上公開(kāi)發(fā)布。它是一個(gè)很大的數(shù)據(jù)集,大約有600個(gè)不同的對(duì)象類。數(shù)據(jù)集還包含這些對(duì)象的邊界框批注。整體而言,數(shù)據(jù)集超過(guò)500GB,但將下載部分用于非商用產(chǎn)品開(kāi)發(fā)的帶有“雪人”對(duì)象的圖像。
1.1 Download data
First we will need to install awscli
sudo pip3 install awscli
需要得到相關(guān)的openImages文件,class-descriptions-boxable.csv 和
train-annotations-bbox.csv (1.11GB) ,需要找到感興趣的目標(biāo)文件。
wget https://storage.googleapis.com/openimages/2018_04/class-descriptions-boxable.csv
wget https://storage.googleapis.com/openimages/2018_04/train/train-annotations-bbox.csv
Next, move the above .csv files to the same
folder as the downloaded code and then use the following script to download the data
隨后,將above.csv文件移動(dòng)到與下載的代碼相同的文件夾中,使用以下腳本下載數(shù)據(jù)。
python3 getDataFromOpenImages_snowman.py
圖像下載到JPEGImages文件夾,相應(yīng)的標(biāo)簽文件寫(xiě)入labels文件夾。下載將獲得770個(gè)雪人實(shí)例539張圖片。jpeg圖像和標(biāo)簽的大小都應(yīng)該小于136mb。 對(duì)于多類目標(biāo)檢測(cè),需要為每個(gè)類提供更多的樣本,需要獲得測(cè)試test-annotations-bbox.csv 和驗(yàn)證validation-annotations-bbox.csv,然后在python腳本中修改運(yùn)行模式,重新運(yùn)行以獲取每個(gè)類的更多圖像。在目前的雪人案例中,770個(gè)實(shí)例就足夠了。
1.2 分段訓(xùn)練測(cè)試
機(jī)器學(xué)習(xí)訓(xùn)練過(guò)程都需要先將數(shù)據(jù)隨機(jī)分成兩組。
訓(xùn)練集:這是訓(xùn)練模型的數(shù)據(jù)部分。根據(jù)擁有的數(shù)據(jù)量,可以隨機(jī)選擇70%到90%的數(shù)據(jù)進(jìn)行訓(xùn)練。
測(cè)試集:用來(lái)測(cè)試模型的數(shù)據(jù)的一部分,10-30%的數(shù)據(jù)。圖像不應(yīng)該是訓(xùn)練和測(cè)試集的一部分。
將JPEGImages文件夾中的圖像分成訓(xùn)練和測(cè)試集。用下面的splitTrainAndTest.py腳本,將JPEGImages文件夾的完整路徑作為參數(shù)傳遞。
python3 splitTrainAndTest.py/full/path/to/snowman/JPEGImages/
上面的腳本將數(shù)據(jù)分成一列(90%)和一個(gè)測(cè)試集(10%),并生成兩個(gè)文件snowman_train.txt 和snowman_test.txt。
- Darknet
使用Joseph Redmon的Darknet版本,這是一個(gè)用C語(yǔ)言編寫(xiě)的深度學(xué)習(xí)框架。
2.1 Download and build Darknet
Let’s first download and build it on your system.
cd ~
git clone https://github.com/pjreddie/darknet
cd darknet
make
2.2 Modify code to save model files regularly
在確保原始repo在您的系統(tǒng)中編譯之后,讓我們進(jìn)行一些小的修改以存儲(chǔ)中間權(quán)重。在examples/detector.c文件中,從
if(i%10000==0 || (i < 1000&& i%100 == 0)){
到
if(i%1000==0 || (i <2000 && i%200 == 0)){
原始repo在每100次迭代后保存網(wǎng)絡(luò)權(quán)重,直到第一次1000次,然后僅在每10000次迭代后保存。由于只使用一個(gè)類進(jìn)行訓(xùn)練,希望訓(xùn)練收斂得更快。為了密切監(jiān)視進(jìn)度,每200次迭代后保存一次,直到達(dá)到2000次,然后每1000次迭代后保存一次。再次使用make命令重新編譯darknet。使用NVIDIA GeForce GTX 1080 GPU進(jìn)行了實(shí)驗(yàn)。現(xiàn)在了解一些成功運(yùn)行訓(xùn)練所需的更多詳細(xì)信息。
- 數(shù)據(jù)注釋
已將標(biāo)簽文件與“標(biāo)簽”文件夾中的批注共享。標(biāo)簽文件中的每個(gè)行條目表示圖像中的單個(gè)邊界框,并包含有關(guān)該框的以下信息:
第一個(gè)字段object-class-id是表示目標(biāo)類。它的范圍從0到(類數(shù)–1)。在現(xiàn)在的例子中,由于只有一個(gè)雪人等級(jí),所以它總是設(shè)置為0。
第二個(gè)和第三個(gè)條目center-x和center-y分別是邊框中心的x和y坐標(biāo),分別被圖像寬度和高度規(guī)范化(除以)。
第四項(xiàng)和第五項(xiàng)、寬度和高度分別是邊界框的寬度和高度,再次分別用圖像寬度和高度進(jìn)行規(guī)格化(除以)。
考慮一個(gè)帶有以下符號(hào)的示例:
–x-coordinate(in pixels) of the center of the bounding box
–y-coordinate(in pixels) of the center of the bounding box
–width(in pixels) of the bounding box
–height(in pixels) of the bounding box
–width(in pixels) of the whole image
–height(in pixels) of the whole image
計(jì)算標(biāo)簽文件中的注釋值,如下所示:
center-x =
center-y =
width =
height =
以上四項(xiàng)都是0到1之間的浮點(diǎn)值。
- Download Pre-trained model
在訓(xùn)練目標(biāo)檢測(cè)時(shí),最好利用在非常大的數(shù)據(jù)集上訓(xùn)練的現(xiàn)有模型,即使大數(shù)據(jù)集可能不包含要檢測(cè)的目標(biāo)。這個(gè)過(guò)程叫做遷移學(xué)習(xí)。
不需要從頭訓(xùn)練,而是使用一個(gè)包含在ImageNet上訓(xùn)練的卷積權(quán)重的預(yù)訓(xùn)練模型。使用這些權(quán)重作為起始權(quán)重,網(wǎng)絡(luò)可以更快地訓(xùn)練。現(xiàn)在把它下載到darknet文件夾。
cd ~/darknet
wget https://pjreddie.com/media/files/darknet53.conv.74 -O
~/darknet/darknet53.conv.74
- Data file
在文件中darknet數(shù)據(jù)(包括在代碼分發(fā)中),需要提供有關(guān)目標(biāo)檢測(cè)器的規(guī)范和一些相關(guān)路徑的信息。
classes = 1
train = /path/to/snowman/snowman_train.txt
valid = /path/to/snowman/snowman_test.txt
names = /path/to/snowman/classes.names
backup = /path/to/snowman/weights/
classes參數(shù)需要類的數(shù)量在本例子為1。
需要提供雪人圖庫(kù)的snowman_train.txt
和snowman_test.txt絕對(duì)路徑文件,分別有用于訓(xùn)練(訓(xùn)練參數(shù))和驗(yàn)證(有效參數(shù))的文件列表。
names字段表示包含所有類的名稱的文件的路徑。已經(jīng)包括了classes.names,包含類名“snowman”的文件。需要在機(jī)器里提供它的絕對(duì)路徑。
對(duì)于backup參數(shù),需要提供到現(xiàn)有目錄的路徑,可以將中間權(quán)重文件存儲(chǔ)為訓(xùn)練進(jìn)展文件darknet數(shù)據(jù)(包括在代碼分發(fā)中),需要提供有關(guān)目標(biāo)檢測(cè)的規(guī)范和一些相關(guān)路徑的信息。
6。YOLOv3配置參數(shù)
darknet.data 和 classes.names文件中,YOLOv3還需要一個(gè)配置文件darknet-yolov3.cfg,包含在代碼庫(kù)中。基于演示yolov3-voc.cfg(帶有darknet代碼),用于在VOC數(shù)據(jù)集上進(jìn)行訓(xùn)練。所有重要的訓(xùn)練參數(shù)都存儲(chǔ)在此配置文件中。理解它們的含義和設(shè)置它們的值。
6.1 YOLOv3中的批量超參數(shù)
進(jìn)一步了解批處理和細(xì)分參數(shù)。
[net]
Testing
batch=1
subdivisions=1
Training
batch=64
subdivisions=16
batch參數(shù)表示訓(xùn)練期間使用的批大小。
訓(xùn)練集包含了幾百?gòu)垐D片,但是使用數(shù)百萬(wàn)張圖片進(jìn)行訓(xùn)練并不少見(jiàn)。訓(xùn)練過(guò)程包括根據(jù)神經(jīng)網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)集上的錯(cuò)誤次數(shù)迭代更新神經(jīng)網(wǎng)絡(luò)的權(quán)值。 一使用訓(xùn)練集中的所有圖像更新權(quán)重是不實(shí)際的(也是不必要的)。在一次迭代中使用一小部分圖像,這個(gè)子集稱為批處理大小。
當(dāng)批量大小設(shè)置為64時(shí),這意味著在一次迭代中使用64個(gè)圖像來(lái)更新神經(jīng)網(wǎng)絡(luò)的參數(shù)。
6.2 Subdivisions configuration
parameter in YOLOv3
即使使用64的批處理大小來(lái)訓(xùn)練,但可能沒(méi)有具有足夠內(nèi)存的GPU來(lái)使用64的批處理大小。幸運(yùn)的是,Darknet允許指定一個(gè)名為subdivisions的變量,該變量允許一次在GPU上處理批大小的一小部分。
可用subdivisions=1開(kāi)始訓(xùn)練,如果出現(xiàn)內(nèi)存不足錯(cuò)誤,請(qǐng)將subdivisions參數(shù)增加2的倍數(shù)(例如2、4、8、16),直到訓(xùn)練成功進(jìn)行。GPU將在任何時(shí)候處理圖像的數(shù)量,但只有在處理完所有64個(gè)(如上所述)圖像之后,完整的批處理或迭代才會(huì)完成。在測(cè)試期間,批次和細(xì)分都設(shè)置為1。
6.3 Width, Height,
Channels
這些配置參數(shù)指定輸入圖像大小和通道數(shù)。
width=416
height=416
channels=3
訓(xùn)練前,首先將輸入的訓(xùn)練圖像調(diào)整為width x height。這里我們使用默認(rèn)值416×416。如果增加到608×608,效果可能會(huì)有所改善,但訓(xùn)練時(shí)間也會(huì)更長(zhǎng)。channels=3表示將處理3通道RGB輸入圖像。
6.4 Momentum and Decay
配置文件包含一些控制權(quán)重更新方式的參數(shù)。
momentum=0.9
decay=0.0005
前面提到了如何基于一小批圖像而不是整個(gè)數(shù)據(jù)集更新神經(jīng)網(wǎng)絡(luò)的權(quán)重。由于這個(gè)原因,權(quán)重更新的波動(dòng)很大。這就是為什么參數(shù)動(dòng)量用于懲罰迭代之間的較大權(quán)重變化。 一個(gè)典型的神經(jīng)網(wǎng)絡(luò)有數(shù)百萬(wàn)個(gè)權(quán)值,很容易對(duì)任何訓(xùn)練數(shù)據(jù)進(jìn)行過(guò)度擬合。過(guò)度擬合僅僅意味著在訓(xùn)練數(shù)據(jù)上會(huì)做得很好,而在測(cè)試數(shù)據(jù)上會(huì)做得很差。這幾乎就像神經(jīng)網(wǎng)絡(luò)已經(jīng)記住了訓(xùn)練集中所有圖像的答案,但實(shí)際上并沒(méi)有學(xué)習(xí)到潛在的概念。減輕這個(gè)問(wèn)題的方法之一是懲罰權(quán)重的大值。參數(shù)衰減控制這個(gè)懲罰項(xiàng)。默認(rèn)值工作得很好,但如果注意到過(guò)擬合,則可能需要對(duì)此進(jìn)行調(diào)整。
6.5 Learning Rate, Steps,
Scales, Burn In (warm-up)
learning_rate=0.001
policy=steps
steps=3800
scales=.1
burn_in=400
參數(shù)學(xué)習(xí)率控制應(yīng)該根據(jù)當(dāng)前的一批數(shù)據(jù)學(xué)習(xí)的積極性。通常這是一個(gè)介于0.01和0.0001之間的數(shù)字。 在訓(xùn)練過(guò)程的開(kāi)始,從零信息開(kāi)始的,學(xué)習(xí)率需要很高。神經(jīng)網(wǎng)絡(luò)看到了大量的數(shù)據(jù),權(quán)值的變化需要減少。學(xué)習(xí)率需要隨著時(shí)間的推移而降低。在配置文件中,學(xué)習(xí)率的降低是通過(guò)首先指定學(xué)習(xí)率降低策略是步驟來(lái)實(shí)現(xiàn)的。在上面的例子中,學(xué)習(xí)率將從0.001開(kāi)始,在3800次迭代中保持不變,然后它將乘以比例得到新的學(xué)習(xí)率。可以指定多個(gè)步驟和比例。
在前一段中,提到學(xué)習(xí)率在開(kāi)始時(shí)需要很高,以后需要很低。雖然這一說(shuō)法基本上是正確的,但據(jù)經(jīng)驗(yàn)發(fā)現(xiàn),如果在一開(kāi)始的短時(shí)間內(nèi)學(xué)習(xí)率較低,訓(xùn)練速度往往會(huì)提高。這由burn_-in參數(shù)控制。有時(shí)這個(gè)磨合期也叫熱身期。
6.6數(shù)據(jù)擴(kuò)充
數(shù)據(jù)收集需要很長(zhǎng)時(shí)間。首先要收集1000個(gè)圖片,然后在每個(gè)圖片周圍手動(dòng)創(chuàng)建邊框。一個(gè)由5個(gè)數(shù)據(jù)采集器組成的團(tuán)隊(duì)花了1天的時(shí)間完成了這個(gè)過(guò)程。
希望通過(guò)編制新的數(shù)據(jù)來(lái)最大限度地利用這些數(shù)據(jù)。這個(gè)過(guò)程叫做數(shù)據(jù)擴(kuò)充。例如,雪人旋轉(zhuǎn)5度的圖像仍然是雪人的圖像。配置文件中的角度參數(shù)允許您以±角度隨機(jī)旋轉(zhuǎn)給定圖像。
如果使用飽和度、曝光度和色調(diào)變換整個(gè)圖片的顏色,仍然是雪人的圖片。
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
使用默認(rèn)值進(jìn)行訓(xùn)練。
6.7迭代次數(shù)
需要指定訓(xùn)練過(guò)程應(yīng)該運(yùn)行多少次迭代。最大批數(shù)=5200。對(duì)于多類對(duì)象檢測(cè),最大的批數(shù)更高,需要運(yùn)行更多的批數(shù)(例如在yolov3 yolov3-voc.cfg中)。對(duì)于n類目標(biāo)檢查,建議至少對(duì)2000*n批進(jìn)行訓(xùn)練。只有一個(gè)類的情況下,5200似乎是最大批量的安全數(shù)字。
max_batches=5200
- Training YOLOv3
訓(xùn)練需要哪些不同的組件,開(kāi)始訓(xùn)練過(guò)程。轉(zhuǎn)到darknet目錄并使用以下命令啟動(dòng)它:
cd ~/darknet
./darknet detector train
/path/to/snowman/darknet.data /path/to/snowman/darknet-yolov3.cfg
./darknet53.conv.74 > /path/to/snowman/train.log
確保給出正確的路徑darknet.data和 darknet-yolov3.cfg文件。我們還將訓(xùn)練日志保存到一個(gè)名為train.log數(shù)據(jù)集目錄中,可以在訓(xùn)練繼續(xù)進(jìn)行時(shí)處理loss。在訓(xùn)練中使用grep命令監(jiān)視loss的一種有用方法是train.log文件。
grep “avg” /path/to/snowman/train.log
它顯示批次號(hào)、當(dāng)前批次中的損失、當(dāng)前批次之前的平均損失、當(dāng)前學(xué)習(xí)速率、批次所用的時(shí)間以及當(dāng)前批次之前使用的圖像。如下圖所示,直到每批圖像增加64個(gè)為止,使用的圖像數(shù)一直在增加。將批處理大小設(shè)置為64。
可以看到,到第400批時(shí),學(xué)習(xí)率從0逐漸增加到0.001。它將一直停在那里,直到第3800批,當(dāng)它再次變?yōu)?.0001。
7.1何時(shí)停止訓(xùn)練?
隨著訓(xùn)練的進(jìn)行,日志文件包含每個(gè)批次的損失。在損失達(dá)到某個(gè)臨界值之后,就應(yīng)該停止訓(xùn)練。下面是根據(jù)雪人探測(cè)的批號(hào)繪制的損失。使用以下腳本生成繪圖:
python3 plotTrainLoss.py /full/path/to/train.log
實(shí)際的測(cè)試應(yīng)該是使用學(xué)習(xí)到的權(quán)重來(lái)查看mAP。原始的darknet代碼沒(méi)有用于計(jì)算mAP的代碼。正致力于提供直接用補(bǔ)充增加代碼計(jì)算mAP的代碼,以便在保存權(quán)重文件時(shí),可以監(jiān)視精度并與mAP一起調(diào)用。看看AlexAB’s fork of darknet的計(jì)算mAP。
對(duì)于雪人檢測(cè),在配置文件中只有5200次迭代。可以讓它一直持續(xù)到最后。最后一次訓(xùn)練的權(quán)重檔案,
darknet-yolov3_final.weights平均精度(mAP)為70.37%。
- 測(cè)試模型
除了loss和mAP外,還應(yīng)該在新數(shù)據(jù)上測(cè)試權(quán)重文件,并直觀地查看結(jié)果,以確保對(duì)結(jié)果滿意。在前面的文章中,描述了如何使用OpenCV測(cè)試YOLOv3模型。已經(jīng)包含了測(cè)試雪人檢測(cè)的代碼。在目標(biāo)檢測(cè)中,需要給出模型配置和模型權(quán)重文件object_detection_yolo.py的正確路徑并用圖像或視頻進(jìn)行雪人檢測(cè)。
python3 object_detection_yolo.py
–image=snowmanImage.jpg
References:
YOLOv3: An Incremental Improvement
總結(jié)
以上是生活随笔為你收集整理的怎样训练YOLOv3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单目视觉里程计性能估计
- 下一篇: 常用深度学习框——Caffe/Tenso