一周一个小朋友系列——YOLOV1 paper Analysis

脑瓜子嗡嗡的小刘炼丹之路—YOLOV1 paper Analysis

   嘿嘿嘿!脑瓜子嗡嗡的小刘又来了哦,这节课我们讲YOLO1,拿小本本记一下笔记哇。
   老夫掐指一算YOLO(You Only Look Once)从2016-2020,都从V1到V5了,YOLO在众多的开源网络中,属实耐打并且是非常nice的一个网络架构,从YOLO的名字都可以得出作者的强势You Only Look Once,你只需看一次!emmmm,现在对于我来说看YOLOV1的paper是不是有点晚了


(一)、杂七杂八的前言(preface)
   目前主流的object detection分为:

   (1) one stage(一步到位):
    one stage 可以理解为就是分类回归一步到位,只需要一个神经网络就ojbk了。不像RCNN那样需要先使用RPN提取ROI,然后在输入其他网络中做卷积运算。如:YOLO SSD就是这样的网络。
   one stage 速度非常的快,如在YOLO1 的paper里面,Fast-YOLO最快可以达到150frame pre second。但是不可否定的是,鱼和熊掌不能兼得,速度快了,那么鲁棒、泛化能力和精度可能会有所损失,这也是one stage的痛处,但在目前的object detection task 还是可以接受的(现在的目标检测基本上是:数据驱动类型的,半监督类型的)。

    (2) two stage(两步到位):
   可以理解为先采用特殊的方法选出一些相似的分类,这样的过程叫做区域方法(Region Proposal),然后在针对选出来的类别再次进行分类回归。Fast R-CNN就是two-stage。
假设一张图片上有一千个类别,网络就需要做一千次匹配或者更多,这样的网络开销十分的巨大,因此诞生了one stage。
   在看论文的时候,纠结了半天的end to end 是什么意思。(看来对一些名词概念的知晓确实也是欠缺的,学了后面的忘了前面的,过几天写一篇笔记专门记这些)。

   (3) end to end(端到端):
    在object detection(目标检测)中输入为原始数据,输出则是图片类别与置信度结果,这就是end to end(端到端)。
   书面一点解释就是:端到端的算法应用在特征学习时,无需单独处理。而传统模型,需要先提取出特征值再做分类回归任务。如果特征值较多,人工去提取会出现维度灾难,因此就衍生出了端到端的思。(有时候会感觉ML的比DL更加实用)。
    简单来说,就是深度神经网路处理问题不需要像传统模型那样,如同生产线般一步步去处理输入数据,直到输出最后的结果(其中每一步处理过程都是经过人为考量设定好的(“hand-crafted ” function)。

    end to end 提取特征的过程不再需要人工,而且交给了机器,可以理解为半监督吧!!!(因为还是需要人工去掌控一些特征值,以及参数)。其在不同的地方有不同的诠释,有端到端的训练,端到端的模型,端到端的自动驾驶等。这仅只是一个思想,充分理解就好了。
   神经网络的特征如同一个黑盒子一样,你无法去干预,只能调整参数、滤波器和输入的数据特征(input data feature map),因此得到一个鲁棒和泛化能力好的模型,往往考验着算法攻城狮的经验与能力。(而人工智能只是一个概念名词,并不只有DL才是,合理审视好了!)


(二)、推理全文的摘要(Abstract)

   作者设计了一个新的目标检测网络,端到端(end to end)的检测模式,直接将object detection作为回归问题,由一个神经网络去评测整张图像上的bbox和预测的类别的概率。与2016年最先进的检测系统(state-of-the-art detection systems)来比较的话,YOLO在背景预测上有着更少的在假阳性(False positives)并且YOLO在自然图像和实时性等性能优于R-CNN和DPM。
    备注:(模型评估的知识)

    False Positive (FP假阳性) : False(检测模型不能成功的)Positive(判定出结果是Positive);
   False Negative(FN假阴性) : False(检测模型不能成功的) Negative (判定出结果是Negative的);
   True Positive(TP真正例) : True(检测模型成功的) Positive (判定出结果是Positive的);
   True Negative(TN真假例) : True(检测模型成功的) Negative (判定出结果是Negative的)


(三)、吹牛皮的介绍(Introduction)

   无论是在简单和复杂的情况时候,人们在看见图像的时候,也能够快速准确的分辨的出图像中存在的物体,以及位置信息。人类的感官系统是如此的准确和快速,允许人们执行复杂的任务,如:驾驶与有意识的想法。而准确的目标检测算法能够在计算机在没有传感器的情况下也能实习自动驾驶,并且能使用辅助设备能够向人类用户传达实时场景信息,其为通用的机器人系统释放潜力。
   2016年的大多数的检测系统多采用的采用的是分类器来做,如HOG+SVM算法,当然那个时候也涌现了像SSD、Fast R-CNN等网络模型。然而,大多数算法为了检测出目标,都没有采用DL,而是采用ML中的分类器在测试图像不同的位置进行评估,如DMP(Demoucron Malgrange Pertuiset)采用滑动窗口法(sliding window approach)&SVM,通过设置stride(步长)均匀滑动。
   后面提出了与R-CNN的区别以及YOLO的,概括如下:

    1). RCNN采用Region Proposal的方法作为第一阶段来得到bounding box,然后在这些bbox上做classification,之后在细化bbox,消除重复的检测。
    2). YOLO将object detection当作一个Regression问题,直接从图像像素到边界框坐标和类别概率,这里会出现边界框中心坐标的loss和类别的loss,其并不需要,如同DMP算法等设置一些管道,以及对管道优化。
    3). YOLO会对图片进行全面的推理,与Sliding Window & Region Proposal 不同,YOLO训练和测试时候会看见整个图像。神经网络的通性-黑盒-只能看见结果与输入。
    4). YOLO在背景的误检率上比Fast R-CNN少了一半,但是YOLO在小目标的识别定位上明显较差。


图1. The YOLO Detection System

    如图一所示,YOLO处理图像非常的简单直接,先将输入图像调整为448×448,后在图像上运行单个卷积网络,最后将由模型的置信度对所得到的检测进行阈值处理,得出结果,其可以实现端到端的检测。
   其他:!!!
   HOG(Histogram of Oriented Gradients)通过计算和统计局部区域的梯度方向直方图来构成特征,SVM(support vector machine)分类算法非常的一个算法了(面试题!!!),其是一种二分类模型,基本的思想就是求解能够正确划分训练数据并且几何间隔最大的分离超平面。(HOG 在opencv中似乎封装好了)
    R-CNN(Region Convolution Neural Network):R-CNN采样区域提案网络(Region Proposal Network)的方式来筛选bbox,当一张图输入到RPN网络时候,会得到一个二进制(binary)的值P, P∈[0,1],在通过人为设定一个阈值(threshold),来判断P与threshold之间的关系,从而将bounding box与类别初步筛选出来。这些被筛选出来的bbox区域称为感兴趣区域(ROI)。再将这些ROI输入到主干(backbone)或者其他网络中,进行分类定位等过程。


(四)、通俗易懂的检测框架(Unified Detection)

   YOLO将目标检测网络看成一个神经网络,输入图片输出结果(bbox和label信息),其将输入的图片划分为 S ∗ S S*S SS的网格,如果object落入中心网格,则该Grid Cell就负责检测它,YOLO一张图最多可以产生98个bbox,而选择性搜索的存在着2000。
   总结来说可以分为以下4点:
    1). 每个网格预测 B B B个边界框(bounding box)和置信度(confidence
scores),这些置信度反应了模型在边界上的准确率。置信度(confidence)定义公式为: P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU^{truth}_{pred} Pr(Object)IOUpredtruth,当目标不在在网格当中,则置信度为 0 0 0,除此之外,作者希望置信度等于bbox和ground truth的联合交集( I O U = A ∩ B A ∪ B IOU=\frac{A∩B}{A∪B} IOU=ABAB(Intersection Over Union))(写到这里,闻到外面一股炸鸡的香味,哭了!凌晨0点了)
    2). bounding box的介绍:其包含5个部分 x , y , w , h x, y, w, h x,y,w,h和置信度( c c c), ( x , y ) (x,y) (x,y)代表bbox的中心点,其在Grid Cell的位置, w w w h h h表示该bbox的长和宽相对于input image长宽(448)的比例。这四个元素可以还原图中的一个bbox,最后,以预测的置信度来表示预测框(predicted box)与实际边界框(ground truth box)之间的IOU。


图2. Grid division

    3). 同时每一个网格同样还会预测出 C C C个可能的类别概率: P r ( C l a s s i ∣ ( O b i e c t ) ) Pr(Class_i|(Obiect)) Pr(Classi(Obiect)),这些概率以包含目标的网格单元为条件。每个网格单元只预测的一组类别概率(Grid Cell其是针对类别概率的),而不管边界框的的数量 B B B是多少。
    在测试的时候,作者将分类概率和单个盒子的置信度概率进行乘积公式如下:


P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_i|Object) * Pr(Object) * IOU^{truth}_{pred} = Pr(Class_i) * IOU^{truth}_{pred} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth
   该公式为每个框提高了置信度分数,这些score编码了该类出现在框中的概率以及预测拟合目标的程度,即理解为每个bounding box的confidence和每个类别的score相乘,得到每个bounding box属于哪一类的confidence score一般是是会设置threshold或者NMS来滤除一些低概率的框。如下图所示,每个单元格需要预测 ( B ∗ 5 + C ) (B*5+C) (B5+C)个值,而图片划分为 S ∗ S S*S SS,那么最终的预测值就是 ( S × S × ( B ∗ 5 + C ) ) (S×S×(B*5+C)) (S×S×(B5+C))个大小的tensor。
   作者在论文中给出了PASCAL VOC dataset的计算方法,该数据集总共有20个类别,其让 S = 1 , B = 2 S=1,B=2 S=1,B=2则为 7 × 7 × ( 2 ∗ 5 + 20 ) 7×7×(2*5+20) 7×7×(25+20)个tensor。


图3. Model Prediction Structure
4.1、 普普通通的网络结构(Network Design)

    YOLO的模型受到了Google Net图像分类模型的启发,其结构分为24个Conv层(提取image feature)和2个FC层(predict label),卷积层主要使用 1 ∗ 1 1*1 11的卷积来做降维层,然后紧跟着 3 ∗ 3 3*3 33的卷积。对于卷积层和全连接层都采用Leaky ReLU激活函数: M a x ( x , 0.1 x ) Max(x,0.1x) Max(x,0.1x)(修正线性单元,使其变得非线性),但是在最后的一层采用了Linear激活函数,然后reshape输出(本来这里我是想在图片上画出来的,但是算了,这里面在YOLO后面的修改版中,作者加入了batch_normalization)。


图4. The Architecture

    小小的细节(detail):
    1). 网络的输出为 7 × 7 × ( 2 ∗ 5 + 20 ) 7×7×(2*5+20) 7×7×(25+20)的二维的tensor,其shape为(没有anchors机制垃圾): [ b a t c h , 7 × 7 × ( 2 ∗ 5 + 20 ) ] [batch,7×7×(2*5+20)] [batch,7×7×(25+20)],我们可以通过索引切片的方式访问置信度、类别概率和边界框预测结构。对于每一个单元格,前20个元素是类别概率,后面两个是边界框的置信度,两者相乘得到类别置信度,最后的8个元素是边界框的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),而 c c c不考虑进去纯粹是为了计算方便。
    2). YOLO在ImageNet的进行了预训练,主要采用了预训练的分类模型的前20层卷积层,后面添加了4个average-pooling layer和2个fully connected layer(FC层),并且随机初始化了权重。因为检测需要细微的信息,因此将 224 ∗ 224 224*224 224224的图像输入增加到了 448 ∗ 448 448*448 448448
    3). YOLO其最后一层为预测概率和边界框的坐标,通过图像宽度和高度对bbox宽度和高度进行归一化,使其落在[0,1)之间。并且其将边界框的x和y坐标参数,为特定网络单元位置的偏移量,因此其边界也在[0,1)之间。


(五)、损失函数(Loss Function)

    因为YOLO将目标检测当作回归问题,所以采用的是均方差损失函数,但是分类误差和定位误差是权重一样的,会导致模型训练早期发散,因此添加了边界框坐标损失,去减少不包含目标边界框的置信度损失。


图5. Loss Function

      其中表示目标是否出现在网格单元 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj表示网格单元 i i i中的第 j j j个边界框预测器“负责”该预测

    对于定位误差,即边界框坐标预测误差,采用较大的权重, λ c o o r d = 5 λ_{coord}=5 λcoord=5发。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重 λ n o o b j λ_{noobj} λnoobj其它权重值均设为1。然后采用均方误差计算不同大小的box,但是对于较大bbox预测较好,对于小的box预测较差,因此将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为 ( x , y , w , h ) (x,y,\sqrt[]{w}, \sqrt[]{h}) (x,y,w ,h )

    由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标(这里会输出两个bbox进行交并运算)。
    这样设置的虽然将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。可是如果一个单元格内存在多个目标怎么办,这时候YOLO算法就只能选择其中一个来训练,这也是YOLO算法的缺点之一,因此检测多目标属性,遮挡属性时,YOLOV1的效果不佳。并且要注意的一点,对于不存在对应目标的边界框,其误差项就是只有置信度,坐标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。
    YOLO在Pascal VOC 2007&2012上训练设置部分参数为: e p o c h s = 135 , b a t c h s i z e = 64 , m o m e n t u m = 0.9 , d e c a y = 0.0005 epochs = 135,batch_size = 64,momentum =0.9,decay = 0.0005 epochs=135,batchsize=64,momentum=0.9,decay=0.0005,第一个周期的 l r = 1 0 − 3 到 1 0 − 2 lr=10^{-3}到10^{-2} lr=103102,后面就是 l r = 1 0 − 3 lr=10^{-3} lr=103,再到 1 0 − 4 10^{-4} 104。YOLO并没有做太多的数据增强,仅仅只将20%的数据进行了HSV色彩空间转换,并且对图片进行了下采样。而为了避免过拟合,YOLO在第一个FC层后添加了一个dropout层(0.5 rate),YOLO最后的输出,为了消除重复出现的框,采用了非极大值抑制法(Non-maximum suppression: NMS)。

   这里提一个小问题,为什么batch_size要为2的幂?这样做的好处是什么?


(六)、那一年YOLO评估(assessment)

    YOLO刚刚出的时候并没有锋芒毕露,在当时YOLO与许多的目标检测算法进行了对比,大多数的都是停留在传统上,基本上采用:sliding window,haar ,sift,hog,卷积来提取鲁班特征,再输入分类器或定位器中去,以达到识别的效果。而随着神经网络和硬件(GPU&CPU 等)发展越来的的检测采用了DL的方式。作者在paper介绍了许多种方式,有兴趣的可以去读一下原文!(在提升英语水平的同时,也可以熟悉写论文的规则。)

    如下4张图可知(ps:只能在当时这样说啦:):
   图6: 实时性检测,可以的得出Fast YOLO是PASCAL VOC 上速度最快的检测器,而且检测精度是其他系统的两倍。YOLO比Fast YOLO的mAP高10,而且速度远高于实时系统的速度要求。
    图7: 错误分析 Fast R-CNN vs. YOLO 。反映了在各个类别的得分最高的前N个预测中定位错误和背景错误的比例。

图6. Real-Time Systems on PASCAL_VOC2007
图7. Error Analysis: Fast R-CNN vs. YOLO
   图8: VOC 2007的模型组合。作者将各种模型与最佳版本的Fast R-CNN相结合的效果。其他模型和Fast R-CNN结合仅带来了较小的性能提升,而和YOLO结合则带来显著的性能提升。
    图9: PASCAL VOC 2012排行榜。 YOLO是Fast R-CNN + YOLO得分第四高的方法,比快速R-CNN提高2.3%
图8. Model combination experiments on VOC 2007
图9. PASCAL VOC 2012 Leaderboard

(七)、YOLO1的小小终结(summary)

   优点:
    1)、速度快,YOLO1在测试阶段,每张图像只预测772=98个box,所以非常快。
    2)、背景误检率低,因为其是整张图全局进行编码,我感觉比太好。
    3)、在艺术品的检测中效果也好。
    缺点:
    1)、YOLO模型检测小目标效果不佳,其IOU对大的bbox小误差通常是良性的,但是小的bbox小误差就不是很友好,主要原因是不能正确的定位,目标较小,其需要的感受野就可能越小,而YOLO后面是较大的感受野,因此小物体检测效果不佳。
    2). YOLO的每个网格都只能预测两个格子,只能存在一个类别,从而使得YOLO在预测的邻近目标的时候的效果也不好,因为只取置信度大的box。
    3). 泛化能力偏弱。


   YOLOV1存在的问题,作者在后续的网络中都进行了修改,研究算法的魅力往往在他的数据处理,匹配策略和loss函数上。深度学习模型搭建对大哥们来说较为简单,但是这些对我这小菜鸡来说可以喝几壶了,所以大哥们,要是我有什么不对的地方请指正!!!ps:今天又被老师打电话,纠结一个问题:是否实地测试过?其实EI审核都过了,就只要修改几点了,但是这几点属实非常的重要,加油吧,骚年蓝!‍。

参考文献(literature):

    YOLO(You Only Look Once)
    R-CNN(Region Convolution Neural Network)
    Fast R-CNN
    HOG(Histogram of Oriented Gradients)
    SVM(support vector machine)
    关于感受野的计算
    模型评估
    目标检测|YOLO原理与实现

————————————————————————

    脑瓜子嗡嗡的小刘,是某造车新势力的一名自动驾驶图像算法实习生‍。同时小刘也是一枚热衷于人工智能技术的萌新小白。小刘在校期间也参加过许许多多的国内比赛(主要是嵌入式与物联网相关的),要是大哥们有什么问题,可以随时Call me,希望能和大哥们共同进步!!!同时也希望大哥们看文章的时候也能抽空点个赞!谢谢大哥们了!!!(づ ̄ 3 ̄)づ

——————————THE END——————————

你可能感兴趣的:(YOLO系列,算法,神经网络,计算机视觉,卷积神经网络,tensorflow)