每个格子同类物体出现两个候选框,通过nms,选取最大的一个。

在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448

前面介绍的R-CNN系的目标检测采用的思路是:首先在图像上提取一系列的候选区域,然后将候选区域输入到网络中修正候选区域的边框以定位目标,对候选区域进行分类以识别。虽然,在Faster R-CNN中利用RPN网络将候选区域的提取以放到了CNN中,实现了end-to-end的训练,但是其本质上仍然是提取先提取候选区域,然后对候选区域识别,修正候选区域的边框位置。这称为tow-stage的方法,虽然在精度已经很高了,但是其速度却不是很好。造成速度不好的主要原因就是候选区域的提取,这就需要一种网络能够直接预测出图像中目标的位置,中间不需要候选区域的计算,这就是one-stage

YOLO系就是one-stage目标检测的一种,其全名You only look once很形象,只需要将图片输入到网络中就预测中其中目标的bounding box以及bounding box所属的类别。相比R-CNN,YOLO损失了一定的精度,但是其有点就是速度快。

YOLO V1

YOLO V1将目标检测定义为一个回归问题,从图像像素信息直接得到目标的边框以及所属类别的概率,其有以下的优点:

  • 快。其整个网络结构就是解决回归问题,很快。
  • 在做predict的时候,使用的一整张图像的全局信息。two-stage的方法,每次只是“看到”图像的一块区域,YOLO 一次“看”一整张图像,所以它可以将目标整个的外观信息以及类别进行编码,目前最快最好的Fast R-CNN,较容易误将图像中的 background patches (背景的一个小块)看成是物体,因为它看的范围比较小。YOLO 的 background errors(背景错误) 比 Fast R-CNN 少一半多。
  • YOLO得到的目标的特征表示更容易泛化

YOLO 和R-CNN性能的对比

YOLO的也有一定的缺点,其准确度落后于Faster R-CNN,并且由于其使用比较粗糙的网格来划分原图,导致其对小目标的检测效果不是很好。

主要思路

相对于R-CNN系首先从原图中计算出一系列的候选区域,YOLO则使用简单的方法,首先将图像划分为S×SS×S(论文中S=7S=7)的网格,如果某个目标的中心位于一个grid cell中,则该grid cell就负责检测这个目标。

在YOLO网络中,目标的坐标信息是通过相对于某个grid cell左上角的偏移来表示的,目标的宽和高是用原图的宽和高占比表示的。 这就是这里为什么会说,如果某个目标的中心位于一个grid cell中,则该grid cell就负责检测这个目标,在做边框回归的时候,其GT就是该grid cell。

上面提到如果某个目标的中心位于一个grid cell中,则该grid cell就负责检测这个目标,也就是说在YOLO中,grid cell设计为可以代表目标,在网络中也是针对grid cell进行处理的。 在每个grid cell中预测出来BB(B=2B=2个bounding box,而且要为每个预测出来的bounding box打个分数,来表示该bounding box是否包含目标以及该bbox作为目标边框的可信度,这个分数称为Confidence。Confidence 的定义如下:

Confidence=Pr(object)⋅IoUtruthpredConfidence=Pr(object)⋅IoUpredtruth

其中,Pr(object)Pr(object)为bbox包含目标的概率(bbox存在目标则$Pr(object) =1 ,不存在目标则,不存在目标则Pr(object) = 0;;IoU_{pred}^{truth}$表示预测出来的bbox和Ground Truth之间的IoU。 也就是说,如果bbox不含目标则其confidence = 0,包含目标的话Confidence就是bbox和Ground Truth之间的IoU。

这样,通过每个grid cell预测出来的bbox可由一个五元组表示(x,y,w,h,Confidence)(x,y,w,h,Confidence),其中(x,y)(x,y)表示bbox的中心相对该grid cell左上角的偏移量,使用grid cell的长宽为比例,将其值归一化到[0,1][0,1]之间;(w,h)(w,h)为bbox的宽度和长度,以图像的宽度和长度归一化到[0,1][0,1]之间;CC就是上面提到的Confidence,其值也是在[0,1][0,1]之间。 这样每个bbox可以使用五元组(x,y,w,h,Confidence)(x,y,w,h,Confidence)表示,并且其值都是在[0,1][0,1]之间。

以grid cell为准预测出来的bbox表示了目标的边框信息,并不能判断出来其中包含的目标是属于哪一个类。所以YOLO网络还为每一个grid cell预测出CC个conditional class probability(条件类别概率):

P(classi|object)P(classi|object)

即在一个grid cell中有一个Object的前提下,它属于某个类的概率。只为每个grid cell预测一组类概率,而不考虑框的数量。

类别概率P(classi|object)P(classi|object)是对于某个grid cell的,表示该grid cell能够预测一个目标的条件下,其目标的属于某个类的概率;而bbox的confidence表示的是,包含目标的可行性。 将这两个值相乘,就可以得到bbox中包含的目标的的类别的概率了。
所以在测试阶段,将grid cell的P(classi|object)P(classi|object)和以该grid cell为准预测出来bbox的confidence相乘

P(classi|object)⋅P(object)⋅IoUtruthpredP(classi|object)⋅P(object)⋅IoUpredtruth

该值就能反应出bbox包含某一个具体类别的目标的可信度。

在YOLO论文中,使用VOC的数据集,即有20个类别,将图像划分为7×77×7的网格,每个grid cell预测出2个bbox,因此最终输出的数据张量尺寸为7×7×307×7×30。(S×S×(B×5+C)S×S×(B×5+C))。

上图表示了YOLO网络针对某个grid cell的输出。

  • 由于YOLO的最后输出层是全连接层,所以只能处理固定尺寸的图像448×448×3448×448×3
  • 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个grid
    cell 负责多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷

网络结构

YOLO使用CNN来提取图像的特征,最后使用全连接层做回归预测,并且借鉴GooLeNet的思路,使用了1×11×1卷积核。

YOLO由24个卷积层和2个全连接层组成,最终的输出为7×7×307×7×30的张量,也就是针对每一个grid cell YOLO网络都输出了一个30维的向量,这个30维的向量就包括上面提到的各种信息:grid cell为基准预测出来的两个bbox五元组,以及针对grid cell的预测某个类别的条件概率。具体如下:

目标函数

YOLO网络的输出实际上包含了三部分信息:bbox的位置信息,每个bbox的confidence以及每个grid cell的类别条件概率。 目标函数也就包含的三个部分:

λcoord∑i=0S2∑j=0B1objij(xi−xi^)2+(yi−yi)2^)]+λcoord∑i=0S2∑j=0B1objij[(wi−−√−wi^−−√)2+(hi−−√−hi^−−√)2]+∑i=0S2∑j=0B1objij(Ci−Ci^)2+λnoobj∑i=0S2∑j=0B1noobjij(Ci−Ci^)2+∑i=0S21obji∑c∈classes(pi(c)−pi)(c))2^)λcoord∑i=0S2∑j=0B1ijobj(xi−xi^)2+(yi−yi)2^)]+λcoord∑i=0S2∑j=0B1ijobj[(wi−wi^)2+(hi−hi^)2]+∑i=0S2∑j=0B1ijobj(Ci−Ci^)2+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−Ci^)2+∑i=0S21iobj∑c∈classes(pi(c)−pi)(c))2^)

很长的损失函数,首先来看两个超参λcoordλcoord和λnoobjλnoobj.
由于要将bbox的位置信息,confidence以及类别的概率放到同一个目标函数中,而且各个分量占的输出数据的多少也相差很多(位置信息只占了8个维度,而类别则占了20个维度),如果只是简单的使用方差作为损失则很难对三个要优化的目标做好平衡:

  • 8维的位置损失和20维的分类损失同等重要显然是不合理的
  • 如果一个grid cell中没有object(一幅图中这种grid cell很多),那么就会将这些grid cell中的box的confidence 置为0,相比于较少的有object的grid cell,这种做法是overpowering的,这会导致网络不稳定甚至发散。

针对上述问题,损失函数中使用权重来解决。

  • 为了表示8维的位置损失的重要性,给位置损失前面设置个大的权重,论文中设置的是λcoord=5λcoord=5

  • 为了平衡没有目标的grid cell,给没有目标的损失设较小的权重,论文中设置的是λnoobj=0.5λnoobj=0.5

  • 公式中的第一行表示bbox位置损失。关于bbox位置损失有两点,

    • 1objij1ijobj第ii个grid的第jj个bbox是否负责该object的检测(与该object的ground truth的IoU最大的bbox负责该object的检测)。如果负责object的检测,则1objij=11ijobj=1,否则为0,不参与位置损失的计算。
    • 因为目标的大小不同,其位置偏移量也不能同等对待。对于小的物体对偏移量的容忍度则较小,而大的物体其对偏移的容忍则大一些,也是是不同大小的目标,其偏移量的损失也不能一概而论。为了平衡这个问题,YOLO使用了一个比较巧妙的方法,不是直接使用预测目标的宽和高计算损失,而是使用其平方根(wi−−√−wi^−−√)2+(hi−−√−hi^−−√)2(wi−wi^)2+(hi−hi^)2,如下图 相同的位置偏移,反应在小目标的偏移损失比大目标预测的bbox要大。
  • 公式的第二行是bbox的confidence的损失。 YOLO中一个目标被一个grid cell负责检测,而同一个grid cell生成的BB个bbox,也是和目标的 ground truth 的IoU负责。这样就会有大量的bbox是不负责检测目标的,也就是1objij=0,1noobjij=11ijobj=0,1ijnoobj=1,而且由于包含目标的bbox较不包含目标的bbox要多很多,这里使用权值λnoobjλnoobj作为平衡,论文中使用λnoobj=0.5λnoobj=0.5

  • 公式的第三行是grid cell的类别条件概率损失. 1obji1iobj表示第ii个grid cell是否负责一个目标的检测。

下图能更好的解释YOLO损失函数的意义

测试

输入图片,网络会按照与训练时相同的分割方式将测试图片分割成S×SS×S的网格,因此,划分出来的每个网格预测的class信息和Bounding box预测的confidence信息相乘,就得到了每个Bounding box的class-specific confidence score,即得到了每个Bounding box预测具体物体的概率和Ground Truth重叠的好坏。

对于论文中,图片划分为7×77×7的网格,最终会得到98个bbox。要分类的目标有20个类给,这样每个bbox对得到20个分数,表示该bbox在20个对象的得分。根据这20个得分情况,对98个bbox进行最大值抑制NMS,选出每个类别的最终bbox。
NMS的步骤如下:

1. 设置一个Score的阈值(0.2),低于该阈值的候选对象排除掉(将该Score设为0)。
2. 遍历20个对象(找到每个对象的最好的bbox)2.1 遍历所有的98个bbox2.1.1 选择socre最大的bbox添加到输出列表中2.1.2 将计算余下的bbox的和score最大的bbox的IoU,如果大于设定的IoU阈值(0.5),则将该bbox的socre 设置为0.2.1.3 从余下的bbox中选择score最大的,重复上面的过程,直到所有的bbox要么在输出列表中,要不其socre为02.2 输出列表中bbox即为当前类的预测bbox

summary

YOLO是one-stage的目标检测网络,其优点:

  • 使用整幅图片进行预测,视野大,召回率低,表现为背景误检率低。
  • 泛化能力强,对其他类的东西,训练后效果也是挺好的

缺点:

  • 一个网格中只预测了两个框,并且只负责一类,YOLO对相互靠的很近的物体,还有很小的群体检测效果不好。
  • 当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱
  • 大边界框的小误差通常是良性的,但小边界框的小误差对IOU的影响要大得多。但YOLO会同样的对待小边界框与大边界框的误差,虽然做了一定的处理,但是物体的大小对仍有很大的影响。

目标检测 yolov1相关推荐

  1. 目标检测 —— YOLOv1论文精读

  2. 经典论文解析——YOLOv1——目标检测

    YOLOv1,you only look once 1. 网络简介 2. 网络设计思路 3. 网络结构 4. 网络训练和检测的技巧 5. 网络的优缺点   其实经典的CNN如AlexNet,VGG,G ...

  3. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  4. Yolov1目标检测算法详细分析

    Yolov1目标检测算法详细分析 Yolov1介绍 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字: ...

  5. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv3详解及复现

    在v1.v2的原理和技巧介绍之后,v3除了网络结构,其余的改变并不多.本文着重描述yolov3的原理细节. 相关阅读: 论文:YOLOv3: An Incremental Improvement 源码 ...

  6. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv2详解及复现

    YOLO v2 Yolov2论文链接:YOLO9000: Better, Faster, Stronger yolov2的改进 从Yolov2论文的标题可以直观看到就是Better.Faster.St ...

  7. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv1详解及复现

    检测器通常能够被分为两类,一类是two-stage检测器,最具代表的为faster R-CNN:另一类是one-stage检测器,包括YOLO,SSD等.一般来说,two-stage检测器具有高定位和 ...

  8. 【目标检测】(5) YOLOV1 目标检测原理解析

    各位同学好,今天和大家分享一下YOLOV1目标检测的原理. 1. 预测阶段--前向传播 预测阶段就是在模型已经成功训练之后,输入未知图片,对图片预测.此时只需要前向传播运行这个模型. 流程如下图,模型 ...

  9. 从YOLOv1到YOLOv3,目标检测的进化之路

    本文来自 CSDN 网站,作者 EasonApp. 作者专栏: http://dwz.cn/7ZGrif YOLOv1 这是继 RCNN,fast-RCNN 和 faster-RCNN之后,Ross ...

最新文章

  1. numpy.random.seed()
  2. Winsock属性 方法介绍
  3. mysql group 条件,mysql - mysql group by,两个条件,限制1 - SO中文参考 - www.soinside.com...
  4. Servlet Filter
  5. Spring 框架学习 —— 容器
  6. 小巧实用的节拍器软件FineMetronome介绍 原创
  7. 如何预防计算机专业的危害,程序员一族该如何预防“电脑病”?这份健康指南来帮你!...
  8. HDU---2084树塔
  9. 24个最新创意进度条设计,分分钟让你灵感爆表!!!
  10. 小白的倔强-NPN和PNP三极管的使用区别以及简单检测
  11. excel 的lookup和sumifs函数使用
  12. 什么是面形误差PVr?【光学测量、光学设计必看】
  13. 做大数据可视化分析的软件和工具有哪些?
  14. 硅计算机的原理,量子计算机工作原理揭秘
  15. 使用SQL的灵魂(精华)
  16. JQuery中的each()方法和$.each()函数的使用
  17. 以色列农业里的生态性-丰收节贸易会:在死海谋定活水
  18. ShuffleNet V2学习笔记
  19. php后缀伪静态为html,Thinkphp 3.2.3 URL路由伪静态生成遇到的问题生成带HTML后缀
  20. Python短文本自动识别个体是否有自杀倾向【新手必学】

热门文章

  1. python3 队列 queue
  2. StrongOD快捷键说明及其例子
  3. Spring 使用注解方式进行事物管理
  4. BIOS-SMI Introduction
  5. libnet apply method
  6. 数开头的成语有哪些_艺术留学文书申请过程中应避开哪些雷区?ACG艺术留学
  7. linux创建mysql视图_MySQL视图基本操作
  8. c语言判断文件是否建立成功,C语言编程之怎样判断某一文件是否存在
  9. 兰州市职称计算机考试地点,兰州2013年职称计算机考试报名等事项的通知
  10. 什么叫取反_转载:CodeReview正确的姿势是什么?