YOLO是典型的one-step,将候选区bbox的确定和检测过程合二为一,整体可看作是回归问题,检测时间大大缩短,典型的
end-to-end。
YOLOv1论文地址:https://arxiv.org/pdf/1506.02640.pdf
1、网络结构图
卷积层采用Leaky ReLU激活函数。全连接层却采用线性激活函数。
第1个全连接层之前,采用dropout,参数值设为0.5
注意:在最后一个卷积层与dropout层之间,有一个local层,同样做的是卷积计算,但是卷积层共享卷积核参数,而local层每次滑动卷积窗口时,都会使用新的卷积核参数。详见yolov1.cfg文档
问题:我没有明白的是,网络结构中显示有两个全连接层,但是cfg文档中似乎只有一个(难道是detection层包含了?),而且它的output=1715 ???这是为何?还望有大佬赐教留言
2、训练过程
在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用网络结构图中前20个卷积层,输入是224×224(因为目标分类对图片像素的要求不高),然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。
(图片源于网络)
3、输入输出
将输入图片resize到448x448大小,然后被划分为7×7个网格grids。最终输出7×7×30的张量,这就意味着输入的每个网格对应输出30维的向量。30维向量主要包括:20个对象的预测概率(YOLOv1只支持识别20种物体),2个bbox的置信度(因为每个grid预测2个bbox),2个bbox的位置(每个需要4个数,共8个)
(图片源于网络)
也就是可以用一个公式来说明:
S×S×(B×5+C)
在这里S=7,B=2,C=20. 如果是训练自己的数据集,C改成数据集的类别数。
虽然每个grid可以预测2个bbox,但是最终只选择只选择 IOU 最高的 bbox 作为物体检测输出,所以最多只能检测出1种物体,对于群体的检测很差。
4、置信度计算
代表是否存在目标,取值为0或者1。
代表检测框pred和真实框truth之间的交并比。
5、损失函数
第一项:边框中心点的误差(YOLO中设置)
第二项:边框高度、宽度的误差
第三项:边框中有目标时,置信度误差
第四项:边框中没有目标时,置信度误差(YOLO中设置,为了调低不含对象的bbox的置信度)
第五项:目标分类误差
6、NMS
对于同一目标被多次检测的问题,目标检测算法常用NMS做最终检测。参考我的一篇博客https://blog.youkuaiyun.com/xue_csdn/article/details/100556865
7、FastYolo
FastYolo是文章中提出的一种轻量级版本,使用9个卷积层,并且卷积层中使用更少的卷积核(作者只介绍了其检测相关参数,没有对网络结构做说明,不太重要)。