YOLOV3笔记

  • 发展进程
    • RCNN(2013年)-解决通用多目标捕获问题
      • 第一次提出候选区(Selective Search)的方法
      • 处理模式:先提出候选框再识别对象

      • 利用卷及神经网络来做目标检测的开山之作
      • 解决的问题
        • 1.速度:传统区域选择使用滑窗,每滑一个窗口检测一次,相邻窗口信息重叠度高,检测速度慢。R-CNN使用一个启发式方法(selective search),先生成候选区域再检测,降低信息冗余程度,从而提高检测速度。
        • 2.特征提取:传统手工提取特征鲁棒性差。用神经网络提取特征提升了检测率。
      • 存在问题
        • 1.算力冗余:先生成候选框,再对区域进行卷积。一是候选区域会有一定程度的重叠,对相同区域进行重复卷积;二是每个区域进行新的卷积需要新的存储空间。
        • 2.图片缩放:剪裁(crop)和缩放(wrap)在很大程度上会丢失图片原有的信息导致训练效果不好。
    • SSP NET(2014年 何恺明)
      • SSP(Spatial Pyramid Pooling)是根据R-CNN存在的两个问题而提出的

      • 将原图传到网络中,发现FC层需要确定输入维度,于是就在FC前面定义了一个特殊池化,将输入的任意尺度feature maps 组合成特定维度的输出,这个组合可以不同大小拼凑。
        FCN是同年11月发表的,SSP net 是4月发表的
      • 不仅减少了计算冗余,更重要的是打破了固定尺寸输入这一束缚。
    • Fast-RCNN(2015年)
      • 比RCNN相对来说快一点,提高了一点精度
      • 引用了SSP net的工作
      • 将串行网络改成并行网络

    • Faster—RCNN(2015年) ——检测一张图片在秒以内,反复多次,精度较准
      https://zhuanlan.zhihu.com/p/33981103https://zhuanlan.zhihu.com/p/59398728https://zhuanlan.zhihu.com/p/34142321
      • 针对于 生成候选区域都是用的一系列启发式算法。基于Low Level特征生成区域。这里存在两个问题。
        • 1.生成区域的靠谱程度随缘,而两刀流算法正式依靠生成区域的靠谱程度—生成大量无效区域则会造成算力的浪费、少生成区域则会漏检;
        • 2.生成候选区域的算法是在CPU上运行的而,我们训练在GPU上,跨结构交互必定会有损失效率。
      • 针对这个问题,利用神经网络自己学习生成候选区域。这种方法同时解决了上面的两个问题,神经网络可以学习到更高层。语义、抽象的特征,生成的候选区域的可靠程度大大提高。

      • 在RPNS中引入了anchor,feature map中每个滑窗位置都会生成K个anchors,然后判断anchor覆盖的图像是前景还是背景,同时回归bbox的精确位置,预测的bbox更精确。

    • Mask R—CNN(2017年,何恺明)
      • 加一条通道:发现SSPnet升级为Fast R-CNN时结合了两个loss,也就是说网络输入两种信息去训练,结果精度大大提高了。所以就想到再加一个信息输入,即图像mask。
      • Mask R-CNN 不仅可以做目标检测还可以做语义分割,将两个计算机视觉基本任务融入一个框架,性能有明显提升
    • yolov1——Facebook弄出来的,只看一次,精度不够,偏差大
      • 将候选区和对象识别两个阶段合二为一(看一眼就能知道哪些对象及位置)
      • 过程:
        • 物体中心落在哪个格子,哪个格子负责预测整个物体。
    • SSD——精度和性能上都好于yolov1
    • yolov2——在精度和速度上跟SSD差不多
      • 采用K-means聚类来得到先验框-(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)
    • yolo9000——yolov2的姊妹版,v1,v2是别的物体是有限的,9000就是可以识别9000个物体
    • yolov3——精度速度都很好了
      • 延续使用yolov2的建议框
    • 二维卷积目标检测实现和优化方向包括backbone,IoU、损失函数、NMS、anchor、one shot learning、zero shotlearning等。
    • 最近的发展方向把建议框去掉(free anchor)
  • 基本原理
    • 细节
      • 数据
        • 算出缩放后中心点,宽高
      • 流程
        • 首先通过特征提取网络对输入的图像提取特征,得到一定size的feature map,eg:13*13

        • 遍历特征图中的每一个格子,判断是否有物体的中心点(神经网络猜的)
        • 是中心点的话,就用三种框去框。
          • 中心点偏移量:

          • 上面两个图是网上的做法,秦总的做法如下
          • 求偏移量为啥加log
            • 1.保证w,h为正
            • 2.对比例放大,让小物体检测更准确
            • 3.侦测稳定性更高
          • 反算公式:

          •  
        • 分别与标签做IOU,IOU最大的留下,此时的IOU值就是这个框的置信度
        • 同类别做nms取最大
        • 输出的feature map有3个维度,13*13*[B*(5+C)]
      • 建议框(和yolov2一样用K—means聚类出来的,coco数据集所用的)
        • 9种建议框(三种形状-正方形,竖长方形,横长方形分别三种尺寸)
          • 大图像(52*52)用小尺寸的框,检测较小对象;中等图像(26*26)用中尺寸的框,检测中等对象;小图像(13*13)用大尺寸的框,检测较大对象

        • 也可以用k-means聚类来找框
      • 网络
        • 如图

        • 细粒度图像就是图像所属类别的力度更为精细。eg:你走在大街上看到一条很漂亮的狗狗,但是你不知道这是什么品种。你去花园赏花看到花都很好看很香,但是不知道是什么花。而资深的植物专家来赏花就能知道每种花具体叫什么名字。CV中有专门的研究方向就是细粒度图像分析。
        • 1.卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺寸的检测结果。相比输入图像,这里用于检测的特征图有32倍(5次)的下采样。比如输入416*416的话,这里的特征图就是13*13.由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸较大的对象。
        • 2.为了实现细粒度检测,79层特征图还要做上采样(79层往右开始上采样卷积),然后与61层特征图融合(Concatenation),这样得到91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。适合检测中等尺度的对象。
        • 3.91层特征图再次上采样,并与36层特征图融合(Concatenation),最后得到相对于输入图像8倍下采样的特征图。适合检测小尺寸的对象
        • 主网络只运行一次提取特征,整个网络相当于32*32的卷积
        • darknet-53借用resnet的思想在网络中加入残差,有利于解决深层次网络的梯度问题
        • 整个网络中没有池化和全连接,网络的下采样是通过设置卷积的stride为2来达到的
        • concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。
        • 为什么不在主网络的52*52,26*26和13*13的位置上直接侦测
          • 因为此处的像素融合不够,层次比较浅,直接在此处侦测的是SSD的思想
        • 常用卷积核1*1用的(1,1,0)—表示w,h不变, 3*3用的(3,1,1)—表示w,h不变和(3,2,1)—表示w,h减半
        • 形状
      • 损失函数
        • 置信度损失:预测目标矩形内存在目标的概率,采用Binary Cross Entroy loss配合sigmoid激活函数->直接用BCEWithLogitsLoss。Oi∈{0,1}表示预测目标边框I中是否真实存在目标。
        • 类别损失:多类别交叉熵(采用二值交叉熵是同一目标可以同时归为多类,比如猫可以归为猫类和动物类,这样能够应对复杂场景。但是实践中发现多类别交叉熵损失效果要好一些,因为是统一将识别的目标归为一类,没有同时归属于很多类。)Oij∈{0,1}表示预测目标边界框i中是否真实存在第j类目标
        • 宽高损失:采用的是真实偏差值与预测偏差值差值的平方和MSELoss.
        • 中心点损失:采用BCEWithLogitsLoss在训练中损失之前不用加sigmoid,但是在使用的时候要加上sigimoid,因为这里的中心点是采用索引+偏移的方式,偏移量是小数。
        • output有cell number*B(对第一层是13*13*3)个这样的结构,而ground truth才有目标(假定对一幅图的最大检测目标个数为20个)。13*13*3与20如何做MSE或者交叉熵呢?
          • 常见做法是,对13*13*3作某种grouping算法得出与ground truth相同shape的scalar或者tensor与ground truth比较。但是YOLOV3刚好相反,是为20个找到13*13*3个格子中的20个格子,来安放ground truth,然后把其余格子全部置0。如何找到这些格子呢?
          • 对于width和height这2个维度是比较简单的,就是根据中心点重合。对于depth(即B)这个维度,他是找到与ground truth的bbox有最大iou的anchor box对应的格式。这里有个局限,一个格子只能容纳一个目标。假如一个人坐在一张椅子上中心位置和宽高大小比例都相同,本来同属于一个格子,那么即使打标时打了两个标,在训练时,也只有一个标会生效,后面一个样本会覆盖前面一个样本。从设计上就注定了训练时的这种局限。不过,顶多就浪费一个样本。
        • 训练过程中网络输出特征图中有目标的数量要比没有目标的数量少很多,所以在计算loss时,要将正负样本分开计算,然后乘上一个平衡参数

      • 训练
        • 训练方法
          • 方法一:端到端训练-直接训练
          • 方法二:迁移学习-1,先将主网络加一个softmax训练,然后保存参数(virable 权重的requirable设置为False),再把softmax去掉。2,将参数传到侦测网络中
            • 训练速度尽量小(步长小),尽量用温和的训练器(SGD)
      • 使用
        • 将置信度的阈值设为0.5是先验值。
      • 优化
        • 推迟下采样,下采样可以通过增大卷积步长或者引入pooling层来实现,大步长或者加入pooling会使得feature map变小。一个很直观的想法是,大特征图会带来更高的分类精度,而在网络太靠前的层使用下采样会使后面大部分特征图变小,这个想法在何恺明等人的研究中也得到了证实。之前两个策略已经减少了参数,最后这个策略则是试图在参数受限的情况下恢复精度。

  • 常见问题
    • Q1:为什么输入的图片要是32的倍数
      • 前向过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,eg:stride=(2,2)这就等于将图像的边长缩小一半(面积缩小到原来的1/4),v2中经历5次缩小,将特征图缩小到原输入尺寸的1/2^5,v3和v2一样也将特征图缩小到原输入尺寸的1/2^5。所以通常要输入图片是32的倍数。

    • Q2:为什么输入的图片是416*416
      • 采用416*416大小的图片是因为YOLOv3模型下采样的总步长为32,对于416*416大小的图片,最终得到的特征图大小为13*13,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。
    • Q3:mAP是啥
      • PR曲线
      • AP值
        • Average Precision,即 平均精确度 。
        • 如何衡量一个模型的性能,单纯用 precision 和 recall 都不科学。于是人们想到,哎嘛为何不把 PR曲线下的面积 当做衡量尺度呢?于是就有了 AP值 这一概念。这里的 average,等于是对 precision 进行取平均 。
      • mAP值
        • Mean Average Precision,即 平均AP值 。
        • 是对多个验证集个体 求 平均AP值 。

    • Q4:标签的形状
      • 老师在视频中讲的是5个偏移量加n个类别
      • 但实际应该是5个偏移量加1个类别个数
  • 改进
  • 总体
    • 优点:
      • 1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。
      • 2、YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。
      • 3、YOLO可以学到物体的generalizable representations。可以理解为泛化能力强。
      • 4、准确率高,有实验证明。
      • 5、相对于v2,v3在解决覆盖率高的图像的检测问题效果是十分显著的
    • 缺点:
      • 1、位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
      • 2、YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。
  • PPT流程
    • 历史
      • 目前为止,目标检测大家族主要划分为两大派系,一个是两刀流,一个是一刀流。
        • 两刀流:1,生成可能区域(region proposal)&CNN提取特征;2,放入分类器分类并修正位置。
          • 侧重点在于:准
          • R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
        • 一刀流:直接对预测的目标物体进行回归。代表:YOLO,SSD
          • 侧重点在于:快
    • 概述
      • 应用场景
        • 细粒度图像检索,精准广告,内容推荐,场景分析,图像美颜,相册管理
        • 智能安防:犯人追踪,陌生人进入;智能交通:车流量监测;
      • 改进
        • 1.多尺度预测:解决了对小目标效果不好的问题。v2只有一个侦测,v3有3个侦测。v2单层预测5个bbox,v3是单层3种bbox
        • 2.softmaxloss变成logistic loss,一个目标属于不同类别(女人,人)
        • 3.加深网络:darknet19->darknet53,3*3卷积用于增加通道,1*1卷积用于压缩3*3卷积后的特征
    • 细节
      • 数据
        • 直接压缩成416的
        • 标签多维图
        • 反算加log的作用
      • 建议框多尺度检测
      • 网络
        • 为什么不在主网络的52*52,26*26和13*13的位置上直接侦测
          • 因为此处的像素融合不够,层次比较浅,直接在此处侦测的是SSD的思想
        • 残差网络的作用
        • 特征金字塔?
      • 损失
        • 分类用bce
        • 回归】
        • 中心点bcelogist,中心点偏移量在0-1之间
        • 负样本只做置信度损失是论文里的
        • celoss里自带softmax和onehot?
      • 训练
      • 使用
        • 分类别做nms
  • 参考

 

以上是参考了很多博客的思想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章