YOLO(一) 算法的原理及演变

YOLO(一) 算法的原理及演变,第1张

第一次接触到yolo这个算法是通过吴恩达的教学视频了解到的,当时其实也算是第一次接触到目标检测算法。这里我们主要介绍下YOLO(You Only Look Once)。现在已经进化到了V3版本了。它不同于Faster RCNN这个分支走的两部策略先进行前景识别在进行目标检测,它是直接一步到位进行目标检测。因此在识别的速度上优于Faster RCNN(5 FPS), 而 YOLO_v1基础版在Titan X GPU上可以达到45帧/s; 快速版可以达到150帧/s。但是在准确率上YOLO是稍差与Faster RCNN这个在之后会详细介绍。顺便提下如果想了解Faster RCNN原理可以参考 Faster-RCNN的原理及演变 。

我们知道YOLO其实就是 You Only Look Once, 意思是只需要看一眼就知道位置及对象,个人觉得蛮形象的。他不需要Faster RCNN的RPN结构,他其实选取anchor是预订了候选框,将划分为7x7的网格,每个网格允许有2个不同的bounding box 这样一开始我们就有7x7x2个候选框(bounding box), 大致粗略覆盖了图像的整个区域。他的思想就是Faster RCNN在第一阶段就算有了回归框,在第二阶段还是需要进行精调,那还不如就先生成大致回归框就ok了。

下面我们就来好好介绍一下这个模型。

一、模型结构

其实将这个模型简单话为:

那30又是如何形成的通道大小的呢?

a 2个bounding box的位置(8个通道)

每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。

b 2个bounding box 置信度(2个通道)

c 20分类概率(20个通道)

下面我们来说一下剩下20维度的分类通道。每一个通道代表一个类别的分类概率。因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。 但是我们一组只能预测49个对象,可以理解为一个grid2个achor只能有一个预测准的对象(即计算IOU比例最大的那个anchor),所以7x7个对象

图中将自行车的位置放在bounding box1,但实际上是在训练过程中等网络输出以后,比较两个bounding box与自行车实际位置的IOU,自行车的位置(实际bounding box)放置在IOU比较大的那个bounding box(图中假设是bounding box1),且该bounding box的置信度设为1

二、 损失函数

总的来说,就是用网络输出与样本标签的各项内容的误差平方和作为一个样本的整体误差。

损失函数中的几个项是与输出的30维向量中的内容相对应的。

三、 YOLO v1 缺陷

注意:

细节:

YOLO的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。更多细节请参考原论文

在67 FPS,YOLOv2在PASCAL VOC 2007上获得768%的mAP。在40 FPS时,YOLOv2获得786%mAP,这比使用ResNet和SSD 更快的R-CNN更好。凭借如此优异的成绩,YOLOv2于2017年CVPR发布并获得超过1000次引用。YOLO有两个缺点:一个缺点在于定位不准确,另一个缺点在于和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升。另外YOLOv2并不是通过加深或加宽网络达到效果提升,反而是简化了网络。

下面主要从两点来介绍下YOLO v2的提升之处。分别是Better以及Faster

1、Darknet-19

在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(825 billion operation VS 3069 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。Table6是最后的网络结构:Darknet-19只需要558 billion operation。这个网络包含19个卷积层和5个max pooling层,而在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLO v1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。这个网络在ImageNet上取得了top-5的912%的准确率。

2、Training for Classification

这里的2和3部分在前面有提到,就是训练处理的小trick。这里的training for classification都是在ImageNet上进行预训练,主要分两步:1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224 224,初始学习率为01。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。2、再fine-tuning 网络,这时候采用448 448的输入,参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0001,并训练10个epoch。结果表明fine-tuning后的top-1准确率为765%,top-5准确率为933%,而如果按照原来的训练方式,Darknet-19的top-1准确率是729%,top-5准确率为912%。因此可以看出第1,2两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

3、Training for Detection

在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。首先把最后一个卷积层去掉,然后添加3个3 3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1 1的卷积层,1 1卷积的filter个数根据需要检测的类来定。比如对于VOC数据,由于每个grid cell我们需要预测5个box,每个box有5个坐标值和20个类别值,所以每个grid cell有125个filter(与YOLOv1不同,在YOLOv1中每个grid cell有30个filter,还记得那个7 7 30的矩阵吗,而且在YOLOv1中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个grid cell的两个box的20个类别值是一样的)。另外作者还提到将最后一个3 3512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0001,并且在第60和90epoch的时候将学习率除以10,weight decay采用00005。

这里yolo v3相对于yolo v2有三点:1 利用多尺度特征进行对象检测 2 调整基础网络结构

继续我们的目标检测算法的分享,前期我们介绍了SSD目标检测算法的python实现以及Faster-RCNN目标检测算法的python实现以及yolo目标检测算法的darknet的window环境安装,本期我们简单介绍一下如何使用python来进行YOLOV3的对象检测算法

YOLOV3的基础知识大家可以参考往期文章,本期重点介绍如何使用python来实现

1、初始化模型

14-16 行:

模型的初始化依然使用cv下的DNN模型来加载模型,需要注意的是CV的版本需要大于342

5-8行:

初始化模型在coco上的label以便后期识别使用

10-12行:

初始化显示方框的颜色

2、加载,进行识别

输入识别的进行识别,这部分代码跟往期的SSD 以及RCNN目标检测算法类似

19-20行:输入,获取的长度与宽度

25-29行:计算的blob值,输入神经网络,进行前向反馈预测

只不过netforward里面是ln, 神经网络的所有out层

3、遍历所有的out层,获取检测的label与置信度

遍历out层,获取检测到的label值以及置信度,检测到这里YOLOV3以及把所有的检测计算完成,但是由于yolov3对重叠或者靠的比较近的检测存在一定的问题,使用YOLOV3使用非最大值抑制来抑制弱的重叠边界

竟然把墨镜识别了手机,体现了YOLOV3在重叠识别的缺点

4、应用非最大值抑制来抑制弱的重叠边界,显示

56: 使用 非最大值抑制来抑制弱的重叠边界

58-59行:遍历所有

61-62行:提取检测的BOX

64-68行:显示信息

70-71行:显示

利用python来实现YOLOV3,与SSD 以及RCNN代码有很多类似的地方,大家可以参考往期的文章进行对比学习,把代码执行一遍

进行视频识别的思路:从视频中提取,进行识别,识别完成后,再把识别的结果实时体现在视频中,这部分代码结合前期的视频识别,大家可以参考多进程视频实时识别篇,因为没有多进程,检测速度很慢,视频看着比较卡

1、初始化模型以及视频流

2、从视频中提取,进行的blob值计算,进行神经网络的预测

3、提取检测到的置信度以及ID值

4、 应用非最大值抑制来抑制弱的重叠边界,显示

5、关闭资源,显示处理信息

每个目标检测算法都有自己的优缺点,个人感觉,在精度要求不是太高的情况下SSD检测算法可以实现较快的速度实现,毕竟精度差不多的情况下,我们希望速度越快越好

Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测。

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

相关信息:

Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。

Yolo是一种目标检测算法。

YOLO将对象检测重新定义为一个回归问题。它将单个卷积神经网络(CNN)应用于整个图像,将图像分成网格,并预测每个网格的类概率和边界框。例如,以一个100x100的图像为例。我们把它分成网格,比如7x7。

然后,对于每个网格,网络都会预测一个边界框和与每个类别(汽车,行人,交通信号灯等)相对应的概率。

重要性:

YOLO非常快。由于检测问题是一个回归问题,所以不需要复杂的管道。它比“R-CNN”快1000倍,比“Fast R-CNN”快100倍。

它能够处理实时视频流,延迟小于25毫秒。它的精度是以前实时系统的两倍多。同样重要的是,YOLO遵循的是“端到端深度学习”的实践。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/jiehun/1320778.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-14
下一篇2023-07-14

发表评论

登录后才能评论

评论列表(0条)

    保存