物体检测算法YOLOv3的改进——公开答辩讲稿与答辩记录

写在前面

这就是公开答辩的一个讲稿和答辩记录。

补个结果吧,据说是小组第二能评优……但是今年省里不平优秀毕业论文了……罢了吧。

先发个这个物体检测算法YOLOv3的改进——答辩.pptx(反正没人看)

开头

第一张ppt)各位同学老师大家好,我是来自计算机zy1501班的陈睿,在刘钢老师的指导下,我完成了我的毕业设计,我毕设是题目是物体检测算法YOLOv3的改进(切下一张ppt)。

目录

目录)我的答辩将从绪论、YOLOv3的分析与实现、算法改进思路的分析以及改进算法的实现与效果这四个部分展开。其中重点会在算法的分析与实现以及改进的实现与效果这两方面有所突出,在ppt部分结束后,会播放检测结果对比视频以及演示录屏以呈现一个更为直观的展示效果。以上是我答辩的整体结构。(切下一张ppt)指导老师嫌太长了,直接不要了。

绪论

物体检测算法

目前,物体检测算法可大致分为以上三类(指ppt)。

传统物体检测算法使用人工设计特征以及机器学习的分类方式,特征提取的局限性较大且学习速度有限;像faster-rcnn这样的候选框+深度学习分类法这类Two-Stage方法解决了前者的问题,在精度上有很大突破,但分部计算的方式在速度上很难达到实时检测的效果;而yolo这种基于深度学习的回归方法仅One-Stage,在速度上达到了实时级别的突破,但在准确率上却有所欠缺。(ppt翻页)

研究意义

本文针对物体检测算法中的问题,提出一种针对 YOLOv3 算法的改进方案。在通过本研究有针对性的改进后,YOLOv3能够实现对于复杂环境下不同物体的实时检测。同时物体检测本身也是如步态识别、实例分割等任务的重要基础,本研究的改进也可能对这些任务有着一定的影响。(ppt翻页)删除理由同上。

研究内容

本研究从 YOLOv3 的核心算法出发,首先使用 Python 基于 PyTorch 框架实现了 YOLOv3 算法。随后分析了YOLOv3的网络结构以及数据集的数据特征,从YOLOv3模型数据集特征两个方面提出各类改进的思路,最终对于所有改进思路进行实现,总结出有效的改进方案并评价了改进效果。(ppt翻页)

YOLOv3分析与实现

YOLOv3分析

YOLOv3网络由两部分构成,特征提取主干网Darknet-53与特征交互网络YOLO层。(翻页)

Darknet-53是一个全卷积的结构,可以看到这边共有5个步长为2的卷积层,Darknet一共进行了5次下采样,每一次下采样都能提取到更高维度的特征。而残差层在每两个卷积层之后,目的是为了加深网络,同时保证一段网络只学习loss函数的一小部分,控制了梯度爆炸与梯度消失问题。(翻页)

再来看看YOLO层,它之所以被称为特征交互,实际上是因为YOLO层取前面5次下采样的后三次,将高阶的特征通过上采样的方式叠加在较低阶的特征上。这样的结构非常类似FPN网络,让低阶特征获得其高阶特征的信息,从而更容易在上面检测微小物体。YOLO层中每一层都有三个先验框,用来检测图中存在的物体;先验框可以认为是每个检测器初始的位置,如图(指ppt)是yolov3本身给定的先验框。最高阶特征图对应的yolo层(也就是最下面这一层)使用最大的三个先验框,主要负责检验大物体,因为他们代表了更高维度的特征;而其余的yolo层由于分别叠加了来自高阶特征的信息,被用于检测更小尺寸的物体。

YOLOv3实现

在本研究中,为了更好地理解YOLOv3算法,我参考原作者的构思,基于PyTorch从4个模块实现了YOLOv3,分别是模型模块、训练模块、预测模块和检测模块。具体每个模块的流程图在论文上附图了,在这里主要讲讲整体的架构。

模型模块通过从模型的文本文件中读取网络中的结构来搭建网络,可以通过修改文本文件很便捷的调整网络结构。

训练模块的输入是带有标签的图片,LOSS函数是物体类别loss、物体置信度loss与预测框loss三者的加权平均,训练模型使用Adam优化器训练。通过使用模型的网络结构,输入训练数据对模型进行训练,训练后将网络的权重保存起来,便于预测与再次训练使用。

预测模块通过读取模型网络结构以及模型的网络权重,对于输入的图片或视频进行预测,预测包括两部分,首先通过预测框的置信区间筛除掉一部分候选框,然后针对类别使用nms算法,保留同一物体上多个框中最接近真实框的预测框。预测模块还实现了评估mAP的功能。

检测模块则是在预测的基础上对预测结果在原图(源视频)上进行绘制。

几个模块的效果如图所示(切ppt)

这几个模块的演示将会在答辩的最后给出。

算法改进思路的分析

对YOLOv3模型的分析

在刚刚对YOLOv3的分析中我们不难发现,YOLOv3的先验框是固定下来的。但如果能在YOLOv3的网络结构中,对先验框的数量或者尺寸做出有针对性的调整,检测器就可以更快的检测到物体,从而使损失函数以相对较快的速度收敛。

同时针对刚刚特征融合的部分,作者的思路相对简洁,但对于最高阶特征图而言,它并没有获得来自后一层的叠加,这样会降低对于大尺寸物体的精度。所以如果能对特征金字塔的网络结构作出调整,使模型在大尺寸物体精度上获得提升,整体的检测精度就会获得提升。

对于BDD100K数据集的分析

对数据集的各项数据进行分析后,不难发现,数据集中的物体在大小分布上是有比例的,比如红绿灯往往是长方形,比较窄的结构,车辆则是横着,长大于宽的。我们可以考虑使用聚类算法,对于数据集的物体大小分布来重新确定先验框的尺寸。

对于物体类别而言,统计发现BDD100K的数据存在不平衡的问题(切ppt,看图),火车这一类别出现在图片中的比例要远小于车这一类别。针对这个问题,可以对于存在如“火车”、“巴士”、“卡车”等物体的图片做数据集层面的“上采样”处理,让模型对于这类物体多进行若干次训练。

对于图片分辨率,BDD100K采用的是1280×720的图片输入,远大于YOLOv3输入层的416×416,基于此去调整YOLO的网络结构,让它接受相对更高分辨率的输入,以获得图片上更多的细节。

对于图片参数,我们知道数据集都是拍摄的结果,不同设备、环境下拍摄的效果往往不同,我们可以调整部分图片的曝光度、饱和度以及色温来变向扩充数据集,已获得模型更强的泛化能力。

改进算法的实现与效果

针对YOLOv3模型的改进实现

针对先验框与物体大小特征的改进实现,这里我使用了K-means++聚类算法来处理数据集,获得了如图所示的散点图,以此确定了9个质心,9个质心的坐标如图所示(切ppt),据此画出先验框的大小并对比原生YOLOv3的先验框结果如图所示。 我们可以看到我们的先验框中包括许多较窄的长方形,这类物体主要应该是行人与红绿灯。同时我们对照着YOLOv3自带的先验框结构,会发现我们的明显小一圈。这是由于我们的训练集拍摄自车内,照片中本身存在车窗一圈周围的结构,而这一部分并不存在物体,所以整体会比YOLOv3的先验框偏小。

针对特征融合的改进实现。由于分析到最高阶层特征图没有来自其更高阶特征的叠加,相对而言大尺寸的物体会相对不宜被检测到。所以我在Darknet-53的底部又做了一次下采样,并将这次下采样的结构上采样并叠加到第三层YOLO层中,这样高阶的特征信息就会变多,相对来说更有可能检测到更多的大尺寸物体。

针对数据集的改进实现

首先针对物体类别特征的改进实现。因为前面提到训练集中包含火车、卡车等这类问题较少,模型对这类物体的训练不够多,所以通过对包含这类物体最多的图片做上采样。用它们对模型进行额外训练,以解决类别失衡的问题。

其次针对图片分辨率,对模型的网络结构作出调整,如图所示将输入调整为608×608,输出的检测框为(76×76+38×38+19×19)×3=22743,相比较416×416的输入下的预测框(13×13+26×26+52×52)×3=10647),前者可以预测到更多物体,高分辨率也能保留更多细节。

通过调整训练集的曝光度、饱和度以及色温,我们可以获得不同条件下的训练集,从而达到扩充的效果。针对一部分数据,对数据分别做如图的6种处理,即可扩充训练集,得到更好的泛化能力。

实验与分析

整体改进效果:最后实验的整体改进效果如表所示,在实时检测的前提下,提高了算法的准确率。(后面会有视频展示来直观对比改进的效果)

局部改进效果:针对每一部分做出改进,改进的结果如图所示。

样张展示:在ppt的最后提供了和论文中一样的样张展示,屏幕上可以更清楚的看到改进后的效果对比。

视频展示

共5个部分。视频总共时长5min。前面(2880字)尽可能限制在10-15分钟讲完。结尾加一句:电脑中还有许多其他样张与视频可以查看。最后界面停留在PyCharm!(实际情况是只放了检测效果对比的视频展示)

  • 视频展示

  • 模型训练展示

  • 预测展示

  • 检测展示

  • 数据可视化展示

答辩记录

意见

  • 第四章算法的实现应当放在第三章中,第三章的内容过于单薄。
  • mAP是平均值,放在最后一行标黑不妥,标黑应该标在结果较高的一项。
  • 论文文献的引用太少不太具有说服力。格式错了很多
  • 总结的写法不太有逻辑性,你的写法是按时间展开的,更像是将你的心路历程,你的工作主要的要点和贡献体现不够突出
  • 目录的标题要重新梳理一下,很多说法都不适合做标题,必须是个动宾结构/偏正结构

问答

Q:为什么使用BDD100K数据集衡量算法的改进?最后播放视频中为什么使用了COCO数据集做对比?

A:BDD100K数据集的数据相当大,有10万张数据集,带有标注的数据集有7万张,有更大的训练价值;同时BDD100K数据集在2018年举行过物体检测的比赛,这也可以很方便的去对比其他算法的改进。关于第二个问题,我视频中使用COCO训练的检测效果与使用BDD100K对原生网络训练的检测结果来对比我改进后的模型,是因为原生YOLOv3就是基于COCO数据集训练的,使用起来比较容易,而且COCO数据集也很大,类别比较多,在视频的第二段我也使用改进前与改进后的检测效果对比。

Q:第三章的结构上不太理解,为什么要把分析当单做一张?第四章中的实现的部分也不太恰当,实现应该是具体的结果而不是中间的过程。

因为当时是想先将分析列出来,然后再各自进行实验得出结论。不过确实如老师所言,第三章的内容过于单薄了,后面第四章的不像是实现,更像是实验中过程的分析,这一部分应当放在第三章,最后实验中的样张展示才应该作为第四章实现的内容。谢谢老师指正!我再进行相应的调整。

Q:你前面在第三章中讲到了有些改进可能对速度产生影响,但我没有看到后续对应的分析啊?

A:因为后来在实验中发现对速度的影响是存在的,但没有产生很大的影响,所以没有特别提及。我会在后面再做一些补充来进行回应。谢谢老师指正。

Q:你样张中的展示里,具体在改进前和改进后,你检测的标签和实际的标签有没有一个对比?

A:没有,因为展示的图片来自测试集而非训练集或验证集,测试集本身不包含标签,无法在数值上得到精确的对比。我之后会使用验证集中的图片,对于改进前后的准确率以及各类标签做出详细比对。


欢迎分享

码字不易,请我喝杯咖啡呗?