Day 20 - 重新检视 mAP, F1, IoU, Precision-Recall 精准度

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 就可以看到。

参考资料


<<:  Day5 利用 Vscode 执行 PHP

>>:  DAY5:Kaggle-Data Science London + Scikit-learn(二)

当Expection发生时, 如何显示完整的CallStack和位置 (Traceback应用)

为了在python GUI 程序开发时有更好的开发者体验, 笔者喜欢先收集别人的痛点及各种解决方案,...

DHT22 资料读取与输出

上次测试完DHT22可以使用後,接下来就要将数值输出 利用他们的范例程序可以看到利用#define ...

Day26-JDK可视化监控工具:visualVM(二)

前言 上篇介绍了visualVM的安装,这篇就要来介绍如何使用 范例我们拿Day23-JDK可视化监...

[Day11] 以神经网络进行时间序列预测 — RNN

本篇详细介绍 RNN 并使用它进行时间序列预测 本日大纲 RNN 介绍 激活函数 RNN 的分类 时...

Domain layer implementation

经过这麽多集的 data layer 後,我们来到 domain layer。Domain laye...