一、前言
结合网上的资源以及yolo的代码对yolo进行学习的一篇内容
yolov1是2016年发表的一篇目标检测的论文。论文地址:https://arxiv.org/pdf/1506.02640.pdf 之所以会关注这个论文,是因为看见github上的chineseocr项目,其中的文本框检测使用了yolov3,参考了csdn上一位作者的介绍,想要知道yolo的精髓,需要从yolov1开始,因为yolo这个系列是一脉相承的。
二、简介
yolo的第一篇文章叫《You Only Look Once: Unified, Real-Time Object Detection》 ,它把bounding box的坐标像分类网络那样预测出来。和fast-rcnn这类两段检测(先检测物体位置,然后进行分类,分类之后还需要一些后处理来修正检测框的位置)不同,yolo_v1将预测框的位置、大小和物体分类视为一个回归任务,通过CNN暴力predict出来。 这种直接的方式使得yolov1的速度比rcnn这类模型有如下的优势
- 要快很多。没有pipeline工作流,在Titan X-GPU上可以达到45帧每秒。
- yolo更加可以解释图片的预测过程,因为它是对整张图片进行处理,而不是像rcnn那样通过滑动窗口,对局部区域进行分析,因此不容易在背景上产生false positive error。
- 泛化能力强,可以在自然图片上训练,然后用来测试艺术画,且效果远远优于DPM和RCNN。这种泛化能力意味着他可以更加容易的迁移到其他领域。
yolov1也有一些天然的缺点:比如,会导致更多的位置定位上的错误,尤其是小物体定位,固定了尺寸的大小,识别的类别太少等,这些缺陷将在未来的版本中被优化和解决。
三、网络介绍
1. 基本概念
yolo_v1奠定了yolo系列算法“分而治之”的基调,在yolo_v1上,图片的划分和预测如下图所示:
如上图所示,输入图片被划分为SxS个单元格,如果物体的中心在这个网格内,则该单元格为检测该物品负责。每个网格预测B个bounding box,以及这些bounding box的得分。得分体现了模型对box包含物品以及包含物品的准确度的判断。在测试过程中,我们定义得分为Pr(Object)*IOU^true_pred.如果不包含物品,则得分为0,否则得分为预测框和真实框的IOU。
每个bounding box的预测由五个部分组成,(x, y, w, h,score).(x,y)为相对于网格中心的便宜,(w,h)为相对于整个图片的宽度和高度。
每个网格预测C个类别,Pr(CLASSi|Object)。当模型预测网格中含有物体的时候,就会有这个预测类别。无论一个网格中有多少个bounding box,都只会有一个这样的类别预测。在测试阶段,
这个数值即使该类物品出现在网格中的概率,也是预测框预测是否合适的一个指标。
在上面的图上,可以看出,S*S个网格,每个网格预测了B个bounding box和C类物品的概率,每个bounding box由(x, y, w, h,score)组成,因此预测结果被编码为SxSx(Bx5+C)。
需要特别注意,yolo的做法并不是把每个单独的网格作为输入feed到模型,在inference的过程中,网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。
2. 网络结构介绍
这里使用CNN神经网络来设计,前面的CNN网络用于抽取整张图片的特征,全连接层用于预测输出的坐标和概率。
整个网路架构收到GoogleNet的启发,由24个卷积层和2个全连接层组成,不同于GoogleNet使用inception模块(googleNet中11,33,5*5以及maxpool层会堆叠起来形成层),这里简单的会用了3 x 3卷积层,跟随着1 x 1卷积层的方式。
四、训练
首先在ImageNet的1000类图片上进行前20层卷积层的预训练,在二十层卷积层之后添加一个平均池化层和一个全连接层。
训练的时候,先用ImageNet上的样本对模型的前20层(额外加上一个平均池化层和一个全连接层)进行预训练,在获得了top-5准确率88% 之后,再使用Darknet framework对整个网络进行训练。
根据前人的经验(参考文献1),在预训练的模型中加入卷积层和全连接层可以提升新能,因此在20个卷积层的预训练之后,叠加了四个卷积层和两个全连接层,并随机初始化权重。在训练的时候,图片大小都是448x448. 所有的参数(x,y,w,h,s)都是在0~1之间的数。
模型使用的激活函数是leaky ReLU,相比普通ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出
loss使用的是平方和误差。平方和误差易于求解,但是存在比较大的问题是不利于最大化平均准确率。平方和误差将定位误差和分类误差放在同一高度(不好),不包含物体的cell在图片中往往占了多数,这样这些图片的score=0,加强了包含物品cell的梯度。总之会导致训练不稳定。另一个不好的方面是对于大物体和小物体,平方和认为其误差的影响是一致的,实际情况是小物体的误差往往比大物体的误差要重要。
改进的措施是
- 对于位置误差通过系数增强影响力,
-
对于不包含物体的cell则通过系数减小其对误差的影响力。
3.对于物体的高度和宽度误差,则用均方误差代替平方和误差。
损失函数图
在训练的过程中,还使用了dropout来避免过拟合。对于图片也引入了随机尺寸变化和转换,同时还使用了HSV色彩空间的图片。
小总结
v1对于整个yolo系列的价值,即v2/v3还保留的特性,可以总结为3点:
leaky ReLU,相比普通ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出;公式如下:
y={x,x>00.1x,otherwise
y={x,x>00.1x,otherwise分而治之,用网格来划分图片区域,每块区域独立检测目标;
端到端训练。损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势。
yolo1的短板
V1 缺陷之处:
输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成此固定分辨率;
占比较小的目标检测效果不好:虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
重要的参考资料
- S. Ren, K. He, R. B. Girshick, X. Zhang, and J. Sun. Object
detection networks on convolutional feature maps. CoRR,
abs/1504.06066, 2015. 3, 7 - YOLO系列之yolo v1