刚接触darknet,由于不熟悉和不够仔细所以遇到了很多问题。这里记录一下【文档将持续更新】,方便日后回顾!
该代码的wiki页面:https://github.com/AlexeyAB/darknet/wiki
- Can’t Train with Multiple GPUs (Invalid Device Ordinal)
YOLOv4支持多GPU训练,具体操作是在训练命令之后加上
-gpus xx1,xx2
参数.如./darknet.exe detector train cfg/coco.data cfg/yolov4.cfg /backup/yolov4_1000.weights -gpus 0,1,2,3
.结果我在利用gpus参数指定GPU的时候报错;不仅多GPU报错,指定一个GPU的时候也报错。后来查到上面那个issue后才清楚,我在训练模型之前用命令
export CUDA_VISIBLE_DEVICES = “xx”
指定了当前窗口能用的GPU,因此代码在调用其他GPU的时候就会报错。 上述问题可以通过unset CUDA_VISIBLE_DEVICES
解决。
- OSError: ./libdarknet.so
在使用YOLO as DLL and SO libraries时遇到了上述问题,作者给出的回答是:①下载最新代码;②在
Makefile
文件中令LIBSO=1
;③重新编译代码
Low Recall/mAP or high loss问题
3.1 遇到该问题时,最先需要核验的是自己的数据。相关问题链接有:https://github.com/AlexeyAB/darknet/issues/1919 ① 确保在obj.data和obj.names文件中正确指出了训练数据和验证数据路径; ② 核验标注是否正确,这里有两个进行验证可选项: a. 在训练的时候加上参数
-show_imgs
,此时训练数据会以窗口的方式进行弹出,或将训练数据保存在 当前 路径下; b. 安装YOLO_mark代码,并进行标注数据的准确性验证。 这里的第一种方法有一个小问题:就是当labels文件夹下的txt标注文件中Bbox未进行正确换行时,用该命令显示的标注也是正确的。因此最好还是建议尝试后一种方法。正确的数据格式见: 《Darknet-YOLOv4实践:数据格式问题》③ 是否对训练数据中出现的所有希望检测到的目标物体进行了标注,否则模型会将其视为背景数据; ④ 训练数据和测试数据是否同分布;当训练时map很高,但是测试的map较低时需要考虑你的训练数据是否具有代表性。your training set is not representative - there are very few objects in it that you want to detect。 ⑤ 其他可以尝试的玄学:在
cfg
文件中修改图像输入大小,并修改subdivision
参数 ⑥ 效果不好的图像数据可以在bad.list和bad_labels.list文件中查看。 ⑦ 终极大法:重新下载代码,修改对应参数后重新编译。
其他启发性建议:由于> > Damage is not a well defined object by clear features like cars, animals and others。因此针对> 缺陷检测这类问题(非object而是stuff),用语义分割可能会比目标检测效果更好。关于Low Recall/mAP or high loss问题之 cfg文件设置
在查询Low Recall相关内容时,看到了数据正确但是精度不够高(在及格线附件徘徊)的情况。作者在这个问题里详细说明了一些参数的设置细节,不过不是针对v4模型的,年代有些久远但也有一定借鉴意义。链接:https://github.com/AlexeyAB/darknet/issues/808 ① 如果图像的宽高比非常不同,那么可以尝试用原图的宽高比作为网络的输入 ② anchor 的计算也可以基于原图大小进行,完成这两点之后原帖模型的 map从0.6上升至0.8 ③ random=1 ④ 利用
-show
计算8个 或10个anchor,如果得到的值不相同,那么设置不同数量的anchor获取对你的训练有帮助。否则,则无帮助。 ⑤ 希望检测密集小物体,那么可以考虑增加网络输入的图像宽高。作者还介绍了:
- iou_thresh参数用于修改iou阈值,因此会影响mAP and AP are for 11 points ,用11点法计算的mAP和AP
- thresh参数用于修改置信度阈值,it is only for IoU, F1, TP/FP/FN。修改了置信度阈值之后会影响模型的IoU, F1, TP/FP/FN结果
- avg loss is -nan的解决方法
①首先可以将cfg文件中的参数burn_in= or learninig_rate=恢复默认 ②在cfg文件中的##########################行前加上
stopbackward=2000
train_only_bn=1
③ 尝试一下 partial 命令,该命令行不要加上数据地址参数:obj.data ④ 该问题意味着梯度爆炸,要解决该问题或许可以尝试以下几点:
- reduce learning_rate= # lower learning_rate= - the more stable training - but training is slower
- reduce batch=
- increase burn_in=
- increase decay=
- use
max_delta=3
in[yolo]
layers - use
stopbackward=2000
andtrain_only_bn=1
at the last backbone layer - use less layers
- fix your dataset
- use another model
- use gradinent clipping
- How can we caculate recall when we get the MAP?
关于模型的输出有几个大家都很关心的问题 ① PR曲线。在darknet/src/detector.c中取消注释即可构建PR曲线,。将其注释掉的原因是当类别较多时该曲线的输出数量将呈线性增加 ② mAP@IoU的计算。
./darknet detector map ... -iou_thresh 0.75
能够给出不同阈值下的mAP值。 若希望得到某个区间的 map值,则需要分别运行不同阈值的map计算代码之后,手动计算整个区间的值。 ③ -thresh和-iou_thresh,前者是Bbox的置信度阈值,后者是nms的过滤阈值。 ④ 如何选取合适的conf_thresh阈值。针对x的每个值(从0.1到0.9)多次运行“darknet detector map -thresh 0.x”命令并绘制图像
video-stream stopped
视频文件损坏或者不存在时会报这个错,找不到网络摄像头好像也会报这个错误。
- 略
- 略