目标检测-Yolo框架

时间:2022-11-09 17:53:21

基本概念

目标检测

目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。

计算机视觉中关于图像识别有四大类任务:

(1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

(2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。

(3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。

(4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
目标检测-Yolo框架

目标检测算法分类

基于深度学习的目标检测算法主要分为两类:Two stage和One stage。

1)Tow Stage
先进行区域生成,该区域称之为region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。

任务流程:特征提取 --> 生成RP --> 分类/定位回归。

常见tow stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。

2)One Stage
不用RP,直接在网络中提取特征来预测物体分类和位置。

任务流程:特征提取–> 分类/定位回归。

常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。

目标检测原理

数据表示

经过标记后的样本数据如图所示
目标检测-Yolo框架
预测输出可以表示为:
目标检测-Yolo框架
​其中, p c p_{c} pc为预测结果的置信概率, b x b_{x} bx b y b_{y} by b w b_{w} bw b h b_{h} bh为边框坐标, C 1 C_{1} C1 C 2 C_{2} C2 C 3 C_{3} C3为属于某个类别的概率,通过预测结果,实际结果,构建损失函数,损失函数包括了分类、回归俩部分组成

效果评估

使用IoU(Intersection over Union,交并比)来判断模型的好坏。所谓交并比,是指预测边框、实际边框交集和并集的比率,一般约定0.5为一个可以接收的值。
目标检测-Yolo框架

非极大值抑制(NMS)

NMS也即非极大值抑制。在最近几年常见的物体检测算法(包括rcnn、sppnet、fast-rcnn、faster-rcnn等)中,最终都会从一张图片中找出很多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:

所谓非极大值抑制:依靠分类器得到多个候选框,以及关于候选框中属于类别的概率值,根据分类器得到的类别分类概率做排序,具体算法流程如下:

(1)将所有框的得分排序,选中最高分及其对应的框
(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。(为什么要删除,是因为超过设定阈值,认为两个框的里面的物体属于同一个类别,比如都属于狗这个类别。我们只需要留下一个类别的可能性框图即可。)
(3)从未处理的框中继续选一个得分最高的,重复上述过程。

举例说明:(1)(2),这里设定交并比>=0.6就删除对比框图,留下最高分的框图;对于低于阈值的框图留下,然后在剩下的框图中排序,选出置信度值高的框图,然后重复交并比比较这个过程。
(1)选出Dog这个框图
目标检测-Yolo框架
目标检测-Yolo框架
目标检测-Yolo框架
(1)选出Bike这个框图
目标检测-Yolo框架
目标检测-Yolo框架

Yolov

Yolov1

基本思想

YOLO(You Only Look Once )是继RCNN,fast-RCNN和faster-RCNN之后,Ross Girshick针对DL目标检测速度问题提出的另一种框架,其核心思想是生成RoI+目标检测两阶段(two-stage)算法用一套网络的一阶段(one-stage)算法替代,直接在输出层回归bounding box的位置和所属类别。

之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。

YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各物体检测系统的流程图。
目标检测-Yolo框架
实际上,YOLO并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为77个网格,每个网格允许预测出2个边框,总共492个bounding box,可以理解为98个候选区域,它们很粗略地覆盖了图片的整个区域。YOLO以降低mAP为代价,大幅提升了时间效率。
目标检测-Yolo框架
每个网格单元预测这些框的2个边界框和置信度分数。这些置信度分数反映了该模型对框是否包含目标的可靠程度,以及它预测框的准确程度。置信度定义为:
目标检测-Yolo框架如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU)
每个边界框包含5个预测:x,y,w,h和置信度。( x , y ) (x,y)(x,y)坐标表示边界框相对于网格单元边界框的中心。宽度和高度是相对于整张图像预测的。最后,置信度预测表示预测框与实际边界框之间的IOU。
每个网格单元还预测C CC个条件类别概率Pr ⁡ ( Class i ∣ Object ) 。这些概率以包含目标的网格单元为条件。每个网格单元我们只预测的一组类别概率,而不管边界框的的数量B BB是多少。

网络结构

YOLOv1网络有24个卷积层,后面是2个全连接层。我们只使用1 × 1 1 \times 11×1降维层,后面是3 × 3 3 \times 33×3卷积层。如下图所示:
目标检测-Yolo框架
为了快速实现快速目标检测,YOLOV1还训练了快速版本。快速YOLO使用具有较少卷积层(9层而不是24层)的神经网络,在这些层中使用较少的滤波器。除了网络规模之外,YOLO和快速YOLO的所有训练和测试参数都是相同的。网络的最终输出是7730(1470)的预测张量。
目标检测-Yolo框架

  • 损失函数由坐标预测、是否包含目标物体置信度、类别预测构成
  • 其中 1 i o b j 1^{obj}_{i} 1iobj表示目标是否出现在网格单元i中,表示 1 i j o b j 1^{obj}_{ij} 1ijobj网格单元i中第j个边界框预测器“负责”该预测
  • 如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误;
  • 如果预测器“负责”实际边界框(即该网格单元中具有最高IOU的预测器),则它也仅惩罚边界框坐标错误。
    (5)学习率。第一个迭代周期,慢慢地将学习率从 1 0 − 3 10^{-3} 103提高到 1 0 − 2 10^{-2} 102,然后继续以 1 0 − 2 10^{-2} 102的学习率训练75个迭代周期,用 1 0 − 3 10^{-3} 103的学习率训练30个迭代周期,最后用 1 0 − 4 10^{-4} 104的学习率训练30个迭代周期
    (6)避免过拟合策略。使用dropout和数据增强来避免过拟合。

优点与缺点

(1)优点

  • YOLO检测物体速度非常快,其增强版GPU中能跑45fps(frame per second),简化版155fps
  • YOLO在训练和测试时都能看到一整张图的信息(而不像其它算法看到局部图片信息),因此YOLO在检测物体是能很好利用上下文信息,从而不容易在背景上预测出错误的物体信息
  • YOLO可以学到物体泛化特征

(2)缺点

  • 精度低于其它state-of-the-art的物体检测系统
  • 容易产生定位错误
  • 对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测2个物体
  • 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体处理上还有待加强
  • 每个cell只能预测一个类别,如果重叠无法解决
  • 小物体检测一般,长宽比可选的一般

YOLOV2

与YOLOV1区别

目标检测-Yolo框架

YOLOV2-Batch Normalization

目标检测-Yolo框架

YOLOV2更大的分辨率

目标检测-Yolo框架

YOLOV2网络结构

目标检测-Yolo框架

  • 模型不容易过拟合,因为全连接层容易过拟合
  • 训练速度提高,因为全连接层参数特别多,训练速度慢
  • 每次降采样输出的长和宽变为原来的1/2
  • 使用较小的卷积核做卷积时,一方面使得参数比较少,另一方面使得感受野较大,训练出的模型较好

YOLOV2聚类提取先验框

目标检测-Yolo框架
目标检测-Yolo框架

YOLOV2-Directed Location Prediction

目标检测-Yolo框架
目标检测-Yolo框架

  • V1版本是直接加个偏移量,很容易移出框外
  • V2版本经过seigema函数使其在框框中偏移

感受野

  • 概述来说就是特征图上的点能看到原始图像多大区域
  • 如图11的感受野为55

目标检测-Yolo框架

  • 如果堆叠3个33的卷积层,并且保持滑动窗口的步长为1,其感受野就是77的了,这跟使用一个7*7的卷积核是一样的,那为什么非要堆叠3个小卷积呢
  • 最后一层时感受野太大了,小目标可能丢失,需融合之前的特征

目标检测-Yolo框架
目标检测-Yolo框架

YOLOV3

  • v3版本最大的改进就是网络结构,使其更适合小目标检测
  • 特征做的更细致,融入多持续特征图的信息来预测不同规格的物体
  • 先验框更丰富了,3scale,每种3个规格,一共9个
  • softmax改进,预测多标签任务

多scale

  • 为了检测不同大小的物体,设置了3个scale
    目标检测-Yolo框架

scale变换经典方法

目标检测-Yolo框架

残差连接-为了更好的特征

目标检测-Yolo框架

上面是来自于resnet【1】的skip block的示意图。我们可以使用一个非线性变化函数来描述一个网络的输入输出,即输入为X,输出为F(x),F通常包括了卷积,激活等操作。
当我们强行将一个输入添加到函数的输出的时候,虽然我们仍然可以用G(x)来描述输入输出的关系,但是这个G(x)却可以明确的拆分为F(x)和X的线性叠加。
这就是skip connect的思想,将输出表述为输入和输入的一个非线性变换的线性叠加,没用新的公式,没有新的理论,只是换了一种新的表达。
目标检测-Yolo框架

核心网络架构

  • 没有池化和全连接,全部卷积
  • 下采样通过stride为2实现
  • 3种scale,更多先验框
  • 基本上当前经典算法全融合了
    目标检测-Yolo框架
    目标检测-Yolo框架

迁移学习

迁移学习(Transfer Learning)的基本思想是利用已解决问题的策略去解决待解决的问题(hhh有点绕~),也就是把现有的经验迁移过去。目前是作为机器学习下的一个分支,大多使用神经网络的方法,以训练模型为主了,通常就是那一套模型的参数去做另一套的初始值减少模型训练的复杂度。
但迁移学习提出的初衷不是为了模型训练,而是节省人工标注样本的时间,让模型可以通过已有的标记数据(source domain data)向未标记数据(target domain data)迁移,这样可以减低机器学习对 数据集样本量的需求

目标检测-Yolo框架