1.感悟
这次前前后后大概花了1周的时间把SSD训练、评估、测试、应用部署整个阶段都学习了一遍,为什么说学习呢?因为代码是别人开源的,但是自己也是from scratch,从0到1全部实现了一次。在这次复现论文的过程中,总得来说,遇到的困难不是很多,Google查下基本都能解决,这里还是记录一下学习时候的感悟吧,以后再翻阅也好有个更新的印象。
1.1 训练
总的来说,我并没有按照论文中说的训练120000 iterations,我只训练了75000,结果已经和paper公布的结果很接近了。
1.1.1 网络的搭建
网络的搭建部分还是比较简单的,注意一下,SSD300在BaseNet用的是VGG-16,最开始初始化的时候是用了pre-trained参数的,其实这个地方我个人觉得影响不会很大,可以自己DIY,不过我没有试过。后面部分网络参数初始化用的是Xavier
方式。
1.1.2 数据集
训练数据集用的是VOC2007和VOC2012的training set,然后注意一下怎么把XML的各个标签解析出来,而且XML中的bbox格式是基于左上角和右下角的坐标的,而网络中是基于中心坐标表示的方式,然后长宽分别是基于default box的长和宽,然后取log对数的
1.1.3 Default box
defalut box相当于是先验知识,是基于很多物体的大小和长宽比(aspect ratio)统计得出的,在SSD中分别取了很多种大小,最小比例的是整个图片大小的0.2倍,最大的比例是整个图片的0.9倍,然后中间可以自己随便取一些值,这需要根据中间从多少不同层取预测结果来确定,也就是Multi-feature maps,越靠后,比例应该越大,反之比例越小。然后在每个物体大小比例的前提下,又有不同的长宽比,比如人是高比宽长的,而汽车则相反,SSD论文中取了6个长宽比,具体细节看论文。每一张图片,都会有N多个相同的default boxes。
1.1.4 Loss function
这一部分是最复杂,也是最关键的。大概有下面这些问题需要着重关注:
真的所有default box的都用去匹配吗?
不是这样的。我们知道,每个训练图片都会有ground truth信息,也就是真实的框,一张图,最多也就10多个物体,也就是10多个真实框,而我们的default boxes会有很多很多,几千个(8732个),怎么可能这么多都拿去训练?策略是:我们根据每个真实框,找到它所对应的default box(怎么找?先以每个真实框为目标,找到它对应最大交并比的default box,当然,匹配到的default box对应的各个长宽比都也考虑。)
还有一个重点,这也是SSD中需要尤其关注的地方,SSD不仅要求把真实框对应的default box找到,也要求找到default box和真实框IoU大于0.5的框,也算到训练的positive samples中去。这样一来,相当于让算法有了找到更多框的功能,虽然说不是很精确,但是在后面可以用non-max supperission筛除掉。Hard Negative Mining,难负样本挖掘
按照上面的匹配策略,我们大概会有匹配到几十个正样本,剩下的8000多个全是负的,我们不可能全都拿来训练,SSD采取的策略是让剩下的negative samples先按照置信度排个序,然后按照负正样本比例为3:1的比例选一些负样本出来,参与到loss function的计算中。
1.1.5 可视化
可视化部分用到了visdom
这个工具,可以把loss实时地输出到一个图表中,很是方便。支持自适应地将坐标比例缩放。
1.1.6 数据增强
这个部分就不多说了,论文中说的很明白。
1.2 评估
这次的评估指标用的是mAP,具体来说,是VOC 2007的11点取值评估方法,网上有很多相关资料说的很清楚了,如果以后有必要,再翻阅一下。我在训练75000 iterations后已经和论文中公布的结果很接近了,好多类基本都超过了,但是也有几类略低,但都是低了一点点,可接受,总的各类平均mAP是72.5,论文公布的是72.4。
1.3 测试
由于评估结果不错,我就没有再去测试test set了。
1.4 应用
本来我开始是考虑写个Android小程序的,无奈手边没有Android手机。iOS把有手机但没有电脑,也之前没折腾过IOS开发,想了一下也没有必要去花这个时间,最后我就在本机上写了个脚本应用,可以实时打开摄像头进行预测,也可以对视频、图片进行预测。下面是应用到最近比较火的一段视频的结果: