目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)

文章目录

  • 赛题背景
  • 指导说明
  • 比赛任务
  • 我的优化思路
    • 数据增广
    • anchor参数设置
  • 冠军的竞赛思路
    • 数据分析和预处理
    • 检测模型
    • 训练技巧
    • 结果分析与模型改进
  • 参考


赶时间请直接跳转到“冠军的竞赛思路”一节。

赛题背景

目标检测是计算机视觉中的一个重要的应用方向,与之相关的应用也越来越多。百度飞桨与北京林业大学合作开发的AI识虫项目,是将AI与农业相结合的典型案例。本次比赛将使用林业病虫数据集,使用目标检测算法对图片中的虫子类别和位置进行预测。

在《零基础实践深度学习课程》中,老师讲介绍如何使用YOLO-V3算法检测虫子,但老师所讲授的内容只包含最基本的功能。学员需要在此基础上对模型参数或者模型结构进行调整,以得到更好的评估结果。主要改进方案参见下面的指导说明。

指导说明

课堂上老师会讲述YOLO-V3模型,教案里面给出的是最基础的模型介绍及实现,在此基础上的主要改进方案有:
1、 使用其它模型如faster rcnn等 (难度系数5)

2、 使用数据增多,可以对原图进行翻转、裁剪等操作 (难度系数3)

3、 修改anchor参数的设置,教案中的anchor参数设置直接使用原作者在coco数据集上的设置,针对此模型是否要调整 (难度系数3)

4、 调整优化器、学习率策略、正则化系数等是否能提升模型精度 (难度系数1)

比赛任务

参赛者需要训练好目标检测模型,并且用训练好的模型在测试数据集上进行预测,每张图片的预测输出结果为图片中包含的虫子的 类别、位置、和置信度得分 。
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第1张图片

请将结果保存为json文件。参赛者需提供飞桨训练好的模型参数,可以在AI Studio Notebook中一键运行的预测代码,还有存放预测结果的json文本文件。

我的优化思路

我主要是针对指导说明中的2、3、4点来进行优化,其中第四点属于是经验玄学调参了,这里不再赘述。

数据增广

这里我采用了基本的数据增广方式,如旋转、裁剪、缩放、填充、亮暗、对比度等,代码可见我另一篇博客(点击此处跳转)。经过这步操作后,mAP得分提高了5个百分点左右。

anchor参数设置

由于练习赛给出的baseline中的anchor参数设置直接使用YOLOv3作者在coco数据集上的设置:YOLOv3在每个区域的中心位置产生3个锚框 (anchor box),在3个层级的特征图上产生锚框的大小分别为P2 [(10×13),(16×30),(33×23)],P1 [(30×61),(62×45),(59× 119)],P0[(116 × 90), (156 × 198), (373 × 326]。越往后的特征图上用到的锚框尺寸也越大,能捕捉到大尺寸目标的信息;越往前的特征图上锚框尺寸越小,能捕捉到小尺寸目标的信息。

anchor实际上是由k-means算法在所用数据集上聚类得到的,所以我考虑计算林业病虫数据集的anchor。参考了这篇博客的代码(点击此处跳转),其中需要设置CLUSTERS参数,它代表你要得到的anchor box个数,比如这里用到了三个层级的特征图,每个特征图对应三个anchor box,所以设置为9。使用得到的新anchor后,mAP得分提高了8个百分点左右。

注意: 由于KMeans算法的结果对于初始点的选取敏感,因而每次运行的结果并不相同。至于 哪个anchor参数好,只有自己去尝试了。

由于水平有限,时间也不够,最后我没有再进行优化。得分也定格在了82.3,附上一张在这个精度下的测试结果图。
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第2张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第3张图片

冠军的竞赛思路

首先上代码,冠军已经将他的代码开源到了GitHub,此大神不是仅仅用了paddle detection上的模型(Paddle GitHub),而时在此基础上做了二次开发,属实牛批。其中也用到了很多技巧,关键是大佬对数据的分析真是让人眼界打开,下面我会详细介绍大佬的思路。

【转自冠军代码分享】

大家好,之前AI识虫的比赛代码我已经推到Github上了,有需要的同学自取哈
https://github.com/LKKlein/AI-Insects-Challenge
另外,我在AIStudio中也同步建立了一个公开的Repo,有兴趣的同学可以看一看
https://aistudio.baidu.com/aistudio/projectdetail/289616
有问题的话大家一起交流交流,我之前试过运行,偶尔会有报错的情况,请大家谅解

数据分析和预处理

首先大佬是对数据集做了一个统计分析,并进行可视化。
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第4张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第5张图片

从表格和图像中可以得到以下几个信息:

  1. 数据量上万,足以支撑深度学习。但是不能满足太复杂、太深的模型,这对后续选择模型有帮助。
  2. 最大的box面积相对于原图也就2%,宽高比例也显示出要检测的物体是微小的,所以在设置anchor时要更多关注中等大小物体和微小物体的尺寸。
  3. 训练集中物体类别数量较为平衡,但是测试集中缺少一类物体,在验证评估时会对精度造成影响,所以后续处理中将测试集的该类别昆虫裁剪出来扩充验证集。

数据预处理部分除了使用基本数据增广,还用到了 MixUp(MixUp介绍点此处),简单来说就是将两个图按一定比例混合在一起,相当于做了视觉干扰,改变了图像本身的分布,增加的新样本。效果图如下:
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第6张图片
后续还有一些基本操作,如:图像归一化,gt_bbox压缩到[0,1],Kmeans聚类得到新anchor,前面已有介绍。

检测模型

目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第7张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第8张图片

训练技巧

目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第9张图片

  1. 使用大型的object365分类模型作为预训练模型,其中有训练得较好的特征提取层。
  2. 从0开始增加学习率,余弦退火使学习率变化更平缓,训练更加稳定。
  3. 首先冻结第一个箭头所指部分,把学习率调的很小训练另外三个箭头所指部分。然后把第二个route冻结,这是为了更多训练对中等物体和小物体的检测,训练的时间也是最长的。最后分别冻结剩下两个route,不断进行优化。
    目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第10张图片

结果分析与模型改进

目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第11张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第12张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第13张图片
将上一步中得到的检测结果采用分类模型进一步预测,提高分类准确率和分类阈值。方法如下图:
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第14张图片
目标检测冠军竞赛指南:以百度飞桨(Paddle)集训营练习赛——AI识虫为例(基于YOLOv3)_第15张图片
最后检测结果mAP评分达到了惊人的满分!

参考

比赛官网. https://aistudio.baidu.com/aistudio/competition/detail/24

基本数据增广. https://blog.csdn.net/m_buddy/article/details/82926024

Paddle Detection. https://github.com/PaddlePaddle/PaddleDetection

MixUp. https://blog.csdn.net/u013841196/article/details/81049968

Zhang, Zhi, et al. “Bag of freebies for training object detection neural networks.” arXiv preprint arXiv:1902.04103 (2019). (冠军的主要思路来于此论文,总结了最新的神经网络训练技巧)

你可能感兴趣的:(目标检测,神经网络,深度学习,计算机视觉,机器学习,paddlepaddle)