使用darknet训练yoloV3

最近在训练yolo V3;训练过程一波三折,为什么这么说了,使用pytorch训练,速度太慢了,8个小时训练了7个epoch,batchsize我设置的是8,然后图片总数是9万多张,设置了216个epoch。这算下来估计训练结束,需要10天左右吧,这把我自己坑的。

然后周五的时候选择使用darknet进行训练。按照yolov3官网一步步的进行;

训练时遇到的问题也挺多的,总结如下:

1)把训练的时候NAN特别多阿,那把我吓的。出现的问题是这样的:

网站(GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ))(搜索词汇“NAN”)这么说:

Note: If during training you see nan values for avg (loss) field - then 
training goes wrong, but if nan is in some other lines - then training
 goes well.

还有人说(找不到链接原文了),训练到5000步就慢慢变好了。

2)仔细看问题1)中的截图,大家会发现学习率等于0.000000.这又是怎么回事,我的cfg中的学习率设置的是0.001,有图为证:

后来查看资料发现是这个样子的,资料链接(Learning rate is 0 · Issue #701 · pjreddie/darknet · GitHub),原文是这个样子:

It seems related to "burn_in" in cfg file. For example, I set learning_rate to 0.001,
 burn_in to 1000, then learning_rate will increase to 0.001 after 1000 iterations. But
 not sure the exact formula between them.
in src/network.c line 95:
if (batch_num < net->burn_in) return net->learning_rate * pow((float)batch_num / 
net->burn_in, net->power);

so: learning_rate * (iterations/burn_in)^4

net->power is = 4 according to src/parser.c line 686
net->power = option_find_float_quiet(options, "power", 4);

so at iteration 1:
LR = 0.001 * 1/1000^4 = 10^-3 * 10^(-3*4) = 10^-15 so yeah it is written 0.

其他参考(Training rate is 0.000 during training, although 0.001 in the cfg file · Issue #786 · pjreddie/darknet · GitHub):

The issue lies with the burn_in parameter. It basically says "ramp up to learning_rate
 gradually over n iterations". If you remove that parameter, your learning rate will 
start out with the initial value set in the cfg file. A more detailed write up can be 
found here

3)打印输出的各种参数解析,都是些什么意思了:

这个请参考这篇文章:YOLO训练笔记第一篇——YOLOv3训练时打印的日志_Littlelsu的博客-CSDN博客_yolov3 训练日志

现在等待训练结果;

还有一些问题整理(答案来源:GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ))

Note: if error Out of memory occurs then in .cfg-file you should increase 
subdivisions=16, 32 or 64
。。。。
So if classes=1 then should be filters=18. If classes=2 then write filters=21.
。。。

后面在训练过程审查的时候.又发现了一个乌龙的情况,就是别人发给我生成make_train_list.py,生成图片文件列表的过程中,test.txt中的图片名尽然是包含在trainval.txt中的,换言之就是训练的图片和测试的图片是有重叠的,这样会导致我在测试过程中,测试的结果不能很好反映训练模型的拟合性能.我将错误的语句反映在下面:

 with open(prefix_trainval, 'w') as fout_trainval:
        with open(prefix_train, 'w') as fout_train:
            with open(prefix_val, 'w') as fout_val:
        #trainval
                for i in xrange(len(trainval_list[:sep_train])):
                    #格式 文件名 类型 如:  12 -1 (意思是文件名为12 的作为 训练集)
                    fout_trainval.write('%s\n'%( image_list[i]))
                    fout_train.write('%s\n'%( trainval_list[i]))
                    #fout.write('%s\n'%( image_list[i]))
                for i in xrange(len(trainval_list[sep_train:])):
                    #格式 文件名 类型 如:  12 -1 (意思是文件名为12 的作为 训练集)
                    fout_trainval.write('%s\n'%( image_list[i]))
                    fout_val.write('%s\n'%( trainval_list[i]))
                     #fout.write('%s\t \n'%( image_list[i]))
    prefix_test=path_out+'test.txt'

    with open(prefix_test, 'w') as fout_test:    
        #test
            for i in xrange(len(image_list[sep_trainval:])):
                #格式 文件名 类型 如:  12 -1 (意思是文件名为12 的作为 训练集)
                 #fout.write('%s \t %d\n'%( image_list[i], 1))
               fout_test.write('%s\n'%( image_list[i]))

出错的具体是这一句:

            for i in xrange(len(image_list[sep_trainval:])):
                #格式 文件名 类型 如:  12 -1 (意思是文件名为12 的作为 训练集)
                 #fout.write('%s \t %d\n'%( image_list[i], 1))
               fout_test.write('%s\n'%( image_list[i]))

从代码看得出,无论是训练样本还是测试样本都是从原始图片列表中的第一张图片开始读取的.如下修改就可以了:

 for i in xrange(len(image_list[sep_trainval:])):
                #格式 文件名 类型 如:  12 -1 (意思是文件名为12 的作为 训练集)
                 #fout.write('%s \t %d\n'%( image_list[i], 1))
               fout_test.write('%s\n'%( image_list[sep_trainval + i]))

或者将图片全部生成train.txt,然后拷贝一部分到test.txt中;

多gpu训练,命名行类似:./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫与橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值