YOLO-v1 介绍
YOLO 是一个端到端的目标检测算法,不需要预先提取 region proposal(RCNN 目标检测系列),通过一个网络就可以输出:类别,置信度,坐标位置,检测速度很快,不过,定位精度相对低些,特别是密集型小目标。
YOLO 将图像 resize 到 448×448 作为输入,输出 7x7x30,即:将图片划分为 7 ×7,每个单元格独立检测。这里需要注意,不是那种滑动窗口将每个单元格都输入到网络中进行预测,这里的划分只是物体中心点位置的划分之用(划分越多越准确),物体的中心落在哪个单元格,就由那个单元格负责预测。说完 7 ×7 我们再说下另一个维度 30,30=(2*5=20),其中“2:每个单元格预测数量(box 数量)”,“5:(x,y,w,h,score)”,“20:模型可以预测 20 个种类”。
YOLO-v1 训练
模型首先会将 ImageNet 作为训练集预训练模型,最终达到 88% 精度,然后使用迁移学习将预训练的模型应用到当前标注的训练集进行训练。模型输出 5 维信息(x,y,w,h,score),使用 Leaky Relu 作为激活函数,全连接层后添加 Dropout 层防止过拟合。在得到输出值之后,我们需要计算每个 box 与 ground true 的 Iou 值,然后通过非极大值抑制筛选 box。
YOLO-v1 损失函数
损失函数包含三部分分别是:坐标损失,置信度损失(7x7x2),类别损失(7x7x20)。坐标损失:
我们使用 SSE 损失函数(就是 MSE 损失函数的累加版本),如图所示我们在“w,h”中加了根号,加根号的原因是,“w,h”的损失在大框和小框之间“权重”应该不同。因为,对应图像中较大的物体而言,box 有些偏移一般并不会影响预测结果。但是对应小物体而言,同样的偏移可能会脱离预测目标。置信度损失:
如图所示,损失函数分为两部分:有物体,没有物体,其中没有物体损失部分还增加了权重系数。添加权重系数的原因是,对于一幅图像,一般而言大部分内容是不包含待检测物体的,这样会导致没有物体的计算部分贡献会大于有物体的计算部分,这会导致网络倾向于预测单元格不含有物体。因此,我们要减少没有物体计算部分的贡献权重,比如取值为:0.5。类别损失:
当有物体的中心点落在单元格中,此单元格就负责预测该物体。
YOLO-v2 改进
使用批标准化:随着神经网络的训练,网络层的输入分布会发生变动,逐渐向激活函数取值两端靠拢,如:sigmoid 激活函数,此时会进入饱和状态,梯度更新缓慢,对输入变动不敏感,甚至梯度消失导致模型难以训练。BN,在网络层输入激活函数输入值之前加入,可以将分布拉到均值为 0,标准差为 1 的正态分布,从而使激活函数处于对输入值敏感的区域,从而加快模型训练。此外,BN 还能起到类似 dropout 的正则化作用,由于我们会有‘强拉’操作,所以对初始化要求没有那么高,可以使用较大的学习率。
High Resolution Classifier:在介绍 YOLO-v1 的时候我们说到,模型需要先在 ImageNet 上预训练模型,因此,此时图像输入为 224×224,使用迁移学习训练后我们的图像输入是 448×448,因此模型需要适应图像分辨率的改变。在 YOLO-v2 中,我们在预训练模型中先 224×224 训练 160 个 epoch,然后将输入调整到 448×448,再跑 10 个 epoch,也就是在 ImageNet 数据集中两种分辨率跑两次。YOLO 大神作者实现表明,这样操作可以提高 4% 的 map。
Convolutional With Anchor Boxes:1,加入 anchor boxes,提高 box 数量。2,删除全连接层和最后一个池化层,保留更高分辨率特征。3,用 416×416 代替 448×448 输入大小,使特征图有奇数大小的高和宽。
Dimension Clusters:使用 k -means 的方式对训练集的 bounding boxes 做聚类,但是该方法存在不同尺寸的 box 误差权重不同,我们希望误差与尺寸没有关系,因此通过 IOU 定义如下函数:
Multi-Scale Training:训练阶段,采用 32 的倍数作为图像尺寸动态输入,如【320,352。。。608】。这种网络训练方式使得相同网络可以对不同分辨率的图像做 detection。
使用 Darknet-19 作为后端网络:
YOLO-v3
YOLO-v3 结构图以来自木盏,表示感谢,也欢迎关注他的博客。
DBL: 指 Darknetconv2d_BN_Leaky。resn:指:n 代表数字,有 res1,res2, … ,res8 等等,表示这个 res_block 里含有多少个 res_unit,使用残差结构可以让网络更深。concat:张量拼接。将 darknet 中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层 add 的操作是不一样的,拼接会扩充张量的维度,而 add 只是直接相加不会导致张量维度的改变。
后端网络使用 darknet-53:
我们发现,在 YOLO-v3 网络中没有池化层和全连接层,那么张量尺寸的变化是通过改变卷积核步长来实现。同 YOLO-v2 一样,输出尺寸为输入尺寸的 1 /32,即:一般要求输入图像尺寸是 32 的倍数。
类别预测由 softmax 改为 logistic(使用 sigmoid):用于处理预测物体之间存在包含关系问题,解决多标签对象支持。比如 woman 和 person,softmax 输出:person,logistic 输出两者。
使用多尺度特征预测物体:
上图是 YOLO-v3 在 COCO 数据集上使用聚类得到的 9 种先验框,一个代表宽度一个代表高度。在不同的感受野中使用不同的先验框。如果先验框不是最佳的,即使超过预设定的阈值,也不会进行预测。logistic 回归用来从 9 个先验框中找到最佳的那个。
补充:Iou 计算
总结
YOLO 好不好,我们就以一张图作为总结吧:
祝大家 2018 年圣诞节快乐!