iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
AI & Data

觀賞魚辨識的YOLO全餐系列 第 20

Day 20 - 重新檢視 mAP, F1, IoU, Precision-Recall 精準度

  • 分享至 

  • twitterImage
  •  

Day 20 - 重新檢視 mAP, F1, IoU, Precision-Recall 精準度

AlexeyAB/darknet 版本的 YOLO 最被稱羨的就是可以輸出很多研究需要用的評估數據,因為有這些數據才有辦法評量目前的準確度是否足夠使用者滿意,安裝方式可以參照 Day 19 - 安裝 AlexeyAB/darknet ON Amazon Linux 2,下圖是安裝 AlexeyAB/darknet 版本的 YOLO 的檔案結構圖,介紹一下比較重要的檔案或文件夾:

  • build_release: 這是先前用來編譯 AlexeyAB/darknet 原始檔的暫時文件夾,編譯後就可以刪除。
  • cfg:一些常用來評估用的資料集的網路結構設定檔,如 yolov3, yolov4, coco, voc 等。
  • darknet: AlexeyAB/darknet 的主要執行檔。
  • darknet_image.py, darknet.py, darknet_video.py:透過呼叫 libdarknet.so ,可以在 Python 中直接調用 AlexeyAB/darknet 的一些主要功能,如訓練、測試、載入網路結構等。
  • libdarknet.so: AlexeyAB/darknet 使用 c 語言所撰寫的共享函式庫,可供其他程式語言呼叫。
  • predictions.jpg: AlexeyAB/darknet 測試結果,會將便是結果直接畫在圖上,但跟 data 這個文件夾相關連,沒有這個文件夾的話,在 Joseph/darknet 的版本會直接出錯,無法運行;在 AlexeyAB/darknet 的版本方塊框會正確標示出來,只是物件名稱部分會是一堆黑線。
  • yolov4.weights: 這是 yolov4 事先訓驗好的權重模型,需要額外下載

https://ithelp.ithome.com.tw/upload/images/20210920/20129510F5tO7WvdGl.png
圖 1、AlexeyAB/darknet 版本的 YOLO 的檔案結構圖

因為要將先前用 Joseph/darknet 訓練好的權重模型直接拿用套用,因為我們只是需要更多驗證或是測試期間的數據,所以就不重新訓練模型。最簡單的方法就是把 AlexeyAB/darknet 的 darknet 這個主程式搬到先前安裝的環境,請參考 Day 14 - 安裝與執行 YOLO 以及 Day 15 - 說明 YOLO 相關設定,下圖為使用自己圖片來訓練的的檔案結構圖,說明一下相關文件:

  • cfg: 用來存放自定義網路結構組態檔 yolov3.cfg,以及一些圖片配置檔。
  • data: 這是為了測試畫圖用,是直接使用 Joseph/darknet 的內容。
  • labels: 自己的圖片訓練集,包含圖片檔和標籤檔。
  • utils: 自己撰寫的一些工具程式,如切分訓練集與測試集。
  • weights:訓練後的權重模型檔。

https://ithelp.ithome.com.tw/upload/images/20210920/20129510tQagAO4S6B.png
圖 2、使用自己圖片來訓練的的檔案結構圖

首先檢查 darknet 的執行是否包含一些共享函式庫,使用以下指令檢查,下圖中顯示出來的結果為雖然會用到很多共享函式庫,但都不在 AlexeyAB 這個文件夾內,所以直接複製過去就可以使用了。

ldd darknet
cd ~/fishRecognition/fishsite/FishRecognition/
cp ~/AlexeyAB/darknet .

https://ithelp.ithome.com.tw/upload/images/20210920/20129510UWdo7kcYIb.png
圖 3、AlexeyAB/darknet的共享函式庫

運行先前的測試指令,可以發現跟先前的 Joseph/darknet 相比,輸出結果是一樣的,只是內容多了一點,而且看以下的訊息,似乎會自動彈出 OpenCV 的圖型畫面,來顯示結果,但因為是在遠端 EC2 的文件介面的 Amazon Linux 上運行,所以會出現 OpenCV exception 的錯誤訊息。

./darknet detector test cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup ./labels/00-frame-608x608-0030.jpg

https://ithelp.ithome.com.tw/upload/images/20210920/20129510gqy4skrWzP.png
圖 4、AlexeyAB/darknet 使用 yolov3 的測試結果

以下是嘗試沒有 data 這個文件夾的測試結果,如下圖所示,左邊是有 data 這個目錄的,右邊是把 data 改成 data~ 後的結果。

mv data data~
./darknet detector test cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup ./labels/00-frame-608x608-0030.jpg

https://ithelp.ithome.com.tw/upload/images/20210920/20129510J0mixCOhdZ.png
圖 5、比較使用 data 與沒有的測試圖片

以下是 AlexeyAB/darknet 才可使用的語法,分別是顯示測試資料的 mAP, recall,結果分別如下圖分別顯示測試圖片針對個類別的 ap ,以及所有類別的 mAP, precision, recall, F1-score:還有個別圖片的 recall 值。

./darknet detector map cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup -iou_thresh 0.75 
./darknet detector recall cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup 

https://ithelp.ithome.com.tw/upload/images/20210920/20129510TIQOt6YG9F.png
圖 6、測試圖片的 mAP, precision, recall, F1-score

https://ithelp.ithome.com.tw/upload/images/20210920/20129510zzDsbBpurA.png
圖 7、測試圖片中個別圖片的 recall 值

新增新的測試集 cfg/new-test.txt 來進行驗證。

cfg/new-test.txt
./labels/00-frame-608x608-0004-1.jpg
./labels/02-frame-608x608-0091-1.jpg

將所有的圖片改個名字,進行新的測試集的測試,並要求顯示出物件方塊框的所在座標。

cd labels
cp 00-frame-608x608-0004.jpg 00-frame-608x608-0004-1.jpg
cp 00-frame-608x608-0004.txt 00-frame-608x608-0004-1.txt
cp 02-frame-608x608-0091.jpg 02-frame-608x608-0091-1.jpg
cp 02-frame-608x608-0091.txt 02-frame-608x608-0091-1.txt
cd ..
./darknet detector map cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup  -dont_show -save_labels -ext_output < cfg/new-test.txt > result_newtest.txt

https://ithelp.ithome.com.tw/upload/images/20210920/20129510gvN4w1VR3a.png
圖 8、新增測試圖片

在下圖可以看出,除了顯示辨識的判斷機率外,還會顯示物體的方塊框座標。

https://ithelp.ithome.com.tw/upload/images/20210920/201295104BvwHdGU1R.png
圖 9、測試結果

此外,AlexeyAB/darknet 可以在驗證時對每一個類別產生一份驗證報告,要先新增一個 results 目錄,接著執行以下語法,便會在 results 目錄中生成三份驗證報告,因為這個練習只有三種辨識類別。

./darknet detector valid cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup

./results/comp4_det_test_Altolamprologuscompressiceps.txt

00-frame-608x608-0004 0.695091 148.112183 405.041626 393.484497 485.914856
00-frame-608x608-0004 0.985318 44.345947 214.757629 326.162659 374.902832
00-frame-608x608-0004 0.045742 1.000000 216.310822 534.158752 384.061310
00-frame-608x608-0004 0.999615 38.003654 385.539154 208.513092 464.205353
00-frame-608x608-0004 0.990907 319.298859 388.642517 373.815460 433.122864
00-frame-608x608-0004 0.005802 137.095795 373.144440 366.280151 515.184265
00-frame-608x608-0004 0.003790 106.269424 242.552902 285.968262 334.292328
00-frame-608x608-0004 0.001615 73.208344 205.587555 247.985931 384.088348
00-frame-608x608-0004 0.001459 212.050888 374.788483 288.383789 412.966339
02-frame-608x608-0091 0.007312 105.508369 321.543884 170.846069 405.676208
02-frame-608x608-0091 0.001923 311.552612 233.153625 423.720398 279.820404
02-frame-608x608-0091 0.008265 135.432083 243.298737 185.704086 311.564911
02-frame-608x608-0091 0.003497 368.839294 292.943481 416.401672 344.871155
02-frame-608x608-0091 0.001466 184.931564 264.106323 231.303848 323.692810
02-frame-608x608-0091 0.001011 117.095284 334.017792 162.991821 392.841461
...部分內容

最後再介紹一個語法,據說是針對 AWS EC2 的專屬語法,可以在訓練期間就可以看到 mAP 以及 損失 Loss 圖型

./darknet detector train cfg/coco.data yolov4.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map

然後打開瀏覽器,輸入網址 http://[EC2_PUBLIC_IP]:8090 就可以看到。

參考資料


上一篇
Day 19 - 安裝 AlexeyAB/darknet ON Amazon Linux 2
下一篇
Day 21 - 嵌入 AlexeyAB/darknet 的 Python
系列文
觀賞魚辨識的YOLO全餐38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言