疫情下的炼丹笔记(yolov3计算map)🎈

本文最后更新于:2022年3月3日 下午

前言

好久没写,最近发生的事情太多了,简要汇总下吧。12月22日,西安要封城的消息传遍了VX群,随即收拾资料准备居家办公做好持久战的准备。短短一周防疫政策的不断变化让很多物资储备不足的小伙伴慌了起来,当时去屯物资的时候还在疑惑,怎么大爷大妈扛着整袋面粉,盐也要买好几袋。“ 菜量充足,不必哄抢。一键下单,送到你家。” 这有问题吗?没有啊!有问题的是老实人你。。 只能说大爷大妈的预判YYDS。

Screenshot_2022-01-10-17-35-23-434_高德地图

后来嘛,就是居家封闭,定期核酸检测。醒来第一件事就是查看核酸检测结果,看着每天新增的病例数,每个人都期盼着拐点的出现。ww没想到去年屯的五谷派上了用场,还好在家学会了几道菜,这三板斧解决吃饭难题。因为这波疫情,整天被圈在个水泥盒子里的人也被联系了起来。夜深人静,群里谈及梦想,都挺不容易。“都睡了几天了 该有不该有的梦里都有了 就是没能走出这个房子”,焯!彩票梦,老板梦的气泡一个个的被扎破。生活嘛,总是让一批又一批不知死活的小b崽子在不知不觉中成长,耳机里又响起 “想学功夫 修炼仙术 先征服这条山路 我在三清观里录歌 旋律和韵脚兼顾” 《崂山道士》—Masiwei。

IMG_20211230_164936R

新年了,新年了。被关在这里,只能用一场酩酊大醉送走2021,从炸金花玩到摇骰子,到最后的真心话大冒险。新的一年,只希望自己平安喜乐,一切都尽快的回归正轨。一周多了,睡也睡够了玩也玩够了,是时候充实自己了。古有“天大寒,砚冰坚,手指不可屈伸,弗之怠”,每想到这句诗就找不到不学习的理由。

接着之前的工作,初识YOLO算法后对采集的数据进行处理。这段时间的规划是:制作数据集、训练模型、模型优化。这次的数据训练是在Windows下采用YOLOV3训练自己的数据,达到对目标的较高可靠度的准确识别。

制作数据集

使用labelimg标注工具,对图片中感兴趣的目标进行标注,为后续的训练提供目标信息在图片中的信息,其中主要包括类别信息以及位置信息:两个点坐标(xmin,ymin)(xmax,ymax)

image-20220108170848801

低对比度小目标识别检测:上图目标像素大小大概为371 X 240 ,原图片像素为2000w像素:5472 X 3648)

①labelimg标注后生成对应的xml文件

②使用python脚本将位置信息转换为YOLO训练所需要的数据格式,生成对应的txt文件。最后将图片与txt文件都放输入data\obj目录下,方便后续使用。

③新建一个类别文件obj.names (内容只需要填写自己的类别名称,中文名称需要做数据集是中文标签,且在源代码中修改相关文件并重新编译), 新建一个图片目录文件train.txt, 都放到data/目录下

总的来说,训练的时候会用到obj.data文件。而obj.data写入了train.txt以及obj.names,train.txt又写入了标注好的图片路径,从而达到一连串的调用。

image-20220110190523584

训练模型

准备工作:

①在修改训练轮次 max_batches = 8000,按照以往经验200张左右的图片,训练8000轮就够了

②Windows版的darknet-YOLOV3提供了map命令,可以一边训练数据集一边计算训练集的map以寻找最优模型。

命令如下:

1
darknet.exe detector train data\obj.data yolo-obj.cfg darknet53.conv.74 -map

报错记录:错误信息说的是obj.data里的test.txt没有对应的测试数据

image-20220108174536234

valid = data/test.txt 改为 valid = data/train.txt

image-20220109001832409

开始训练:

这次使用map命令边训练边计算 average perscion,如红线所示,极其不稳定。

image-20220108223530753

群里问了下出现这种情况有两种可能:训练的数据太少了(确实少),batchsize设置的较小(有待研究)

chart_yolo-obj

这个时候停止训练,计算一下测试集的mAP。

测试集的mAP计算

①标注测试集对应的目标信息,和训练集一样用labelimg生成xml文件,转换为txt文件。

②新建test.txt,和train.txt一样写入待测试图片的路径,通过调用obj.data里的valid = data/test.txt实现对测试图片的调用。

③测试命令如下:

image-20220109060257840

1
darknet.exe detector map data\obj.data yolo-obj.cfg .\backup\yolo-obj_last.weights -thresh 0.25 -iou_thresh 0.45

测试结果表明:mAP(只有一个类别所以平均准确率AP = mAP) 达到惊人的91.07%

其中,测试结果参数解析:

1
2
3
4
5
6
7
8
9
10
11
12
			TP:正样本预测为正样本
FP:负样本预测为正样本
​ TN:负样本预测为负样本
FN: 正样本预测为负样本

​ 精确率 = 94%(precision),即用训练好的模型去预测测试集,预测结果与实际相比有对有错,精确率就是实际正确预测占模型认为正确预测的比例。
计算公式:precision = TP/(TP+FP)

​ 召回率 = 92% (recall),即用训练好的模型预测测试集,这个模型会有四类预测结果,召回率就是实际正确预测占应该被预测出来的比例。
计算公式:recall = TP/(TP+FN)

​ 交并比 = 69.74%(IoU),即预测边框与实际边框的交集与并集的比例。

image-20220109055847116

测试效果

图片检测:

测试集里随便拉一张图片,执行如下命令,看下效果。

1
darknet.exe detector test data\obj.data yolo-obj.cfg .\backup\yolo-obj_last.weights .\data\Test\121.jpg 

image-20220109061727288

视频检测:

错误记录:video stream stopped ,大部分是缺少openCV相关文件。复制·openCV安装目录下的opencv_ffmpeg340_64.dll文件到darknet\x64目录下,问题解决。

执行如下命令:

1
2
3
4
5
darknet.exe detector demo data\obj.data yolo-obj.cfg .\weights\yolo-obj_last.weights .\data\Test\mp4\test2.avi 

保存检测视频加上下面这一句

-thresh 0.25 -out_filename .\data\Test\mp4\test2_result.avi

视频检测效果

总结

​ 深度学习,道阻且长。革命尚未成功,同志仍需努力!