自学yolo入门到进阶

本文详细介绍了在训练YOLOv3模型时遇到的常见问题,包括训练不停止、检测无框、输出log分析、训练过程中的知识点总结以及训练深度学习网络时出现nan的原因。通过实例分析,给出了问题的解决方案,如调整cfg文件参数、检查数据集、优化学习率等,并探讨了训练策略和评估指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

  1. 参考1
  2. 参考2
  3. 参考3
  4. YOLOv3之loss和iou可视化(横坐标和纵坐标与迭代次数完美对齐)
  5. darknet-YOLOv3 cfg参数定义
  6. 理解 YOLOv3 的训练输出日志信息
  7. 训练自己的数据集
  8. 实战

yolov3训练自定义数据集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在终端命令测试时遇到的错误与问题汇总:
./darknet detector train cfg/cup-obj.data cfg/cup-yolov3.cfg darknet53.conv.74
错误一
error: Assertion `0' failed.

办法:将.cfg文件中的batch值设置得更小一点

错误二
./src/parser.c:360: parse_region: Assertion `l.outputs == params.inputs' failed. 

办法:是由于粗心将.cfg文件中的与[yolo]层对应的classes值相对应的按照公式计算出来的filters=(classes+1)*3得到的某些[convolutional]层中的filters值输错了。

错误三

要把.txt标记文件与图片数据集放在同一个文件夹里,否则训练指令无法执行。

问题一:为什么数据集是很小的,数量有限,但是用模型训练的时候可以一直往下训练,不会自动停止。
答:至于说到训练过程不会自动停止,是因为在.cfg文件中有设置:max_batches = 500200,所以要达到训练迭代到第500200个batch时才会训练自动结束。
  1. 机器学习的目的在于更新参数,优化目标函数,SGD和Adam是两种常见的优化器,SGD根据每个batch的数据计算一次局部的估计,最小化代价函数,学习速率决定了每次步进的大小,因此需要选择合适的学习速率进行调优,学习速率太大会导致不收敛,速率太小又收敛速度慢。Adam优化器结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点,能自动调整学习速率,则表现更优。
  2. 学习速率:学习速率第一次可以设置一个大一点的学习速率加快收敛,也可以采用动态变化学习速率的方法,比如每一轮都乘上一个衰减系数或者是根据损失的变化动态调整速率值。
  3. dropout:数据第一次跑模型的时候可以不加dropout,后期调优时加上dropout用于防止过拟合。特别是数据量相对较小的时候。
  4. 训练轮数:模型收敛即可停止迭代,一般可以采用验证集作为停止迭代的条件。
  5. 正则化:加入l1和l2正则化来防止过拟合,加入l1正则化的目的是为了加强权值的稀疏性,让更多值接近0,l2正则化是为了减小每次权重的调整幅度,避免模型训练过程中出现较大抖动。
  6. 激活函数:常用的有:sigmoid和tanh和relu和leaky relu和elu。采用sigmoid激活函数的计算量大,而且sigmoid饱和区变化缓慢,求导趋近于0,梯度消失,sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。tanh解决了zero-centered的输出问题,但是gradient vanishing和幂运算的问题仍然存在。relu从公式上可以看出,解决了gradient vanishing并且计算简单,但是某些神经元永远不会被激活,导致相应的参数永远不能被更新,即dead relu problem。lwaky relu有relu的所有优点,而且不会有dead relu problem。
  7. 特征学习函数:有CNN RNN LSTM等。CNN注重词位置上的特征,而具有时序关系的词采用其他特征学习函数更好。
  8. 特征抽取:max-pooling和avg-poiling是深度学习中最常用的两种特征提取方法。max-pooling是抽取最大的信息向量,但是当存在多个有用的信息向量时,这种方法会丢失大量有用的信息。avg-pooling是对所有信息向量求平均,当仅仅部分信息向量相关,而大部分向量无关时,会导致有用信息向量被大量噪声淹没。所以,在有多个有用向量的前提下尽量在最终的代表向量中保留这些有用向量,又想在只有一个显著相关向量的条件下直接提取该向量作为代表向量,解决办法是加权平均,即attention。
  9. 每轮训练数据乱序:每轮数据迭代保持不同的顺序,避免模型每轮都对相同的数据进行计算。
    10.batch_size选择:对于小数据量,可以全量训练,这样能更准确地朝着极值的方向更新,对于大数据,需要选择一个较小的batch_size,若此时batch_size=1,则为在线学习,每次修正方向为各自样本的梯度方向修正,难以达到收敛,batch_size增大,处理相同数据量的时间减少,但是达到相同精度的轮数增多,实际中可以逐步增大batch_size。
问题二:为什么执行检测指令之后,只会打开那张检测的图片,却并没有框出图片中的水杯。

检测指令:经验:测试时最好使用detect指令而不是与它一样作用的detector test指令

./darknet detect cfg/cup-yolov3.cfg backup/cup-yolov3_500.weights example1/TestData/少女风水杯_2.jpg

结果如下:
在这里插入图片描述

问题三:

摘抄: 刚train结束后的bug,就是coco数据的background类,yolov3默认是81分类啦,我在刚开始project.names只按照annotations中的class name写了,漏掉了背景类,于是出现了标签错乱的问题,detect的结果都是跟正确的label错1位,于是修改了project.name,把第一行默认为background,做成了81行的class name的签,就能对应上结果了。

输出log分析

输入终端测试命令后,在终端上显示出这样的输出内容:

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 conv     64  3 x 3 / 2   608 x 608 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    2 conv     32  1 x 1 / 1   304 x 304 x  64   ->   304 x 304 x  32  0.379 BFLOPs
……
  104 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
  105 conv     18  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x  18  0.053 BFLOPs
  106 yolo
  
Loading weights from darknet53.conv.74...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005

补充:
注意对比,后来执行权重文件backup/cup-yolov3_200.weights也是输出,如下:
Loading weights from backup/cup-yolov3_200.weights...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
补充完成

Resizing
352

Loaded: 0.000025 seconds
Region 82 Avg IOU: 0.618194, Class: 0.000000, Obj: 0.827718, No Obj: 0.559633, .5R: 0.500000, .75R: 0.500000,  count: 2
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.497142, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.412502, .5R: -nan, .75R: -nan,  count: 0
Region 82 Avg IOU: 0.256536, Class: 0.000000, Obj: 0.750111, No Obj: 0.563169, .5R: 0.000000, .75R: 0.000000,  count: 1
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.498241, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.413971, .5R: -nan, .75R: -nan,  count: 0
Region 82 Avg IOU: 0.173034, Class: 0.000000, Obj: 0.907149, No Obj: 0.558328, .5R: 0.000000, .75R: 0.000000,  count: 1
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.496366, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.415022, .5R: -nan, .75R: -nan,  count: 0
Region 82 Avg IOU: 0.526406, Class: 0.000000, Obj: 0.839134, No Obj: 0.555887, .5R: 1.000000, .75R: 0.000000,  count: 1
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.497250, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.414199, .5R: -nan, .75R: -nan,  count: 0
Region 82 Avg IOU: 0.271038, Class: 0.000000, Obj: 0.435728, No Obj: 0.562631, .5R: 0.000000, .75R: 0.000000,  count: 2
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.496236, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, N
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值