手把手教你用深度學習做物體檢測(三):模型訓練


本篇文章旨在快速試驗使用yolov3算法訓練出自己的物體檢測模型,所以會重過程而輕原理,當然,原理是非常重要的,只是原理會安排在后續文章中專門進行介紹。所以如果本文中有些地方你有原理方面的疑惑,也沒關系,可以自行網上搜索相關資料,也可以先留着問題,相信你會在后續文章中找到答案。
       
上篇文章《手把手教你用深度學習做物體檢測(二):數據標注》中已經介紹了如何准備我們訓練模型需要用到的數據,上篇文章中有個需要注意的地方就是在生成yolov3所需格式的文件時,務必在unbuntu下生成,我之前在windows下生成然后傳到ubuntu上去的,其中的路徑需要手動修改成unbuntu下的路徑,而且后面在unbuntu下訓練的時候會遇到編碼問題導致報錯。數據以及目錄結構如下圖:
   
 
進入下一步前,請確保你准備好了上面的數據並放到了相應的目錄結構下,如果你還不太清楚如何准備這些數據,建議先看看上一篇文章《手把手教你用深度學習做物體檢測(二):數據標注》。        
 
數據准備好之后,我們需要找一個基於yolov3算法實現的成熟的訓練框架,網上有很多文章都提及到了下面這三個項目:
這里推薦上面的第三個,也就是AlexeyAB/darknet項目。原因有3點:
  • 該項目最近的修改時間是2019-04-16,也就是說仍然在持續維護,而另外兩個項目最早的也是7個月前了。
  • 該項目的文檔非常詳細,比另外兩個項目都詳細很多。
  • 該項目支持在訓練過程中實時觀測損失值、mAP等重要指標的變化趨勢。 
注意:下面的一切操作若無特殊說明,都是在unbuntu18.04桌面版操作系統環境下,並且假設你已經准備好了深度學習所需的硬件及軟件環境,如果沒有,可以參照這篇文章《如何在阿里雲租一台GPU服務器做深度學習?》。
 
ok,讓我們進入模型訓練正式內容。 -首先,下載AlexeyAB/darknet項目。 -然后,進入項目目錄,參考官網編譯該項目。 -接着,創建names-data目錄 。 -將2007_test.txt和2007_train.txt兩個文件放到 names-data目錄下。 -下載預訓練的權重文件:  http://pjreddie.com/media/files/darknet53.conv.74 ,放置到names-data目錄下,訓練會在該文件的基礎之上進行,這樣會比較快收斂,若暫時不明白也不要緊,繼續往后就行了。 -拷貝cfg/yolov3-voc.cfg文件到  names-data目錄下,重命名為:yolo-obj.cfg,該文件中有基礎需要修改如下:
  
 - names-data目錄下創建voc.names文件,內容是你的目標類別,舉例如下:
 
- names-data目錄下創建backup目錄
 
-names-data目錄下創建voc.data文件,內容如下:
 
-確保VOCdevkit目錄的路徑同2007_test.txt、2007_train.txt兩個文件中記錄的圖片路徑所在目錄一致。
 
-接下來,打開終端,輸入訓練命令:
./darknet detector train names-data/voc.data names-data/yolo-obj.cfg names-data/darknet53.conv.74 -gpus 1 -map # 如果中途中斷了,可以從backup目錄下,找到最新的.weights文件或任意迭代周期生成的.weights文件,在此基礎上繼續訓練,命令如下: ./darknet detector train names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_last.weights -gpus 1 -map
訓練過程開始后,除了終端會持續顯示訓練情況,還會額外出現一個窗口以圖形的方式實時展示損失值和mAP的變化情況:
 
我的目標類別是12類,每類大概有800張,迭代到3000次以后,平均損失值開始收斂,在0.5左右,另外由於測試樣本和訓練樣本來此同一批次采集,只是拍攝角度距離不同,並且沒有引入負樣本,所以mAP的值可以接近100%。這里損失值、mAP什么的如果你暫時還不清楚具體的意義,也沒關系,在后續的文章中會有介紹,這里可以先直觀上理解為平均損失值越小越好,mAP越接近1越好就行了。 訓練時間在RTX-2060上大概是3個小時左右。訓練結束后,我得到下面的模型文件:
 
ok,到此模型訓練過程就結束了,此時你一定想要試試模型的識別情況怎么樣,你可以使用AlexeyAB/darknet項目提供的命令:
--檢測圖片 ./darknet detector test names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_3000.weights -ext_output names-data/images/IMG_0728.JPG --檢測視頻 ./darknet detector demo names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_3000.weights -ext_output names-data/videos/food52hd.mp4 -out_filename names-data/videos/food52hd_detect.mp4
 
此時,如果順利,你將會看到目標被檢測出來了,但是有一個問題,就是所有的中文都顯示成了亂碼,如果你想快速知道類別檢測的對不對,可以將names-data目錄下的voc.names文件內容改為英文,此時你將會看到類別正常顯示出來了,但是沒有顯示對應的置信度,置信度可以直觀上理解為該目標為當前顯示類別的概率以及該矩形檢測框位置的置信度,所以如果有置信度的顯示,便於我們進一步了解目標檢測的情況。

關於中文亂碼和置信度缺失的問題,由於本篇文章已經夠長的了,所以將會在下一篇《手把手教你用深度學習做物體檢測(四):模型使用》中進行闡述,下一篇文章中,我們會基於python來實現一個模型使用程序,以及為什么非要用python來重新實現一個模型使用程序的原因。

  ok,本篇就這么多內容啦~,感謝閱讀O(∩_∩)O,88~
 
名句分享
 趙客縵胡纓,吳鈎霜雪明。銀鞍照白馬,颯沓如流星。
十步殺一人,千里不留行。事了拂衣去,深藏身與名。
閑過信陵飲,脫劍膝前橫。將炙啖朱亥,持觴勸侯嬴。
三杯吐然諾,五岳倒為輕。眼花耳熱后,意氣素霓生。
救趙揮金槌,邯鄲先震驚。千秋二壯士,煊赫大梁城。
縱死俠骨香,不慚世上英。誰能書閤下,白首太玄經。
—— 《俠客行》【唐】李白    
為您推薦
 


免責聲明!

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



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