目标检测,也叫目标提取,是一种基于目标几何和统计特征的图像分割。它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力。
我们要求检测器输出5个 value:物体类别 class、bounding box 左上角坐标x1、bounding box左上角坐标y1、bounding box 右下角坐标x2、bounding box 右下角坐标y2。
传统算法通常分为三个阶段:区域选择、特征提取和体征分类。
1)区域选取。选取图像中可能出现物体的位置,由于物体位置、大小等信息不确定,因此传统算法通常使用滑动窗口(Sliding Windows)。这种算法会存在大量冗余框,计算复杂度高。
2)特征提取。得到物体位置后,通过人工设计的提取器进行特征提取,如 SIFT、HOG等。由于人工设计的提取器包含的参数少,鲁棒性低,因此特征提取质量并不高。
3)特征分类。根据上一步得到的特征进行分类,通常使用 SVM、AdaBoost 分类器。
深度学习经典检测方法:
1)two_stage(双阶段):Faster-rcnn、Mask-Rcnn系列
2)one-stage(单阶段):YOLO系列
双阶段精度高但速度慢,单精度速度快但精度稍逊。
首先 precisoon 准确率,Recall 召回率计算公式如下:
其中,TP、FP、FN解释如下:
其中:
准确率:预测所有为正的结果中,真正正确的结果的比例。
召回率:所有正例中,被正确预测的比例。
物体检测中的每一个预测结果包含两部分,预测框(bounding box)和置信概率(Pc)。置信概率 Pc 有两层意思,一是所预测 bounding box 的类别,二是这个类别的置信概率。超过阈值的预测框即为检测框。
一般情况下,随着置信阈值的减少,更多的正例预测框被判定为正例,那么召回率会有所提升,但是这必然引入错误检测为正例的负例,从而导致准确率下降。
随着置信阈值的调整,召回率稳步变大,准确率整体减小,局部上下跳动,RP曲线如下图:
AP(Average Precision) 的计算基本等同于计算 PR 曲线下的面积,但略有不同。需要先将 PR 曲线平滑化。方法是,查全率r对应的查准率 p ,取查全率大于等于 r 时最大的查准率 p。即:
平滑后如下:
AP 计算可以定义为经过插值的 precision-recall 曲线与X轴包络的面积。即平滑后的 PR 曲线与 X 轴围成的面积。
mAP 就是计算所有类别的 AP,然后取平均值。
YOLO,You Only Look Once,经典的 one_stage 方法,作者为 Joseph Redmon。把检测问题转换成回归问题,一个 CNN 就可以完成。可以对视频进行实时检测,应用领域非常广。
YOLO-V1 网络结构如下:
输入为的图像。表示图像的大小,表示彩色图像的RGB三通道。 经过24个卷积层提取图像特征,经过2层全连接层回归得到1470位的向量,再经过 reshape 操作得到的 tensor(张量)。输出张量中包含所有预测框的坐标、置信度和类别结果,对其进行后处理即可得到目标检测结果。
检测步骤简介:
1)首先 YOLO 将图像划分为 个 grid cell(网格),在 YOLO-V1 中 。
2)每个 grid cell 可以预测 B 个 bounding box(边界框),在 YOLO-V1 中 。每个 bounding box(边界框) 包含五个参数。其中 为中心坐标, 为高度和宽度,为置信度。bounding box形状大小不定,其中心点位置决定其属于哪个 grid cell。
3)每个 grid cell 可以生成其属于每个类别的条件概率。
4)将每个 bounding box 的置信度乘以其属于每个类别的条件概率,即可以得到其各类别的概率。再经过后处理即可得到目标检测结果。
输出张量组成:
首先,每张图有个 grid cell,即为输出张量的。
每个 grid cell 有两个 bounding box,每个 bounding box有5个参数。即每个 grid cell 共有10个 bounding box 参数。
在 YOLO-V1 中,共有20个类别,故每个 grid cell 还有 20 个类别条件概率。
合在一起即为的张量。
经过前向推断,得到每个 grid cell 的 30 位张量。
用每个 bounding box 的置信度乘以其属于的 grid cell 的类别条件概率,得到其属于每个类别的置信度。
对其中某一个类,首先设定一个置信度阈值,小于阈值的置信度置0,再对所有置信度进行排序,得到结果可视化如下图中位所示:
图中,线框的粗细表示置信度,线框的颜色表示其属于的类别。
再对同类别的预测框进行NMS(Non-Maximum Suppression,非极大值抑制),得到最终检测结果。
NMS(Non-Maximum Suppression,非极大值抑制)
以对狗的检测为例,经过阈值筛选及排序,得到所有 bbox(bounding box)对狗的置信度数据如下:
NMS步骤如下:
1)计算最大置信度的 bbox与每一个 bbox的 IoU。若 IoU 大于某一个阈值则认为其与最大置信度的 bbox 重复检测,将其置信度设置为 0;若小于阈值则将其保留。
2)继续计算第二大置信度不为0的 bbox 与每一个 bbox 的 IoU。重复步骤1),直至计算完所有 bbox,即可得到对狗的检测结果。
对每个类别都进行如上步骤 1)2)计算,即可得到每个类别的检测结果。
在训练阶段,主要是使预测框尽量拟合 ground truth(正确标记的数据),使得损失函数最小化。
图中绿框即为 ground truth。绿框的中心点所落在的 grid cell 需要负责拟合这个绿框,且该 grid cell 输出的类别信息也应该为 ground truth 的类别(这限制了YOLO-V1的目标检测数目,最多识别个目标)。
对于每个 grid cell 共生成两个 bounding box,与 ground truth 交并比(IoU)大的 bbox 负责调整拟合成 ground truth,另一个框尽可能降低其置信度。
图中,由外围绿色虚线框来调整拟合 ground truth 的绿色实线框。
对于 ground truth 中心点没有落在的 grid cell,使其两个 bbox 的置信度都尽可能小。
损失函数(loss function)
基于如上目标,设计损失函数如下:
其中所有参数,带上标的为标注值,不带上标的为预测值。
损失函数共有五项:
1)负责检测物体的 bbox 中心点定位误差。
2)负责检测物体的 bbox 宽高定位误差。(加根号能使小框对误差更敏感)
3)负责检测物体的 bbox confidence(置信度)误差。
置信度预测值:从模型前向推断结果中找到这个 bbox 的置信度。
置信度标签值:计算负责检测物体的 bbox 与 ground truth的 IoU。
4)不负责检测物体的 bbox confidence(置信度)误差。
置信度标签值设置为0。
5)负责检测物体的 grid cell 分类误差。