我想训练YOLOv3来检测空中照片中的人类。 我在使用VisDrone图像对象检测数据集:github.com/VisDrone/VisDrone-Dataset
我编写了一个脚本,将标签转换为darknet格式,以便按照pjreddie的“在COCO上训练YOLO”说明进行训练。我仔细检查了转换后的标签是否与对象正确匹配,结果是匹配的。我还根据VisDrone2018-DET-toolkit在github上的标签描述,创建了一个正确的coco.names文件。我通过运行以下命令创建了trainvalno5k.txt文件:
python 5kGenerator.py > trainvalno5k.txt
5kGenerator.py的代码如下:
import osfor filename in os.listdir('images'): print( os.path.abspath( os.path.join( 'images', filename )))
我修改了coco.data文件,修改后的内容如下:
classes= 12train = /mnt/d/Olaf/Documents/Python/VisDrone2019-DET-train/trainvalno5k.txt#valid = /mnt/d/Olaf/Documents/Python/VisDrone2019-DET-train/5k.txt#valid = data/coco_val_5k.listnames = /mnt/d/Olaf/Documents/Python/VisDrone2019-DET-train/coco.namesbackup = backup#eval=coco
我注释掉了valid部分,因为据我所知,这是用于检查结果的,验证数据集对于训练来说是无关紧要的(我没有费心去创建它)。
当我运行./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74时,东西加载正确,训练开始了,但每隔几行我就会看到-nan消息,我不知道为什么,也不知道这是否会影响最终结果,示例:
Loading weights from darknet53.conv.74...Done!Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005Resizing416Loaded: 1.122782 secondsRegion 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.428162, .5R: -nan, .75R: -nan, count: 0Region 94 Avg IOU: 0.409795, Class: 0.690346, Obj: 0.091164, No Obj: 0.519810, .5R: 0.000000, .75R: 0.000000, count: 1Region 106 Avg IOU: 0.157575, Class: 0.532119, Obj: 0.333807, No Obj: 0.417611, .5R: 0.045685, .75R: 0.000000, count: 197Region 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.427261, .5R: -nan, .75R: -nan, count: 0
因为我在CPU上测试,所以速度相当慢,正式的训练将在Nvidia Quadro上进行。
您能解释一下这种行为吗?以及我该怎么做才能解决-nan问题?
附注:我在Windows 10上使用Ubuntu终端,不知道这是否重要。
回答:
-
最好使用AlexeyAB的存储库进行训练。
-
您应该使用验证集或测试集来评估您的数据上训练的网络。
-
我已经训练了一个包含26个类别的数据集,我忽略了5k类别,而您有12个类别。
-
对于
Nan
值,最好在训练开始时降低学习率,然后再增加它。 -
您可以在Windows和Linux上训练网络,这没有关系。