2018-03-24 13:44:09 LeeWanzhi 阅读数 2070
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5154 人正在学习 去看看 黄彬彬

YOLO这个模型虽然我不会拿来用,但YOLO2还是不错的。所以还是把YOLO做个简单的了解吧。
注意:这并不是详解!

1. Introduction

YOLO相对于基于Region proposal的模型来说,不同之处在于直接在图像上做检测和分类。因为region proposal比较费时间,无法做到real-time。所以YOLO把这个给砍掉了。当然,YOLO这种方法虽然保证了实时速度很快,但精度做了很大的牺牲。

基本流程为:
1.resize image to 448 x 448,输入到网络中。(YOLO要求图像是方形,因为最后是利用7 x 7的张量来表示分类值和位置值等)
2.运行卷积神经网络,输出 7x7x30的张量。每一个格网表示2个bbox的预测值。没错,YOLO中,总共只输出98个bbox,是不是很吃鸡。
3.非极大值抑制。虽然bbox少,但也是有重叠的情况,所以要pass掉分数低的。
具体的解释看下面。

2.YOLO

YOLO在input image前,将image划分成7 x 7的格网。
引用一下参考文献[1]中的图。
这里写图片描述
如果一个物体的中心落在某个格网内,则这个格网负责检测这个物体。
物体的中心怎么知道在哪呢?笔者认为训练时可以通过GT获取。(当然,测试时是没有的)
如图,dog的中心在(5,2)这个位置,这个位置就负责dog的训练。
测试时,是由每个格网生成2个bbox,一共98个bbox,进行回归的。
这里写图片描述
这幅图对YOLO的检测模式有一个比较形象的表示。YOLO的输出为一个7x7x30的张量。其中输出值中,每个格网1x30,表示image上对应格网的bbox值。
前5个值,表示第一个bbox的变量:
(1) x,y:表示bbox的中心在当前格网的位置相对于格网尺寸的比例
(2) w,h: 表示bbox的宽和高相对整幅图像的比例
(3) confidence: 置信度,反映bbox是否包含object,以及bbox位置预测有多准。其实也就是IoU反映的是位置预测的准不准。
后5个值,表示第二个bbox的变量。
这里写图片描述
confidence的计算公式:Pr表示包含object的概率,包含则为1,不包含则为0. IoU表示如果包含object,则bbox与GT的IoU。

最后20个值,表示 VOC数据集中20个类每类的score。即每个格网只给出一组打分值,尽管有2个bbox。
score = Pr(class|object),因为有20类,所以有20个值。

测试阶段,将这些评价值相乘,进行综合评价,主要体现在位置预测的准不准和类别分的准不准。
这里写图片描述

YOLO模型框架

根据GoogleNet修改,24个卷积层,2个FC层。(注意: yolo v1是有全连接层的,最后的7x7x30是由1470个神经元转化成的)
这里写图片描述

至于训练以及损失函数,就不细说了。

3.评价

YOLO它的思想主要是利用输出的7 x 7的张量来表示image上7 x 7的格网的检测情况。每个格网都有两个anchor可以预测+1组分类。
这样的弊端就是:召回率太低,容易找不全。因为如果两个物体落入一个image格网,YOLO只会给出一个预测(格网中的2个anchor只预测一类)。对小物体的检测自然而然就比较渣了。
另外定位误差大(只有2个anchor,很难将object的位置准确确定)。这样它的平均精度也会比较低

优点就是:没有了region proposal,比较快。(ssd也是把RPN给砍掉了,所以快)。同时一幅图只有98个anchor,也是提高了速度。(但这是牺牲了召回率为代价的)

4.参考文献:

1.https://blog.csdn.net/hrsstudy/article/details/70305791

2018-11-04 18:34:31 weixin_41108334 阅读数 986
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5154 人正在学习 去看看 黄彬彬

一、YOLO v1 (CVPR2016, oral) 将检测作为回归问题

基于end-to-end 网络设计

(You Only Look Once: Unified, Real-Time Object Detection)

可参考文章:https://zhuanlan.zhihu.com/p/27029015

Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO一类的方法慢慢显现出其重要性,这类方法使用了回归的思想,利用整张图作为网络的输入,直接在图像的多个位置上回归出这个位置的目标边框,以及目标所属的类别。

  • 1、YOLO训练和检测均是在一个单独的网络中进行,但是yolo没有rpn等层;
  • 2、YOLO将物体检测作为一个回归问题来解决,输入一张图经过inference便能得到物体的位置和其所属的类别及其相应的置信度。

我们直接看上面YOLO的目标检测的流程图:

(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后非极大值抑制NMS去除冗余窗口即可。

可以看到整个过程非常简单,不再需要中间的Region Proposal找目标,直接回归便完成了位置和类别的判定。

24个卷积层 提取特征,2个全连接层(预测图像位置和类别位置置信度)


小结:YOLO将目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。而且由于每个网络预测目标窗口时使用的是全图信息,使得false positive比例大幅降低(充分的上下文信息)。

7*7*30(30=5+5+20  )=1470

YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。

检测流程

 

  • 1、网络结构设计,预训练 imagenet,图像resize,offset归一化,leaky relu ,网络输出,7*7*30张量 7*7*(2*5+20)=1470

      2个bbox 的 一个(confidence)+4个坐标(x,y,w,h) +20个类的概率值---------》输出result class x ,y w,h ,predict 

  • 2、网络训练:每个bbox 的是否含有物体confidence值:即置信度=包含物体的概率(0或1)乘以IOU

对于每个类的confidence (条件概率): 

  • 3、loss fuction :均方和误差, 分为三个 corrderror,iouerror,classerror ,对于三个的贡献值不同

c帽 w帽 h帽 p帽  真实标注值 

修正3个贡献值不同:1 修正coorderror ,  2 noobji=0.5 包含物体,不包含物体,若相同 不含的confidence=0 放大含的con值,对相等的误差,大物体的误差对检测的影响应小于物体小的误差对检测的影响

但是YOLO也存在问题:没有了Region Proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。

代码难点解析:输出之后 7*7*30 张量后,github yolo tensorflow  

 

 

confident * predict  求出最大值。过滤掉0值。 遍历 再用过滤,非极大值抑制,求出检测结果

---

YOLO 缺陷:

a、由于YOLO中采用了全联接层,所以需要在检测时,读入测试的图像的大小必须和训练集的图像尺寸相同;

b、对小物体检测不敏感。因为虽然每个cell都可以预测出B个bounding box,但是在最终只选择IOU最高的bounding box作为物体检测输出,即:每个cell只能预测出一个物体。当物体较小时,所占画面比例较小,比如图像中包含牲畜群的时候,每个格子kennel包含多个物体,但是最后只能检测出其中的一个。

c、YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。

d、YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。

e、YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。 
 

YOLO 优点:

a、快。YOLO将物体检测作为回归问题进行求解,整个检测网络pipeline简单。在titan x GPU上,在保证检测准确率的前提下(63.4% mAP,VOC 2007 test set),可以达到45fps的检测速度。
b、背景误检率低。YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region proposal的物体检测方法(如rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO对于背景图像的误检率低于fast rcnn误检率的一半。
c、通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

 

 

 

yolo v2 没有整理完全。

二、yolo v2 YOLOv2的论文全名为YOLO9000: Better, Faster, Stronger,cvpr 2017

参考:https://zhuanlan.zhihu.com/p/35325884

在这篇文章中,作者首先在YOLOv1的基础上提出了改进的YOLOv2,然后提出了一种检测与分类联合训练方法,使用这种联合训练方法在COCO检测数据集和ImageNet分类数据集上训练出了YOLO9000模型,其可以检测超过9000多类物体。所以,这篇文章其实包含两个模型:YOLOv2和YOLO9000,不过后者是在前者基础上提出的,两者模型主体结构是一致的。YOLOv2相比YOLOv1做了很多方面的改进,这也使得YOLOv2的mAP有显著的提升,并且YOLOv2的速度依然很快,保持着自己作为one-stage方法的优势,YOLOv2和Faster R-CNN, SSD等模型的对比如图1所示。这里将首先介绍YOLOv2的改进策略,并给出YOLOv2的TensorFlow实现过程,然后介绍YOLO9000的训练方法。近期,YOLOv3也放出来了,YOLOv3也在YOLOv2的基础上做了一部分改进,我们在最后也会简单谈谈YOLOv3所做的改进工作。

图1:YOLOv2与其它模型在VOC 2007数据集上的效果对比

YOLOv2的改进策略

YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。YOLOv2的改进策略如图2所示,可以看出,大部分的改进方法都可以比较显著提升模型的mAP。下面详细介绍各个改进策略。

图2:YOLOv2相比YOLOv1的改进策略

  • Batch Normalization

Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。使用Batch Normalization后,YOLOv2的mAP提升了2.4%。

 

  • High Resolution Classifier

imagenet上的预训练,在微调,图像大小。

目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),由于历史原因,ImageNet分类模型基本采用大小为 224\times224 的图片作为输入,分辨率相对较低,不利于检测模型。所以YOLOv1在采用 224\times224 分类模型预训练后,将分辨率增加至 448\times448 并使用这个高分辨率在检测数据集上finetune。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。所以YOLOv2增加了在ImageNet数据集上使用 448\times448输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。

 

  • Convolutional With Anchor Boxes

在YOLOv1中,输入图片最终被划分为 7\times7 网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。YOLOv2借鉴了Faster R-CNN中RPN网络的先验框(anchor boxes,prior boxes,SSD也采用了先验框)策略。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值(其实是transform值,详细见Faster R_CNN论文,采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中的一个pool层。在检测模型中,YOLOv2不是采用 448\times448 图片作为输入,而是采用 416\times416 大小。因为YOLOv2模型下采样的总步长为 32 ,对于 416\times416 大小的图片,最终得到的特征图大小为 13\times13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以在YOLOv2设计中要保证最终的特征图有奇数个位置。对于YOLOv1,每个cell都预测2个boxes,每个boxes包含5个值: (x, y, w, h, c) ,前4个值是边界框位置与大小,最后一个值是置信度(confidence scores,包含两部分:含有物体的概率以及预测框与ground truth的IOU)。但是每个cell只预测一套分类概率值(class predictions,其实是置信度下的条件概率值),供2个boxes共享。YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,这和SSD比较类似(但SSD没有预测置信度,而是把background作为一个类别来处理)。

使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个边界框( 7\times7\times2 ),而YOLOv2使用anchor boxes之后可以预测上千个边界框( 13\times13\times\text{num_anchors} )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

 

  • Dimension Clusters

在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:

d(box, centroid) = 1 - IOU(box, centroid)

图3为在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框,其相对于图片的大小如右边图所示。对于两个数据集,5个先验框的width和height如下所示(来源:YOLO源码的cfg文件):

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

但是这里先验框的大小具体指什么作者并没有说明,但肯定不是像素点,从代码实现上看,应该是相对于预测的特征图大小( 13\times13 )。对比两个数据集,也可以看到COCO数据集上的物体相对小点。这个策略作者并没有单独做实验,但是作者对比了采用聚类分析得到的先验框与手动设置的先验框在平均IOU上的差异,发现前者的平均IOU值更高,因此模型更容易训练学习。

图3:数据集VOC和COCO上的边界框聚类分析结果

 

YOLO2结构   输入=》448*448*3  输出=》13*13*125

YOLO 2采用神经网络结构,有32层。结构比较常规,包含一些卷积和最大池化,其中有一些1*1卷积,采用GoogLeNet一些微观的结构。其中要留意的是,第25层和28层有一个route。例如第28层的route是27和24,即把27层和24层合并到一起输出到下一层,route层的作用是进行层的合并。30层输出的大小是13*13,是指把图片通过卷积或池化,最后缩小到一个13*13大小的格。每一个格的output数量是125(5*25),5是指对每一个13*13的小格配有5个边框,25则是指每一个边框输出了25个浮点数。25个是YOLO 2对VOC的结构。VOC一共有20个class,在25个数中,有20个是class的probability,剩下的5个中,有四个表示stx、sty、tw、th,这4个来识别边框的位置和大小,还有一个数是confidence,表示边框预测里有真正的对象的概率。所以一共是13*13*125(125=5*(20+5))个数。

YOLO2 Forward 计算边框

现在讲一下怎样把stx、sty、tw、th变成输出边框。如右图所示,里面的σ(tx)可以理解为stx,σ(ty)可以理解为sty。每一个输出的bbox是针对于一个特定的anchor,anchor其实是参考bbox的width及height。对于VOC来讲,产生了5个固定的参考。

如图,给出了stx、sty、tw、th之后,通过简单的公式,就可以计算出最后输出的边框的位置和大小。具体是否要输出当前的边框,它的概率,还有生成的物体的类别,这个取决于后面的probability和confidence。Confidence表示有没有物体,假设有物体之后,probability表示物体的概率

YOLO forward分类

通过将confidence和最大可能输出的类的probability相乘之后,要是得出的结果大于门限0.24,就会输出当前计算出的bbox的大小和位置,同时会输出是哪一个类,probability大小是多少。一共会生成13*13*5个bbox,然后根据probability,通过filter,产生出最后预测的物体和其边框。

2017-05-16 12:04:24 VictoriaW 阅读数 3085
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5154 人正在学习 去看看 黄彬彬

使用训练好的YOLO进行检测

  • 首先安装Darknet
git clone https://github.com/pjreddie/darknet
cd darknet
make
  • 下载预训练得到的权重文件

YOLO的配置文件在./cfg/文件夹下。现在下载预训练网络的权重:

wget https://pjreddie.com/media/files/yolo.weights
  • 运行检测器
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

这个检测命令等价于

./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg

前者是后者的简写形式。

  • 结果

运行检测命令后,会在屏幕上打印下面的信息:

这里写图片描述

这里写图片描述

下面的图片给出了检测时间、检测到的物体以及对应的置信度信息。作者表示用CPU检测时,一张图片大概花费6-12秒,如果是GPU的话会非常快。

这里默认是对./data/dog.jpg图片进行检测,生成检测结果图片为./predictions.png,如下图所示:

这里写图片描述

  • 对多张图片进行检测

如果想对多张图片进行检测,输入如下命令:

./darknet detect cfg/yolo.cfg yolo.weights

这样会出现如下的提示:

这里写图片描述

输入待检测图片的文件名,比如data/person.jpg(一次只能输入一个文件名),这样在检测完这张图片之后会再次出现此提示,接着输入下一张待检测图片文件名。CTRL+C可以退出。

参考

[1] 作者实现

2018-12-07 14:48:42 u010986080 阅读数 5853
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5154 人正在学习 去看看 黄彬彬

YOLO 学习总结

1. 前言


YOLOv1 早已过时,但历史总是重要的,为了完整性,还是记录之前学习的基础,以便总结改进算法时能清晰的定位改进点,学习优化的思想。

此外在深度学习之前,目标检测领域最好的算法就是 DPM(Deformable parts models),简单提一下:

  • 利用了 SIFT 特征等,通过滑动窗口(sliding window)在图像中提出目标区域,然后 SVM 分类器来实现识别。
  • 针对目标物体多视角问题,采用多组件(Component)策略
  • 针对目标物体本身的形变,采用基于图结构(Pictorial Structure)的部件模型策略

后来,在深度学习的帮助下,目标检测任务有了一些进步。对于二维目标检测,主要任务为:

  • 识别,识别图片中的目标为何物
  • 定位,确定目标在图片中的位置,输出预测的边界框

结合识别精度和定位精度,在目标检测中用综合评价指标 mAP 描述模型的好坏;此外,在应用中必须考虑 detection 的实时性,模型在做 detection 时的处理器性能有限,不同于训练时可以用较好的显卡;但是往往 mAP 和实时性在一定程度上,存在对立,举个例子,对于同类型的深度神经网络结构,如果深度越深,一般模型最后达到的 mAP 更高,但深度越深,网络参数越多,实时性降低,有时候就需要在 mAP 和 FPS 之间 trade-off 一下,如果能同时的提升这两个指标,那就 nice 了。YOLO 网络出来的时候,精度不能算顶尖的,但是实时性绝对数一数二,对于很多追求实时性的应用是不错的选择,YOLO 在单 Pascal Titan X GPU上达到 45 FPS ,Tiny-yolo 150FPS,在改进的 YOLOv2, YOLOv3 实时性上稍有提升,在精度上有较大提升,成功挤进几个优秀的目标检测算法行列。

基于深度学习的目标检测算法可以分为两类:

  • Two stage Detection,以 RCNN 为代表,第一阶段由 selective search 生成大量 region proposals,即边界框,将取得的这些 proposal 通过 CNN (文中用的 AlexNet)来提取特征。第二阶段,分类器对上一阶段生成的边界框内的子图像分类,当然 RCNN 也有升级版的 Fast RCNN 和 Faster RCNN。
  • Unified Detection,以 YOLO 和 SSD 为代表,YOLO 直接采用 regression 的方法进行 bbox 的检测以及分类,使用一个 end-to-end 的简单网络,直接实现坐标回归与分类,如论文中的原图:

2. YOLO 如何实现


  • input 一幅图像,分成 SxS 个网格(grid cell),每个 grid cell 边长为单位 1,如果某个 object 的中心落在这个 grid cell 中,该 grid cell 就负责预测这个 object

  • 每个 grid cell 要预测 B 个 bboxes,及其置信度(confidence)

# Pr(object) = 1 bbox 包含 object, Pr(object) = 0 bbox 只包含背景
Pr(object) = bbox 的可能性

# ground-truth 和 predicted bbox 框框的交并比
IOU(truth,pred) = 预测框与实际框的 IOU  

# 定义 confidence 如下,因此置信度包含识别和定位两方面
define confidence = Pr(object)*IOU(truth,pred)

补充1:如何判断一个 grid cell 中是否包含 object 呢? 既一个 object 的 ground truth 的中心点坐标在一个grid cell中。

补充2:如果 grid cell 包含 object 中心时, Pr(object) = 1,那么 confidence = IOU(truth,pred)

  • 此外,YOLO 预测出的 bbox 包含 5 个值 (x, y, w, h, c),下图给出 S=3,图像 size 为 448x448 的例子。
(x, y) = bbox 的中心相对于 grid cell 左上角顶点的偏移值 (wrt. grid cell)
(w, h) = bbox 的归一化宽和高 (wrt. image)
c = confidence,等价于 IOU(truth,pred)
  • 每一个 grid cell 要预测出 C 个类别概率值,表示该 grid cell 在包含 object 的条件下属于某个类别的概率,即 Pr(class-i|object),测试时将该条件概率乘上每个 bbox 的 confidence,得到每个 bbox 属于某个类别的 conf.score(class-specific confidence score)。
class specific confidence score = Pr(classi|object)*confidence
				= Pr(classi|object)*Pr(object)*IOU(truth,pred)
                               = Pr(classi|object)*IOU(truth,pred)
  • 将上述所有预测的值 encode 到 tensor
tensor 的数量 = SxSx(B*5+C)

一幅图像 SxS 个 grid cell,每个 grid cell 预测 B 个 bbox,每个 bbox 包含 5 个值 (x,y,w,h,c),这样就有 SxSxB*5 个值;

另外,每个 grid cell 预测 C 个概率值,这样一幅图像就有 SxSxC 个值概率值;

如下图是 S=3,B=2,C=3 的时候

3. YOLO 网络结构


YOLO 的网络结构看起来比较简单,就像最基础的 CNN结构,卷积层,max 池化层,激活层,最后全连接层。

┌────────────┬────────────────────────┬───────────────────┐
│    Name    │        Filters         │ Output Dimension  │
├────────────┼────────────────────────┼───────────────────┤
│ Conv 17 x 7 x 64, stride=2224 x 224 x 64    │
│ Max Pool 12 x 2, stride=2112 x 112 x 64    │
│ Conv 23 x 3 x 192112 x 112 x 192   │
│ Max Pool 22 x 2, stride=256 x 56 x 192     │
│ Conv 31 x 1 x 12856 x 56 x 128     │
│ Conv 43 x 3 x 25656 x 56 x 256     │
│ Conv 51 x 1 x 25656 x 56 x 256     │
│ Conv 61 x 1 x 51256 x 56 x 512     │
│ Max Pool 32 x 2, stride=228 x 28 x 512     │
│ Conv 71 x 1 x 25628 x 28 x 256     │
│ Conv 83 x 3 x 51228 x 28 x 512     │
│ Conv 91 x 1 x 25628 x 28 x 256     │
│ Conv 103 x 3 x 51228 x 28 x 512     │
│ Conv 111 x 1 x 25628 x 28 x 256     │
│ Conv 123 x 3 x 51228 x 28 x 512     │
│ Conv 131 x 1 x 25628 x 28 x 256     │
│ Conv 143 x 3 x 51228 x 28 x 512     │
│ Conv 151 x 1 x 51228 x 28 x 512     │
│ Conv 163 x 3 x 102428 x 28 x 1024    │
│ Max Pool 42 x 2, stride=214 x 14 x 1024    │
│ Conv 171 x 1 x 51214 x 14 x 512     │
│ Conv 183 x 3 x 102414 x 14 x 1024    │
│ Conv 191 x 1 x 51214 x 14 x 512     │
│ Conv 203 x 3 x 102414 x 14 x 1024    │
│ Conv 213 x 3 x 102414 x 14 x 1024    │
│ Conv 223 x 3 x 1024, stride=27 x 7 x 1024      │
│ Conv 233 x 3 x 10247 x 7 x 1024      │
│ Conv 243 x 3 x 10247 x 7 x 1024      │
│ FC 1-4096              │
│ FC 2-7 x 7 x 30 (1470) │
└────────────┴────────────────────────┴───────────────────┘

对于这个网络结构,需注意到的一些点

  • 为什么最后的输出 size 为 7x7x30 ?因为文中 设置 S=7,B=2,C=20。SxSx(B*5+C)。那么我们需要调整到一个不同的 grid size 时,或者说我们的数据集 class 数量改变时,这时就需要调整 layer 的维度。
  • 这个是 YOLO 的 full 版本,如果想追求更高的检测速度,可以适当减少 conv 层 filter 的数量,或者删掉某些 conv 层,不建议对靠前的 conv 层进行操作,可能会丢掉很多 feature,调整了网络结构后,一定要计算最后的输出是否满足 SxSx(B*5+C)
  • 结构中的 1x1 和 3x3 的 conv. 层,启发来至于 GoogLeNet(Inception)。1x1 卷积的作用
  • 最后一层使用线性激活函数(现在还不太明白为什么最后一层用 f(x)=x 的线性激活?),其他层用 leaky RELU 激活函数。
// darknet activations.h 源码中定义的这两个激活函数
static inline float linear_activate(float x){return x;}
static inline float leaky_activate(float x){return (x>0) ? x : .1*x;}

4. YOLO 损失函数


在理解 YOLO 损失函数之前先思考,目标检测的任务是识别和定位,因此损失函数的设计也是围绕定位误差识别误差来展开,YOLO 模型输出的预测值是 bbox 的坐标 (x, y, w, h) 及置信度(confidence)和对应类别 (class),其中

(x, y, w, h, confidence) 对应定位预测,更细分的话 (x, y, w, h)对应坐标预测
(class) 对应类别预测

YOLO 中采用 sum-squared error 来计算总的 loss,具体如下:

  • part 1,坐标预测产生的 loss。

    其中 ? obj 定义如下:

    ? obj = 1,grid cell i 中包含一个 object 的中心,该 grid cell 中第 j 个预测的 bbox 负责这个 object

    ? obj = 0,otherwise (grid cell i 不包含 object,或者 包含 object,但没有没有预测的 bbox)

    取较大的权重,λ noobj = 5(具体要根据数据集),因为有很多 grid cell 中没有 object,在 part3 中会计算 confidence 的 loss,累计起来可能导致,没有 object 的 grid cells 产生的 loss,比有 object 的 grid cells 产生的 loss 对梯度贡献更大,造成网络不稳定发散。

YOLO 预测每个 grid cell 时可能有多个 bbox。 在训练时,YOLO 只希望一个 bbox 负责 grid cell 对应的 object。 如何只取一个?计算该 grid cell 对应的所有预测的 bbox 与 ground-truth 计算IOU,获得最大 IOU 的那个预测 bbox 成为责任重大的那一个 。为何 w, h 时带根号,文中解释是为了强调 在 large box 产生小的偏差 比 在 small box 产生的偏差 影响要小

  • part 2part 3,confidence 预测产生的 loss。

    其中 ? obj 定义如下:

    ? obj = 1,grid cell i 对应预测的 bbox 中包含 object

    ? obj = 0,otherwise

    ? noobj,与之相反,当 bbox 不包含 object 时,预测的 confidence=0

    因为大部分 bbox 可能没有 object,造成 part2, part3 两部分的 loss 不平衡,因此在 part3 中增加一个更小的权重 λ noobj = 0.5(具体要根据数据集),part2 中则保持正常权重 1

  • part 4, 类别预测产生的 loss。

    ? obj = 1,有 object 中心落在 grid cell i 中

    ? obj = 0,otherwise

    注意这部分并没有惩罚 gridcell 中没有 object 的情况

5. YOLO 训练


这部分后面补充 YOLOv2,YOLOv3 的训练链接在这,训练 YOLOv1 已经没有太多意义。

6. YOLO detection 过程


这部分参考一个很好的 YOLO ppt

以 S = 7,B =2,C=20 为例,既 grid cell 7x7,每个 grid cell 预测 2 个 bboxes,一共有 20 个 classes.

  • 首先直接看 YOLO 模型的输出,如下图,最后输出 7x7x30,grid cell 是 7x7,然后每个 grid cell 要对应 30 个值,前面 10 个 对应 2 个 bboxes 的(x, y, w, h, c),后面 20 个对应 20 个类别的条件概率,将 置信度 与条件概率得到 confidence score。每一个 bbox 对应 20x1 的 confidence score.
  • 遍历所有的 grid cell 就可以的到,如下图。
  • 对预测的 bbox 进行筛选。

    将 score 小于 某个阈值的置0。

    然后根据 score 进行将序排序

    然后用 NMS 进一步筛选掉多余的 bbox.

7. 总结


当时,YOLO 算法与其他 state-of-the-art 的对比

当 R-CNN,Fast R-CNN,Faster R-CNN 等算法一统江湖的时候,要想突出重围,不一定要全面压制,例如 YOLO 系列和 SSD 系列等在实时性上实现了压制,虽然精度上略逊一筹,同样得到了众多目标检测研究者或工作者的青睐。此外,能够看到一个系列的算法一步步优化,很 nice,例如 R-CNN 发展到了 Faster R-CNN,Mask R-CNN等,YOLO 到了 YOLO v3,最重要的还是学习算法优化的思想,多思考。

后面想补充的博客:

  1. R-CNN 系列
  2. SSD 系列,算法原理及实现
  3. YOLOv2, YOLOv3,算法原理以及实现
  4. 深度学习框架

links


others

2017-02-18 21:20:36 JacobKong 阅读数 3572
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5154 人正在学习 去看看 黄彬彬

Abstract

  • 之前的物体检测的方法是使用分类器来进行检测。
  • 相反,本论文将对象检测作为空间分离的边界框和相关类概率的回归问题。
  • 本论文的YOLO模型能达到45fps的实时图像处理效果。
  • Fast YOLO:小型的网络版本,可达到155fps。
  • 与目前的检测系统相比,YOLO会产生更多的定位错误,但是会更少的去在背景中产生false positive。

Introduction

  • DPM: use a sliding window approach where the classifier is run at evenly spaced locations over the entire image.

  • R-CNN: use region proposal methods to first generate potential bounding boxes in an image and then run a classifier on these proposed boxes. 具有slowhard to optimize的缺点。

  • 本论文将目标检测问题重新组织成single regression problem. 从图像像素转为bounding box coordinatesclass probabilities.

  • YOLO框架:

    • A single convolutional network simultaneously predicts multiple bounding boxes and class probabilities for those boxes.
    • YOLO trains on full images and directly optimizes detection performance.
  • YOLO模型的优势:

    • First, YOLO is extremely fast.
    • regression problem.
    • no batch processing on a Titan X.
    • Second, YOLO reasons globally about the image when making predictions.
    • YOLO makes less than half the number of background errors compared to Fast R-CNN.
    • Third, YOLO learns generalizable representations of objects.
  • YOLO在准确性方面依旧落后与其他先进的检测系统,但是可以快速的标注图片中的物体,特别是小物体。

Unified Detection

  • 本论文将物体检测中单独的组件统一到一个单一的神经网络中。网络利用整个图像的各个特征来预测每一个BB。而且同时为一张图片中所有的类预测所用的BB。

  • YOLO可以end-to-end来训练,而且能在保持高平均准确率的同时达到实时要求

  • 系统将输入图片分为SS的网格单元。如果物体的中心落入某个格子,那么这个格子将会用来检测这个物体。

  • 每个网格单元会预测B个bounding box以及这些框的置信值。

  • 每个bounding box会有5个预测值:x,y,w,h和置信值confidence,confidence=Pr(Object)IOUtruthpred.

  • 每个网格单元也预测C个条件类概率,Pr(Classi|Object)在一个网格单元包含一个物体的前提下,它属于某个类的概率。我们只为每个网格单元预测一组类概率,而不考虑框B的数量。

  • 在测试的时候,通过如下公式来给出对某一个box来说某一类的confidence score:

    Pr(Classi|Object)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpred

  • Model示例:

    每个grid cell预测B个bounding boxes,每个框的confidence和C个类概率。

Network Design

  • YOLO网络结构图:

  • 起初的卷积层用来从图像中提取特征。

  • 全连接层用来预测输出的概率和坐标。

  • 24个卷积层,之后跟着2个全连接层

  • 最终输出是7 x 7 x 30的张量。

  • Fast YOLO和YOLO之间所有的训练和测试参数一样。

  • 在ImageNet上进行卷积层的预训练。

Training

  • 在ImageNet上预训练卷积层。预训练前20层卷积层,之后跟随者一个average-pooling layer和一个fully connected layer.

  • 将预训练的模型用来检测,论文Ren et al.显示给与训练好的模型添加卷积和连接层能够提高性能。所以添加了额外的4个卷积层和2个全连接层,其权值随机初始化。

  • 将像素从224x224提升到448x448。

  • 最后一层同时预测class probabilities和bounding box coordinates. 其中涉及到BB的长宽规范化。

  • 由于sum-squared error的缺点,增加边界框坐标预测的损失,并减少对不包含对象的框的置信度预测的损失。

  • large boxes中的偏差matter less than 与small boxes中的偏差。

  • YOLO为每一个网格单元预测多个BB,但是在测试期间,我们只想每一个物体有一个BB预测框来做响应,我们选择具有最高IOU的BB来作为响应框。

  • 总的loss function:

  • 135 epochs

  • batch size:64

  • 动量:0.9

  • decay:0.0005

  • 为防止过拟合,我们使用dropout和extensive data augmentation技术。

Inference

  • 在测试图像中预测检测只需要一个网络评估,与一般的classifier-based methods不同。
  • Non-maximal suppression可以用来修复multiple detections。

Comparison to Other Detection Systems

  • 检测流水线往往开始于提取健壮特征集(Haar, SIFT, HOG, convolutional features),然后分类器或者定位器用来识别特征空间的物体,这些分类器或者定位器往往在整个图像上或者在图像的子区域中滑动窗口。
  • 与DPM的比较。
  • 与R-CNN的比较。每个图片值预测98个bounding boxes。
  • 与其他快速检测器的比较。相比于单类检测器,YOLO可以同时检测多种物体。
  • 与Deep MultiBox的比较。YOLO是一个完整的检测系统。
  • 与OverFeat的比较。OverFeat是一个disjoint的系统,OverFeat优化定位,而非检测性能。需要大量的后处理。
  • 与MultiGrasp的比较。执行比目标检测更简单的任务。

YOLO深度网络

阅读数 316

没有更多推荐了,返回首页