前言
主流分类神经网络有 AlexNet、 ResNet、VGG等;YOLO是否能它特点和核心竞争力呢?有的,YOLO网络用于目标检测速度很快,准确率也不错;而且随着YOLO版本的迭代,其检测速度和准确率有了较大提升。
本篇文章主要介绍YOLOv1
YOLOv1
YOLO的全名是“You Only Look Once”,只需看一次,对应one- stage detetor (单阶段目标检测)只用一级网络就完成了分类和回归两个任务
论文下载:https://arxiv.org/abs/1506.02640
代码下载:https://github.com/pjreddie/darknet
核心思想:将整张图片作为网络的输入(类似于Faster-RCNN),直接在输出层对 bounding boxs的位置和类别进行回归。
YOLOv1特点
- 一次性输出所检测到的目标信息,包括类别、位置和置信度等
- 只要求这个物体的中心在某个grid之内
YOLOv1原理
1)将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格(grid )中,则这个网格就负责预测这个object。
2)每个网络需要预测B个bounding boxes的位置信息和confidence(置信度)信息,一个bounding boxes对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:
3)每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
(注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。)
假设有SxS个框框,每个框的 bounding boxes个数为B,分类器可以识别出C种不同的物体,那么整个 ground truth的长度为S×S×(B×5+C)。
YOLOv1入门知识点
1)YOLO中的grid是什么?
一张图片使用n*n的网络划分,划分后形成的许多个小网格(图片变成许多小块组成了,每个正方形的小块都一样)。比如使用7* 7的网络划分一张图片:
7* 7划分后形成49个网格,每个网格也就grid
当我们知道物体的中心落在那个grid(网格)后,通过grid坐标和实际物体的坐标进行对比和修正;比如上图中本来一个grid是无法完整框住小狗的,以这个grid为中心进行坐标偏移(扩展、缩小等),具体偏移多少是根据实际小狗的坐标去调整(训练模型),最后调整到合适的框框后(比如像图中黄色的框框),就能完整框住小狗了。
只要求这个物体的中心在某个grid之内 YOLO这个特点和Fast RCNN是不一样的,Fast RCNN需要预测一个能完整框住整个物体的框框。
2)YOLO中的bounding boxs是什么?
当我们知道物体的中心落在那个grid(网格),如下图中的小狗中心点落在红色的框框,由红色的框框(grid)调整后,变成完整框住小狗的框叫bounding boxs;
图中有两个黄色的框,他们都是基于红色的框(grid)预测出来的,用来框住整个物体(小狗),这个些黄色的框叫bounding boxs。
- 每个grid都预测出B个 bounding boxs,这个 bounding boxs有5个量,分别是物体的中心位置(xy)和它的高(h)和宽(w),以及这次预测的置信度。
- 每个grid还要负责预测这个框框中的物体是什么类别的;
上图中每个grid都预测出2个 bounding boxs,即在小狗对象的预测中 那个两个黄色的框。
在下图中的红色的框(grid),在神经网络深层中的特征图(Feature map),grid cell代表的张量大小:n*n * 深度维数,其中n*n是图片网格划分的维数,比如:7*7;对应下图:7*7*30。
获取grid cell的张量的数据后,会生成一个张量,然后设置每个grid预测多少个bounding boxs,比如预测两个;有20中类别。
每个bounding boxs有5个特征量,分别是中心位置(xy)、高(h)、宽(w)和置信度。预测两个bounding boxs,所以维度:bounding boxs1+bounding boxs2+类别数量 即:5+5+20。所以深度维数为30,对应上面:7*7*30。
3)YOLO中的Ground Truth是什么?
在下图中,图片用7*7的网格划分,合计49个grid,每个grid有两个 bounding box,每个 bounding box有5个预测值,假设分类器可以识别出3中物体,那么一张图片中的ground truth的总长度为
S×S×(B×5+C)= 7×7×(2x5+3)= 637
如果单看小狗的那个grid,它的ground truth的长度为:2x5+3 = 13。
规定每个grid的 ground truth的顺序是 confidence,x,w,h,c1,c2,c3 (目标类别:c1,c2,c3)
YOLOv1置信度如何计算
IOU是预测的 bounding box和真实的物体位置的交并比;IOU要根据bounding box的x,y,w,h的预测值进行现场计算。Pr是一个grid有物体的概率,在有物体的时候 ground truth为1,没有物体的时候 ground truth为0。
计算公式:
当grid中没有物体,此时Pr为0 ,后面的IOU就不用计算了。当预测的 bounding box和真实的物体位置越重合,IOU计算出来的值越大,置信度越高。
YOLOv1网络结构
网络结构参考 GooLeNet模型,包含24个卷积层和2个全连接层。其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和2个全连接层。这样可以根据任务定制一部分特征在网络中。
YOLOv1的损失函数
YOLOv1、YOLOv2和YOLOv3的损失函数都差不多的;
一个网格预测多个bounding box,希望的是每个bounding box predictor专门负责预测某个object。具体做法是看当前预测的bounding box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。
最后整个的损失函数如下所示:
-
只有当某个网格中有object的时候才对classification error进行惩罚。
-
只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。
YOLOv1的缺点
- 一个grid只能识别一种物体。(因为grid中的Bounding box只预测一种类别)如果在有遮挡,或一个grid中有多种物体时,YOLO就不合适了。
- Bounding box的预测准确度是不如R-CNN这样的Region- based方法的。
- 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
- 当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
- YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
YOLOv1实验结果
能看到YOLOv1的精度并不高只有50多左右,但是它的检测速度很快;这时需要看不同场景的任务需求了,如果对精度要求不高,实时性要求高的,可以选择YOLOv1的模型。
PASCAL VOC 2012排行榜; 截至2015年11月6日,YOLO与完整的comp4(允许外部数据)公共排行榜进行了比较。显示了各种检测方法的平均平均精度和每类平均精度。 YOLO是唯一的实时检测器(在当时)。 Fast R-CNN + YOLO是得分最高的方法,比Fast R-CNN增长2.3%。
关于毕加索和People-Art数据集的推广结果:
(a)毕加索数据集精确调用曲线。(b)关于VOC 2007,毕加索和People-Art数据集的定量结果,毕加索数据集同时评估AP和最佳F1得分。
YOLOv1目标检测效果:
大部分是能正确识别的,不过也有识别错误的地方(把人识别为一架飞机了)
YOLOv2、YOLOv3、YOLOv4后面的文章单独介绍。( •̀ ω •́ )y
参考1:https://pjreddie.com/darknet/yolo/
参考2:https://www.bilibili.com/video/BV1EK4y1E7gu
YOLO物体/目标检测 https://blog.csdn.net/qq_41204464/category_10425913.html?spm=1001.2101.3001.4235