前言
如今基于深度学习的目标检测已经逐渐成为自动驾驶、视频监控、机械加工、智能机器人等领域的核心技术,而现存的大多数精度高的目标检测算法,速度较慢,无法适应工业界对目标检测实时性的需要,这时YOLO算法横空出世,以近乎极致的速度和出色的准确度赢得了大家的一致好评。基于此,我们选择使用YOLO算法来时间目标检测。
YOLO
相对于传统的分类问题,目标检测显然更符合现实需求,因为往往现实中不可能在某一个场景只有一个物体,因此目标检测的需求变得更为复杂,不仅仅要求算法能够检测出是什么物体,还需要确定这个物体在这个图片上的位置。
R-CNN系列需要进行两个阶段,即区域提取和目标分类。这样做的一个特点就是虽然确保了精度,但速度非常慢,于是以YOLO为主要代表的这种一步到位即端到端的目标检测算法就应运而生了。
YOLOv1
YOLOv1的核心思想在于将目标检测作为回归问题解决,YOLOv1首先会把原始图片放缩到448448的尺寸,放缩到这个尺寸是为了后面整除方便。然后将图片分成ss个格子,如果某个对象的中心落在某个单元格上,那么这个单元格负责预测这个物体。每个单元格需要预测B个边界框值,同时为每个边界框预测一个置信度。这个置信度并不只是该边界框是待测物体的概率,该边界框是待检测目标的概率乘上该边界框和真实位置IoU的乘积,以此来反映该边界框预测位置的精度。
每个边界框对应五个输出,即x, y, w, h和置信度,分辨表示边界框的中心坐标,边界框真实宽高相对于整幅图的比例。除此之外,每个单元格还产生C个条件概率。
在test的非极大抑制阶段,对于每个边界框,使用下式计算每个单元格的个体分类置信度得分,这既包含了预测的类别信息,也包含了对bbox值得准确度。设置一个阈值,把低分的滤掉,剩下的留给非极大抑制,得到最终的标定框。
在VOC数据集上,S=7, B=2, C=20。网络的输出大小为7730。
网络的结构如下:
该网络结构包括24个卷积层,最后两个全连接层。
损失函数
YOLO v1全部使用了均方差作为损失函数,由三个部分组成:坐标误差、IOU误差和分类误差。
考虑到每种loss 的贡献率的不同,YOLOv1给坐标误差设置权重为5,在死算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值不同。若采用相同的权值不含物体的格子的置信度值近似为0,变相放大了包含物体的格子的置信度误差,在计算网络参数梯度时的影响。因此,没目标的置信度权值为0.5。
对于相等的误差值,达吾提误差对检测的影响小于小物体误差对检测的影响。因为相同的位置偏差占大物体的比例远小于同等偏差小物体的比例。YOLO将物体大小的信息项进行求平方根来改进。
综上,yolov1的损失函数为:
YOLOv1作为一步检测的开山之作,最大的特点是快。其将物体检测作为回归问题进行求解,使用单个网络完成整个检测的方法,大大提升了同类目标检测算法的速度,并且实现了召回率低,表现为背景误检率低的优点。
但是yolov1的精准性和召回率相对了fast rcnn比较差。其对背景的误判率比fast RCNN的误判率低很多。说明了yolov1中把物体检测的思路转成回归问题的思路有较好的准确率但是对于边界框的定位不是很好。
YOLOV2
YOLOv1对于边界框的定位不是很好,在精度上比同类网络还有一定的差距,所以YOLOv2对于速度和精度上做了很大的变化,并且吸收了同类网络的有点,一步步做出尝试。
YOLOv2在v1基础上做出改进后提出。其受到faster RCNN的启发,引入了anchor。同时使用了k-means方法,对anchor数量进行了讨论,在精度和速度之间做出了折中。并且修改了网络结构,去掉了全连接层,改成了全卷积结构。在训练时引入了世界树结构,将检测和分类问题看成了一个统一的框架,并且提出了一种层次性联合训练方法,将ImageNet分类数据集和coco检测数据集同时对模型进行训练。
- 在每一个卷积层后增加batchnorm,可以极大的改善收敛速度同时减少对正则化的依赖。
- 使用高分辨率进行训练(448*448)
- 引入anchor。去掉全连接层。
YOLOv3
YOLOV3是目前为止,速度和精度最均衡的目标检测网络。通过多种先进方法的融合,将YOLO系列的短板(速度很快,不擅长检测小物体)全部补齐。
- 每个框使用多标签分类来预测边界框可能包含的类。不使用softmax,使用二院交叉熵损失来进行类别预测。对重叠的标签,多标签方法可以更好的模拟数据
-
跨尺寸预测。采用类似FPN的上采样和融合方法,在多个scale的特征图上做检测,对于小目标的检测效果提升较高。