logo

图像目标检测概述

wangzf / 2022-07-15


目录

目标检测概述

图像分类、检测、分割是计算机视觉领域的三大任务。

图像分类模型是将图像划分为单个类别,通常对应于图像中最突出的物体:

img

现实世界的很多图片通常包含不只一个物体, 此时如果使用图像分类模型为图像分配一个单一标签其实是非常粗糙的,并不准确。 对于这样的情况,就需要 目标检测模型。目标检测模型可以识别一张图片的多个物体, 并可以定位出不同物体(给出边界框)。目标检测在很多场景有用,如无人驾驶和安防系统。

img

在深度学习正式成为计算机视觉领域的主题之前,传统的手工特征图像算法一直是目标检测的主要方法。 在早期计算资源不发达的背景下,研究人员的图像特征表达方法有限, 只能尽可能的设计更加多元化的检测算法来进行弥补, 包括早期的 SIFT 检测算法HOG 检测算法和后来著名的 DPM 模型等;

深度学习之前的早期目标检测算法的发展历程如下图所示(左边浅蓝色部分):

img

2013 年之后,神经网络和深度学习逐渐取代了传统的图像检测算法而成为目标检测的主流方法。

img

纵观这几年的深度学习目标检测发展历程,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:

目标检测发展

传统方法

在深度学习时代到来之前,研究者们对目标检测的研究路线基本可以分为两个阶段, 先从图像中提取人工视觉特征(如 HOG),再将这些视觉特征输入一个分类器(如支持向量机)中, 最终输出检测结果。从现在的技术眼光来看,这种方法十分粗糙。想做出一个可靠的通过目标检测器, 识别更多、更复杂的物体,则存在很大的困难, 造成这种困难的最根本的原因是难以用一套精准的语言或数学方程来定义世间万物。 显然,要检测的物体种类越多,模型要学会的特征就越多,仅靠人的先验所设计出的特征算子似乎无法满足任务需求了。

R-CNN

2014 年,著名的 R-CNN 问世,不仅大幅提升了当时的基准数据 PASCAL VOC 的 mAP 指标, 同时也吹响了深度学习进军基于视觉的目标检测(object detection)领域的号角。从整体上来看, R-CNN 的思路是先使用一个 搜索算法 从图像中提取出若干 感兴趣区域(region of interest, RoI), 然后使用一个 卷积神经网络(Convolutional Neural Network, CNN) 分别处理每一个感兴趣区域, 提取特征,最后用一个支持向量机来完成最终的分类。

img

通常,搜索算法会先给出约 2000 个感兴趣区域,然后交给后续的 CNN 去分别提取每一个感兴趣区域的特征, 这一过程会十分耗时。为了解决这一问题,在 R-CNN 工作的基础上, 先后诞生了 Fast R-CNN 和 Faster R-CNN 这两个工作,迭代改进了 R-CNN 这一检测框架的各种弊端, 不断完善 R-CNN “先提取,后识别” 的检测范式。这一检测范式后被称为 “两阶段(two-stage)” 检测, 即 先提取出可能包含目标的区域,再依次对每个区域进行识别,最后经过处理得到最终的检测结果

img

YOLO

2015 年,YOLO(You Only Look Once)问世。不同于 R-CNN 的两阶段检测范式,YOLO 的作者团队任务, 提取候选区域(定位)和逐一识别(分类)完全可由一个单独的网络来同时完成,无须分成两个阶段, 不需要对每一个特征区域进行依次分类,从而能够减少处理过程中的大量冗余操作。显然,YOLO 只需要对输入图像处理一次, 即可获得最终的检测结果,因而 YOLO 在检测速度上具有天然的优势。 YOLO 所采用的这种端到端的的检测方式将定位和分类耦合在一起,同步完成,因此,这类工作被称为 “单阶段(one-stage)” 检测。 显然,相较于以 R-CNN 为代表的两阶段检测范式,YOLO 这类单阶段检测框架理应更加高效、简洁。

img

通常情况下,two-stage 框架往往检测精度搞而检测速度却较慢,one-stage 框架则恰恰相反, 往往检测精度较低但检测速度较快。随着检测框架的发展, 如今的 one-stage 检测框架几乎兼具了性能和速度两方面的优势,实现了极为出色的性能上的平衡。

目标检测网络框架

从深度学习时代开始,目标检测网络的框架也逐渐被确定下来。一个常见的目标检测网络往往可以分为三大部分:

img

主干网络(backbone network)

主干网络是目标检测网络中最核心的部分,其关键作用就是提取输入图像中的高级特征, 减少图像中的冗余信息,以便于后续的网络去做深入的处理。在大多数情况下, 主干网络选的成败对检测性能的影响是十分巨大的。

常用的主干网络模型:

颈部网络(neck network)

颈部网络的主要作用是将由主干网络输出的特征进行二次处理。 其整合方式有很多,最为常见的就是 特征金字塔网络(feature pyramid network, FPN), 其核心是将不同尺度的特征进行充分的融合,以提升检测器的多尺度检测的性能。 除此之外,还有很多单独的、可即插即用的模块,如 RFB、ASPP 和 YOLOv4 所使用的 SPP 模块等, 这些模块都可以添加在主干网络滞后,以进一步地处理和丰富特征信息,扩大模型地感受野。

常见的颈部网络

img

img

检测头(detection head)

检测头地结构相对简答,其主要作用就是提取类别信息和位置信息,输出最终的预测结果。 在某些工作里,检测头也被称为 解码器(decoder),这种称呼不无道理, 因为检测头的作用就是从两个部分所输出的特征中提取并预测图像中的目标的 空间位置类别, 它相当于一个解码器。

RetinaNet 采用了“解耦”结构的检测头,这是当前目标检测网络中常用的一种检测头结构, 它由两条并行的分支组成,每一条分支都包含若干层普通卷积、非线性激活函数以及用于最终预测的线性卷积层。

img

目标检测数据集

目标检测常用的数据集包括 PASCAL VOC、ImageNet、MS COCO 等数据集, 这些数据集用于研究者测试算法性能或者用于竞赛。

PASCAL VOC

PASCAL Visual Object Classes

数据下载:

$ sh VOC2007.sh
$ sh VOC2012.sh

数据介绍:

img

MS COCO

Microsoft Common Object in Context, COCO

数据下载:

$ sh COCO2017.sh

数据介绍:

img img

目标检测性能指标

目标检测模型的主要性能指标是检测准确度速度。 对于准确度,目标检测要考虑物体的定位准确性,而不单单是分类准确度。 一般情况下,two-stage 算法在准确度上有优势,而 one-stage 算法在速度上有优势。 不过,随着研究的发展,两类算法都在两个方面做改进。

准确度(accuracy)和速度(speed)是一对矛盾体, 如何更好地平衡它们一直是目标检测算法研究的一个重要方向。

IoU

目标检测问题同时是一个回归和分类问题。

首先,为了评估定位精度,需要计算 IoU(Intersection over Union,介于 0 到 1 之间), 其表示预测框与真实框(ground-truth box)之间的重叠程度。 IoU 越高,预测框的位置越准确。

因而,在评估预测框时,通常会设置一个 IoU 阈值(如 0.5),只有当预测框与真实框的 IoU 值大于这个阈值时, 该预测框才被认定为真阳性(True Positive,TP),反之就是假阳性(False Positive,FP)。

AP 和 mAP

对于二分类,AP(Average Precision)是一个重要的指标,这是信息检索中的一个概念, 基于 precision-recall 曲线计算出来,详情见这里

对于目标检测,首先要单独计算各个类别的 AP 值,这是评估检测效果的重要指标。 取各个类别的 AP 的平均值,就得到一个综合指标 mAP(Mean Average Precision), mAP 指标可以避免某些类别比较极端化而弱化其它类别的性能这个问题。

对于目标检测,mAP 一般在某个固定的 IoU 上计算,但是不同的 IoU 值会改变 TP 和 FP 的比例, 从而造成 mAP 的差异。

FPS

除了检测准确度,目标检测算法的另外一个重要性能指标是速度,只有速度快,才能实现实时检测,这对一些应用场景极其重要。

评估速度的常用指标是每秒帧率(Frame Per Second,FPS),即每秒内可以处理的图片数量。 当然要对比 FPS,需要在同一硬件上进行。另外也可以使用处理一张图片所需时间来评估检测速度, 时间越短,速度越快。

两部走算法系列

two-stage

一步走算法系列

one-stage

纵然两步走的目标检测算法在不断进化,检测准确率也越来越高,但两步走始终存在的速度的瓶颈。 在一些实时的目标检测需求的场景中,R-CNN 系列算法终归是有所欠缺。 因而一步走 (one-stage) 算法便应运而生了,其中以 yolo 算法系列为代表, 演绎了一种端到端的深度学习系统的实时目标检测效果。

yolo 算法系列的主要思想就是直接从输入图像得到目标物体的类别和具体位置, 不再像 R-CNN 系列那样产生候选区域。这样做的直接效果便是快。

目标检测框架

目标检测实现框架

参考