yolo3 入手必看[巨詳細]

yolo訓練總結

上一年總結的舊文章,也許對新接觸yolo的有點幫助.git

數據生成

via網頁標註的數據須要通過一系列轉換,才能適配yolo的訓練,主要步驟包括以下:github

  1. 根據標註json生成 每一張圖片的標註label: xxx.txt
xxx.txt格式(數值都是除以圖片實際寬高保存的):
類名 box矩形中心x座標 box矩形中心y座標 box矩形寬 box矩形高
複製代碼

  1. 同時會將圖片壓縮成1536,保存到image 文件夾中

  1. 最後會把train 以及 val 要訓練的圖片路徑分別保存起來,以讓模型讀取.

分享: 多線程以及jupyter進度條的集合算法

yolo環境搭建

這一步沒有耗費多少時間,根據官網一步一步走就沒問題 darknet官網json

訓練命令行:

  1. 進入darknet目錄
  2. 運行命令: ./darknet detector train ../_question/question.data ../_question/question1280TR.cfg -i 1

-i 1 :指定gpu:1.[吐槽:爲何是 i 的簡寫]bash

訓練過程當中的遇到的問題

想要不出意外,不踩坑:多線程

  1. 數據集符合要求是一個方面
  2. 另一方面就是cfg的配置

訓練過程當中的log數據解讀:學習

Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000000, .5R: -nan, .75R: -nan, count: 0ui

Region 23 Avg IOU: 0.860543, Class: 0.999887, Obj: 0.962618, No Obj: 0.000232, .5R: 1.000000, .75R: 0.950000, count: 20spa

11670(當前迭代batch次數): 0.225856(整體loss), 0.287980 avg(平均loss), 0.000100 rate(當前的學習率,在cfg中定義), 11.322880 seconds(當前batch耗費時間), 1867200 images(參與訓練的圖片總數).net

1. Region 16, Region 23:(存疑)

  • 不一樣尺度(16,23)卷積層上預測到的不一樣大小的框的參數
  • 16 卷積層爲最大的預測尺度, 使用較大的 mask, 可是能夠預測出較小的物體; 都nan,或爲0,說明在 16 卷積層中什麼物體都檢測不出來.
  • 23 卷積層爲最小的預測尺度, 使用較小的 mask, 能夠預測出較大的物體.

2. Avg IOU: 0.860543:

  • IOU- [標註的box面積] 和 [訓練檢測出的box面積] 重合率.
  • 具體算法以下:

3. Class: 0.999887:

box分類的正確率

4. Obj: 0.962618, No Obj: 0.000232:

  • Obj: 越接近 1 越好
  • No Obj: 指望該值愈來愈小, 但不爲零
  • 具體什麼含義仍是不太清楚

參考資料:

blog.csdn.net/gzj2013/art…

blog.csdn.net/fendoubasao…

blog.csdn.net/ll_master/a…

timebutt.github.io/static/unde…

問題記錄

問題1 模型沒法預測效果

現象:

檢測模型效果時, kernel have died

解決:

backup路徑寫錯 由於是C寫的,在notebook上沒有輸出具體的錯誤log,致使在這個問題上卡了比較久,最終在jupyter.log中定位到問題緣由.

問題2 訓練一下子 就中斷

解決:

排查了很多時間,發現是xxx.data 中設置的backup 路徑沒有建立,致使backup保存失敗,進而訓練中斷

問題3 沒法進行訓練

現象1:

訓練沒法開始. 也沒有什麼報錯信息

解決:

訓練類別增長後,須要更改4個參數

  1. xxx.data 中 classes 須要改變
  2. xxx.names 中須要添加對應類別名稱
  3. xxx.cfg 中 [yolo]層中的classes須要與類別對應
  4. xxx.cfg 中 [yolo]層的上一層[convolutional]的filters須要更改:filters=(classes + 5)* mask的數量. 參考連接

現象2:

訓練沒法開始. 報錯信息:

./darknet: error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory

解決:

由於cuda 路徑 darknet 沒有檢測到,輸入臨時路徑命令:

export LD_LIBRARY_PATH=/usr/local/cuda/lib64 && sudo ldconfig
複製代碼

而後再執行訓練命令便可

nohup ./darknet detector train ../xxxx/xxxx.data ../xxxxx/xxxx1280TR_1.cfg  -i 0  >> 1280TR_0625_train1.txt  &
複製代碼

現象3:

訓練沒法開始. 報錯信息:

8Cannot load image "/mobileHDD/xxxx/images/xxx_ (7416).jpg"
STB Reason: unknown image type images
複製代碼

解決:

圖片壓縮尺寸存在問題,須要從新生成圖片.

問題4 模型檢出物體效果極差

現象:

  1. loss 在1.9 左右
  2. thresh = 0.5,無物體檢出.
  3. 只有thresh 調到0.01,纔有部分物體能檢測出來,而且有很是多錯誤的box,box 很是小

推測1:

根據[現象2],推測有多是cfganchors大小不正確,採用kmeans 聚類分析 anchors 大小. 由於新一批數據含有很是多得用戶真實數據,而用戶真實數據的物體大小波動範圍很是大,原來的anchors不適合了.

推測2:

圖片尺寸沒有歸一致使.

不知道怎麼解決的了,有多是兩個問題同時出現,致使了這個現象.到晚上9點才解決.左側腦殼疼...用腦過分,硬懟把這個問題解決了....

  1. 從新生成數據,不是使用原圖尺寸,而是使用1280px
  2. anchors增長到21個

目前來看都正常了.....

問題5: 部分物體檢測比較好,部分很是差

現象:

  1. loss:

其它訓練log:

2. [某類物體檢測] 在用戶圖片中很是容易漏掉,對應[log]中 obj較低 而在其它數據中效果較好,有些連一個都沒有檢測到.

  1. [另一類檢測] 基本沒有效果

  2. 某類物體漏檢很是嚴重

2~4點 都是 thresh= 0.1的狀況下 很是反常!按理來講,loss降低到0.5左右,效果應該是比較好的,可是卻明顯比以前的效果差

推測:

髒數據太多,一共發現近200張含髒數據的圖片.(圖片顛倒,漏標,錯標,二值化),去除掉這部分後再訓練看看 是否會好不少.

推測否認:

剔除髒數據後,訓練結果中 現象仍然存在,但檢測率高了很多.

  1. loss = 0.6

2. 但obj 在0.3-0.6之間.仍然很是低,正常值應該在0.8以上.

  1. 在跑結果時發現一個現象:某類物體面積大一點,檢測率很是低,而小面積的物體基本比較正常

所以,推測是anchors 設置不合理致使的,anchors設置過小致使

參數理解:

mask

  1. 爲了達到在不一樣[yolo]層使用不一樣大小的anchors的目的,使用mask做爲anchors的下標[index] 大概意思就是在淺層的[yolo]中使用較大的 anchors,粗略的把檢測目標框選到,在深一層中,使用較小的anchors 更爲精細地框選到檢測目標.

  • 做者原話: 每一層咱們都得知道全部的boxes大小.可是隻會使用一部分的boxes去
  1. mask 與上一層[convolutional] 的filters 是關聯的. 只有當 filters = (classes +5)* [mask數量]的時候訓練才能進行,不然會報錯:輸出層和輸入層的數量不對應
darknet: ./src/parser.c:315: parse_yolo: Assertion `l.outputs == params.inputs' failed 複製代碼

參數解讀: blog.csdn.net/phinoo/arti…

個人滴滴雲專屬AI大師碼:3388, 購買滴滴雲GPU等AI產品輸入大師碼享9折優惠。 點擊 www.didiyun.com前往滴滴雲官網購買

本篇文章由一文多發平臺ArtiPub自動發佈

相關文章
相關標籤/搜索