Yolo v1使用自己数据集进行分类训练和检测训练的overfitting现象

在题主的上一篇博文里描述了如何使用自己的数据从分类训练开始训练Yolo v1模型:

yolo v1 tensorflow版的分类训练和检测训练

使用的tensorflow版代码:

yolo v1代码 作者为hizhangp

虽然说yolo与Fast-RCNN等以往检测网络相比,能够直接通过CNN输出图像中object的coordinate和class,实现end-to-end的思路。但是在训练过程中,yolo的训练是要分两步进行的,也就是首先要完成分类训练,之后将分类训练好的模型fine-tune用于检测训练。

在yolo的原论文中,是使用ImageNet分类数据集进行分类训练,在训练一个星期后达到 top-5 accuracy 88%的精度。然而如果我们想从yolo论文中描述的使用ImageNet数据集进行分类训练,则会出现数据集过大训练时间过长的问题。因此,在题主的上一篇博文中就使用了自己的数据集,总共1200张,包含的类别为之后检测训练中的20类物体。实际的实验过程证明这是可行的,最终的loss曲线的下降也和使用ImageNet的下降曲线类似。但在训练完成后使用验证集验证的时候,发现训练的模型有非常强的overfitting现象。

首先想到的解决办法是增强分类训练时使用的数据集,因为1200张图片平均到每一类物体的图片也就只有60张左右,此外还要分出10%的图片用于做验证集。所以最终的能够用于训练的每一类图片也就只有50张。对于每一类物体来说,分类训练的训练集太小了,因此对分类数据集做了简单的翻转增强处理,图片数据集达到2400张。

之后用这2400张图片进行分类数据集的训练,在训练50k步后,在验证集上的精度达到78%。说明在此分类训练过程中并没有产生很严重的overfitting的现象。

完成分类训练后,在把使用训练好的模型fine-tune用于检测训练中,在yolo原论文里,也有对降低overfitting现象的处理,包括像droupout,L2正则化等等处理。其中的droupout参数为0.5,L2正则化的decay值为0.0005。在voc2007训练数据集上训练了135个epoch。代码中和论文的描述有两点不同:

1.论文中的noobject loss项的权重参数\lambda _{noobj}=0.5,而代码中的设置是1.0,object loss的权重参数\lambda _{obj}=1.0。这里noobject loss的权重和object loss的权重相同,与论文中的使用权重参数减弱noobject loss影响的描述不符。并且class loss的权重参数也由论文描述中的1.0变为2.0,增大了class loss的影响。

2.代码中的learning rate是一个恒定值 0.001,而论文中描述的是learning rate随step变化而变化的:yolo v1学习与理解

首先还是按照代码中的设置进行训练,检测训练的数据集为voc2007,训练的步数为135epoch。训练一天后的结果:

曲线的class_loss和coord_loss_1下降效果依旧和使用提供的ImageNet分类训练参数相似,但使用voc2007验证集进行验证时发现效果不是很好,经常出现误检测或者漏检的情况。验证集中其中一张图片测试结果:

用训练集中的图片去测试效果和误差曲线体现的一样,经测试,模型在训练集上的表现非常好,其中的一张测试图片:

因此推断,模型有很强的overfitting的现象。

为了解决overfitting这个问题,首先想到的是增强dropout和L2正则化的影响,这里题主尝试了将dropout的系数降至0.4,0.3。将L2正则化的参数提升至0.0006作为尝试。但结果依旧没有很好的提升,模型依旧在测试数据集上的表现不好。

在之前提到过,代码中与yolo论文中不同的地方在于权重参数和learning rate的不同。所以为了保持与yolo 论文的一致,将代码中的误差权重更改为和yolo论文中一致,同时将learning rate的设置也更改为:第一个epoch从0.001至0.01缓慢上升,前75个epoch以0.01的learning rate速率训练,接着的30个epoch以0.001的速率训练,最后30个epoch以0.0001的速率训练。训练结果:

从曲线下降结果可以看到,使用yolo论文里的配置效果确实要好很多,无论是曲线下降速度还是最终的收敛结果,都有了很大的提升。同样的使用voc2007的验证集进行验证,效果依旧提升不是很明显,其中的一张测试图片:

这张图片的测试结果显示的IOU值和置信度很低,测试集中的其他测试结果表明模型以及会经常出现误检和漏检的情况。

至此,代码与yolo论文中的描述及训练过程已经完全一样,只是分类数据集的使用不同。论文中的分类数据集ImageNet的种类为1000类,而题主使用的分类数据集的类别就是voc2007中的20类,所以在训练出的模型,判断背景的能力上可能要原差于ImageNet训练出的模型,这从训练的误差下降曲线也可以看出。使用ImageNet训练模型得到的Noobject loss最终稳定在0.1左右,而使用题主自己整理的数据集,noobject loss达到0.2。

其次,ImageNet中的图像数据集更大,训练出的模型识别物体的特征更加泛化,题主提供的数据集中平均每一类物体只有60张左右的图像数据,这样的数据集还是太小了。并且图片的size差别也很大,题主提供的数据集中的size都在600-800,然后再经过resize成224*224用于分类训练。

之后,题主用训练好的yolo模型去检测自己数据集中检测数据集的图像,发现并没有很强的overfitting现象,证明确实是再分类训练过程中,网络学习到的特征不够泛化,其中的两张测试图片:

所以总结一下,yolo原论文中通过一个星期再ImageNet上训练分类网络还是有必要的,这样能让网络识别的特征更加泛化,同时分类网络学习的类别是1000类,在之后的检测训练中也能更好的区分背景和object。

但从yolo网络检测题主整理的数据集中的检测数据集效果来看,如果想要将yolo移植到具体应用领域时,检测过程与分类训练时的图片风格的相似,因此效果应该不会出现像在voc2007数据集上的表现那样强的overfitting现象。

猜你喜欢

转载自blog.csdn.net/weixin_40446651/article/details/81508741
今日推荐