yolo---參數解釋之訓練log中各參數
******訓練log中各參數的意義************************************************************* yolov3-voc Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005 Resizing 384 Loaded: 0.000077 seconds Region 82 Avg IOU: 0.293486, Class: 0.443128, Obj: 0.680025, No Obj: 0.532993, .5R: 0.142857, .75R: 0.000000, count: 7 Region 94 Avg IOU: 0.203765, Class: 0.575399, Obj: 0.361495, No Obj: 0.513690, .5R: 0.000000, .75R: 0.000000, count: 4 Region 106 Avg IOU: 0.148327, Class: 0.769327, Obj: 0.539390, No Obj: 0.469288, .5R: 0.000000, .75R: 0.000000, count: 1 ... ... ... Region 82 Avg IOU: 0.257638, Class: 0.441840, Obj: 0.617525, No Obj: 0.531992, .5R: 0.071429, .75R: 0.000000, count: 14 Region 94 Avg IOU: 0.070440, Class: 0.604375, Obj: 0.246185, No Obj: 0.513274, .5R: 0.000000, .75R: 0.000000, count: 6 Region 106 Avg IOU: 0.072315, Class: 0.733155, Obj: 0.818539, No Obj: 0.469309, .5R: 0.000000, .75R: 0.000000, count: 1 156: 840.799866, 840.799866 avg, 0.000000 rate, 1.843955 seconds, 64 images
******************************************************************* 訓練結果顯示參數說明: (1)Learning Rate: 0.001, 學習率 . 學習率: 決定了參數移動到最優值的速度快慢. 如果學習率過大,很可能會越過最優值導致函數無法收斂,甚至發散;反之,如果學習率過小,優化的效率可能過低,算法長時間無法收斂,也易使算法陷入局部最優(非凸函數不能保證達到全局最優)。合適的學習率應該是在保證收斂的前提下,能盡快收斂。 設置較好的learning rate,需要不斷嘗試。在一開始的時候,可以將其設大一點,這樣可以使weights快一點發生改變,在迭代一定的epochs之后人工減小學習率。 在yolo訓練中,網絡訓練160epoches,初始學習率為0.001,在60和90epochs時將學習率除以10。 (2)Momentum: 0.9, 滑動平均模型 . 在訓練的過程中不斷地對參數求滑動平均,這樣能夠更有效地保持穩定性,使其對當前參數更新不敏感。例如加動量項的隨機梯度下降法就是在學習率上應用滑動平均模型。,一般會選擇0.9~0.95. (3)Decay: 0.0005, 權重衰減 . 使用的目的是防止過擬合,當網絡逐漸過擬合時網絡權值往往會變大,因此,為了避免過擬合,在每次迭代過程中以某個小因子降低每個權值,也等效於給誤差函數添加一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。權值衰減懲罰項使得權值收斂到較小的絕對值。 (4)Region 82, Region 94, Region 106表示三個不同尺度(82,94,106)上預測到的不同大小的參數。 82 卷積層為最大的預測尺度, 使用較大的 mask, 但是可以預測出較小的物體; 94 卷積層為中間的預測尺度, 使用中等的 mask; 106卷積層為最小的預測尺度, 使用較小的 mask, 可以預測出較大的物體. @https://blog.csdn.net/xiao_lxl/article/details/85127959 (5)上述列舉中,表示所有訓練圖片中的一個批次(batch) 批次大小的划分根據在cfg/yolov3.cfg中設定的, 批次大小的划分根據我們在 .cfg 文件中設置的subdivisions參數。 在當前使用的 .cfg 文件中 batch = 64 ,subdivision = 8,所以在訓練輸出中,訓練迭代包含了8組(8組Region 82, Region 94, Region 106),每組又包含了8張圖片,跟設定的batch和subdivision的值一致。 注: 也就是說每輪迭代會從所有訓練集里隨機抽取 batch = 64 個樣本參與訓練,所有這些 batch 個樣本又被均分為 subdivision = 8 次送入網絡參與訓練,以減輕內存占用的壓力) (6)觀察某一個尺度上的參數, 下面以第一行 Region 82 分析: 【Region 82 Avg IOU: 0.293486, Class: 0.443128, Obj: 0.680025, No Obj: 0.532993, .5R: 0.142857, .75R: 0.000000, count: 7】 • Region Avg IOU:0.293486: 表示在當前 subdivision 內的圖片的平均 IOU, 代表預測的矩形框和真實目標的交集與並集之比, 這里是 29.36%,由於剛開始訓練,所以此模型的精度遠遠不夠。 • Class: 0.443128: 標注物體分類的正確率, 期望該值趨近於1; • Obj: 0.680025: 越接近 1 越好; • No Obj:0.532993: 期望該值越來越小, 但不為零; • .5R: 0.142857: 以IOU=0.5為閾值時候的recall; recall = 檢出的正樣本/實際的正樣本. 是在 recall/count 中定義的, 是當前模型在所有 subdivision 圖片中檢測出的正樣本與實際的正樣本的比值。全部的正樣本被正確的檢測到應該是1。 • .75R: 0.000000 : 以IOU=0.75為閾值時候的recall; • count: 7: 所有當前 subdivision 圖片(本例中一共 8 張)中包含正樣本的圖片的數量。 在輸出 log 中的其他行中, 可以看到其他subdivision 也有的只含有 6 或 1 個正樣本, 說明在 subdivision 中含有不包含在檢測對象 classes 中的圖片 (7)批輸出【 9798: 0.370096, 0.451929 avg, 0.001000 rate, 3.300000 seconds, 627072 images 】 • 9798: 指示當前訓練的迭代次數 • 0.370096: 是總體的Loss(損失) • 0.451929 avg: 是平均Loss,這個數值應該越低越好,一般來說,一旦這個數值低於0.060730 avg就可以終止訓練了。 • 0.001000 rate: 代表當前的學習率,是在.cfg文件中定義的。 • 3.300000 seconds: 表示當前批次訓練花費的總時間。 • 627072 images: 這一行最后的這個數值是9798*64的大小,表示到目前為止,參與訓練的圖片的總量。 (8)分塊輸出【 Region Avg IOU: 0.326577,Class: 0.742537,Obj: 0.033966,No Obj: 0.000793,Avg Recall: 0.12500,count: 8 】 • Region Avg IOU: 0.326577: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比,這里是32.66%,這個模型需要進一步的訓練。 • Class: 0.742537: 標注物體分類的正確率,期望該值趨近於1。 • Obj: 0.033966: 越接近1越好。 • No Obj: 0.000793: 期望該值越來越小,但不為零。 • Avg Recall: 0.12500: 是在recall/count中定義的,是當前模型在所有subdivision圖片中檢測出的正樣本與實際的正樣本的比值。在本例中,只有八分之一的正樣本被正確的檢測到。(和最開始初定的閾值有關系) • count: 8:count后的值是所有的當前subdivision圖片(本例中一共8張)中包含正樣本的圖片的數量。在輸出log中的其他行中,可以看到其他subdivision也有的只含有6或7個正樣本,說明在subdivision中含有不含檢測對象的圖片。 @https://blog.csdn.net/xiao_lxl/article/details/85127959
******************************************************************************************** ... ... ... Loading weights from ./wp_data/case3-cls84-weights/yolov3_weight.conv.66... seen 64 Done! Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005 If error occurs - run training with flag: -dont_show Resizing 608 x 608 try to allocate additional workspace_size = 215.15 MB CUDA allocate done! Loaded: 0.000069 seconds v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: 0.130423, GIOU: 0.130423), Class: 0.777553, Obj: 0.372095, No Obj: 0.434500, .5R: 0.000000, .75R: 0.000000, count: 1 ... ... v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434966, .5R: -nan, .75R: -nan, count: 0 v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.347062, GIOU: 0.260316), Class: 0.537231, Obj: 0.459746, No Obj: 0.507364, .5R: 0.142857, .75R: 0.000000, count: 14 ... ... v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434781, .5R: -nan, .75R: -nan, count: 0 v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.255715, GIOU: 0.049848), Class: 0.641193, Obj: 0.390348, No Obj: 0.507421, .5R: 0.000000, .75R: 0.000000, count: 7 ... ... v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434521, .5R: -nan, .75R: -nan, count: 0 v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.272013, GIOU: 0.236511), Class: 0.617063, Obj: 0.395308, No Obj: 0.507380, .5R: 0.000000, .75R: 0.000000, count: 4 ... ... v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 82 Avg (IOU: -nan, GIOU: -nan), Class: -nan, Obj: -nan, No Obj: 0.434870, .5R: -nan, .75R: -nan, count: 0 v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 94 Avg (IOU: 0.315608, GIOU: 0.164685), Class: 0.552984, Obj: 0.492209, No Obj: 0.507285, .5R: 0.142857, .75R: 0.000000, count: 14 v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 106 Avg (IOU: 0.249113, GIOU: 0.112020), Class: 0.505489, Obj: 0.479450, No Obj: 0.473681, .5R: 0.028571, .75R: 0.028571, count: 35 ... ... v3 (mse loss, Normalizer: (iou: 0.750000, cls: 1.000000) Region 106 Avg (IOU: 0.243135, GIOU: 0.081533), Class: 0.508788, Obj: 0.439726, No Obj: 0.473779, .5R: 0.076923, .75R: 0.000000, count: 52 1: 1974.407104, 1974.407104 avg loss, 0.000000 rate, 3.823940 seconds, 64 images Loaded: 0.000018 seconds
***說明:v3(mse loss, Normalizer :( iou :0.750000) cls:1.000000)這句話,心里就很忐忑,后來知道了可能是新版本ab優化后的,加了些超參
******************************************************************************************** 參考@https://www.cnblogs.com/hls91/p/10911997.html已實踐了幾次,正確性進一步尚待驗證。簡單說明: (1)如果看到avg loss =nan? 說明訓練錯誤; 某一行的Class=-nan說明目標太大或者太小,某個尺度檢測不到,屬於正常 @https://zhuanlan.zhihu.com/p/25110930 @https://blog.csdn.net/maweifei/article/details/81148414 (2)什么時候應該停止訓練? 當loss不在下降或者下降極慢的情況可以停止訓練,一般loss=0.7左右就可以了 (3)在訓練集上測試正確率很高,在其他測試集上測試效果很差? 說明過擬合了。解決,提前停止訓練,或者增大樣本數量訓練 (4)如何提高目標檢測正確率包括IOU,分類正確率? 設置yolo層 random =1,增加不同的分辨率。或者增大圖片本身分辨率。或者根據你自定義的數據集去重新計算anchor尺寸(darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416 then set the same 9 anchors in each of 3 [yolo]-layers in your cfg-file) (5)如何增加訓練樣本? 樣本特點盡量多樣化,亮度,旋轉,背景,目標位置,尺寸. 添加沒有標注框的圖片和其空的txt文件,作為negative數據 (6)訓練的圖片較小,但是實際檢測圖片大,怎么檢測小目標? 1.使在用416*416訓練完之后,也可以在cfg文件中設置較大的width和height,增加網絡對圖像的分辨率,從而更可能檢測出圖像中的小目標,而不需要重新訓練 2.set `[route] layers = -1, 11` set ` [upsample] stride=4` (7)網絡模型耗費資源多大?(我用過就兩個) [yolov3.cfg] [236MB COCO-91類] [4GB GPU-RAM] [yolov3.cfg] [194MB VOC-20類] [4GB GPU-RAM] [yolov3-tiny.cfg] [34MB COCO-91類] [1GB GPU-RAM] [yolov3-tiny.cfg] [26MB VOC-20類] [1GB GPU-RAM] (8)多GPU怎么訓練? 首先用一個gpu訓練1000次迭代后的網絡,再用多gpu訓練 darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights -gpus 0,1,2,3 (9)有哪些命令行來對神經網絡進行訓練和測試? 1.檢測圖片: build\darknet\x64\darknet.exe detector test data/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25 xxx.jpg 2.檢測視頻:將test 改為 demo ; xxx.jpg 改為xxx.mp4 3.調用網絡攝像頭:將xxx.mp4 改為 http://192.168.0.80:8080/video?dummy=x.mjpg -i 0 4.批量檢測:-dont_show -ext_output < data/train.txt > result.txt 5.手持端網絡攝像頭:下載mjpeg-stream 軟件, xxx.jpg 改為 IP Webcam / Smart WebCam (10)如何評價模型好壞? build\darknet\x64\darknet.exe detector map data\defect.data cfg\yolov3.cfg backup\yolov3.weights 利用上面命令計算各權重文件,選擇具有最高IoU(聯合的交集)和mAP(平均精度)的權重文件 (11)如果測試時出現權重不能識別目標的情況? 很可能是因為yolov3.cfg文件開頭的Traing下面兩行沒有注釋掉,並且把Testing下面兩行去掉注釋就可以正常使用. (12)模型什么時候保存?如何更改? 迭代次數小於1000時,每100次保存一次,大於1000時,沒10000次保存一次。 自己可以根據需求進行更改,然后重新編譯即可[ 先 make clean ,然后再 make]。 代碼位置: examples/detector.c line 138 (13)yolo v3 論文閱讀 優點:速度快,精度提升,小目標檢測有改善; 不足:中大目標有一定程度的削弱,遮擋漏檢,速度稍慢於V2。 參考@https://www.cnblogs.com/hls91/p/10911997.html ,https://blog.csdn.net/lilai619/article/details/7969510