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


可以看到,到第400批時,學習率從0逐漸增加到0.001。它將一直停在那里,直到第3800批,當它再次變為0.0001。
7.1何時停止訓練?
隨着訓練的進行,日志文件包含每個批次的損失。在損失達到某個臨界值之后,就應該停止訓練。下面是根據雪人探測的批號繪制的損失。使用以下腳本生成繪圖:
python3 plotTrainLoss.py /full/path/to/train.log
實際的測試應該是使用學習到的權重來查看mAP。原始的darknet代碼沒有用於計算mAP的代碼。正致力於提供直接用補充增加代碼計算mAP的代碼,以便在保存權重文件時,可以監視精度並與mAP一起調用。看看AlexAB's fork of darknet的計算mAP。
對於雪人檢測,在配置文件中只有5200次迭代。可以讓它一直持續到最后。最后一次訓練的權重檔案,
darknet-yolov3_final.weights平均精度(mAP)為70.37%。
8. 測試模型
除了loss和mAP外,還應該在新數據上測試權重文件,並直觀地查看結果,以確保對結果滿意。在前面的文章中,描述了如何使用OpenCV測試YOLOv3模型。已經包含了測試雪人檢測的代碼。在目標檢測中,需要給出模型配置和模型權重文件object_detection_yolo.py的正確路徑並用圖像或視頻進行雪人檢測。
python3 object_detection_yolo.py --image=snowmanImage.jpg
References:
YOLOv3: An Incremental Improvement
