浅谈Yolo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Yolo相关的知识,希望对你有一定的参考价值。

参考技术A 学号:20021210654

姓名:潘文欣

原文链接: https://blog.csdn.net/xiaohu2022/article/details/79211732

https://blog.csdn.net/qq_30815237/article/details/91949543

【嵌牛导读】

当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定位,图像分割等。其中目标检测是一件比较实际的且具有挑战性的计算机视觉任务,其可以看成图像分类与定位的结合,给定一张图片,目标检测系统要能够识别出图片的目标并给出其位置,由于图片中目标数是不定的,且要给出目标的精确位置,目标检测相比分类任务更复杂。

近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。

【嵌牛鼻子】 计算机视觉 目标检测 YOLO算法

【嵌牛正文】

目标检测算法有很多,本文介绍的是Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,其中,You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。

如下图是YOLO的检测系统,整体来看,首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的。

具体来说,Yolo的CNN网络将输入的图片分割成S S网格,,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为Pr(object),当该边界框是背景时(即不包含目标),此时Pr(object)=0。而当该边界框包含目标时,Pr(object)=1。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 。因此置信度可以定义为Pr(object)∗ 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。还有一点要注意,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。

还有分类问题,对于每一个单元格其还要给出预测出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即 。值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores): 。边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框。

总结一下,每个单元格需要预测(B∗5+C)个值。如果将输入图片划分为S×S网格,那么最终预测值为S×S×(B∗5+C)大小的张量。整个模型的预测值结构如下图所示。对于PASCAL VOC数据,其共有20个类别,如果使用S=7,B=2,那么最终的预测结果就是7×7×30大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。

Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如下图所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数。但是最后一层却采用线性激活函数。

可以看到网络的最后输出为7×7×30大小的张量。这和前面的讨论是一致的。对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的(x,y,w,h)。

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

下面是训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重 。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 。其它权重值均设为1。然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为 。

另外一点时,由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,左标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。 

综上讨论,最终的损失函数计算如下:

其中第一项是边界框中心坐标的误差项, 指的是第ii个单元格存在目标,且该单元格中的第j个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项, 指的是第i个单元格存在目标。

NMS算法(非极大值抑制算法):选择得分(Confidence Score)最高的作为输出,与该输出重叠的  去掉,不断重复这一过程直到所有备选处理完。

YOLO的NMS算法中, Confidence Score的值如下: , 。 代表着某个对象 存在于第j个边界框的可能性。每个网格有:20个对象的概率*2个边界框的置信度,共40个得分。49个网格共1960个得分。对每种对象分别进行NMS,那么每种对象有1960/20=98个得分。

YOLO算法的NMS步骤如下:

1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)

2)遍历每一个对象类别

 2.1)遍历该对象的98个得分

  2.1.1)找到Score最大的那个对象及其边界框,添加到输出列表

  2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的边界框的IOU

  2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)

  2.1.4)如果所有边界框要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象

3)输出列表即为预测的对象

这篇长文详细介绍了Yolo算法的原理及实现,当然Yolo-v1还是有很多问题的,所以后续可以读读Yolo9000算法,看看其如何改进的。

浅析YOLO, YOLO-v2和YOLO-v3

参考技术A

经典的目标检测网络RCNN系列分为两步,目标proposal和目标分类。而Faster-RCNN中把目标proposal和目标分类作为一个网络的两个分支分别输出,大大缩短了计算时间。而Yolo系列则把这两个分支都省了,只用一个网络同时输出目标的位置和分类。

输入:一张图片

输出:把每张图片分成SxS个方格,对每个方格,输出一个B*5+C维的数组。其中B是该方格预测方框的数目,包含(x,y,w,h,s),s表示方框的置信度,C表示需要预测的类别数。

在YOLO中,S=7, B=2,PASCAL VOC有20类,所以C=20,B*5+C=30。

YOLO网络结构主要分为两个部分,第一部分是特征提取网络,主要是为了提取物体的通用特征,一般在ImageNet上进行预训练;第二部分是后处理网络,目的是回归出待检测物体的坐标和类别。

第一个版本的YOLO的特征提取网络有24个卷积层和2个全连接层。网络结构如下图。

可以看出,这个网络中主要采用了1x1卷积后跟着3x3卷积的方式。

特征提取网络采用了前20个卷积层,加一个avg-pooling层和一个全连接层,对ImageNet2012进行分类,top-5正确率为88%,输入分辨率为224x224。

检测时,将输入分辨率改为448x448,因为网络结构是全卷积的,所以输入分辨率可以改变,整个网络输出为7x7x30维的tensor。

接下来要重点将一下这个损失函数。

用网络直接回归物体的坐标是很难的,这里对要回归的物体的坐标进行了一些转化。物体方框的长w和宽h分别除以图片的长和宽;x和y坐标分别表示对应方格坐标的偏移,分别除以方格的长和宽;它们都在0到1之间。

损失函数分为多个部分:

其中,其中i表示第i个方格,j表示该方格预测出的第j个方框。 表示物体obj的实际方框与第i个方格有 对应关系 ,即obj的中心落在第i个方格中; 表示物体obj的实际方框与第i个方格预测的第j个方框有 对应关系 ,即obj的中心落在第i个方格中,并与它的第j个预测方框的IOU最大。

可以看到损失函数包括5个部分。第一部分是x,y坐标;第二部分是w,h,采用根号使得小方框size变化的损失比大方框size变化的损失大;第三部分是方框置信度损失,回归目标是预测方框与实际方框的IOU值;前三部分都只在预测方框和实际方框有对应关系时才计算loss;第四部分是没有对应物体的方框置信度损失,实际的置信度都是0;第五部分是分类损失,当方格与物体有对应关系时,才计算分类损失。

因为在图片中很多方格都不包含物体,使得方格预测方框的置信分数趋于0。所以对包含物体的方格加大权重,对不包含物体的方格减小权重。论文中有 。

YOLO-v2在YOLO-v1的版本上做了一些改进。

主要利用了NIN的思想。有19个卷积层和5个maxpooling层,实现了72.9%的top-1正确率和91.2%的top-5正确率。在448x448的分辨率上,实现了76.5%的top-1正确率,和93.3%的top-5正确率。网络结构如下图所示。

修改成detection网络时,删除了最后的卷积层,添加了3个3x3x1024的卷积层,和一个1x1x125的卷积层,在最后的3x3x512层和导数第二层之间添加了一个paththrough进行特征concat。

开始学习率是0.001,在60和90个epoch时乘以0.1。

另外,YOLO-v2利用WordTree,将分类和检测任务进行联合训练,对于没有方框标注的物体也能预测出其方框,能够对词典中9000个概念进行预测。YOLO-v2也叫做YOLO9000。

YOLO-v3在YOLO-v2的基础上进行了一些改进。

Darknet-53和Resnet-152正确率相同,但速度是2倍。

总的来说,我觉得,YOLO的发展完全展现了汲取众家之长的力量。还是要多看paper,以上。

参考文献:
[1] Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.
[2] Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint, 2017.
[3] Redmon, Joseph, and Ali Farhadi. "Yolov3: An incremental improvement." arXiv preprint arXiv:1804.02767 (2018).

以上是关于浅谈Yolo的主要内容,如果未能解决你的问题,请参考以下文章

浅谈BurnDown Chart (原创)

浅谈 IPV6

浅谈iOS中的RunLoop

浅谈JAVARMI

#48 浅谈数据仓库(DW & BI)

转浅谈Java中的equals和==