YOLO算法
简介
本文主要介绍YOLO算法,包括YOLOv1、YOLOv2/YOLO9000和YOLOv3。YOLO算法作为one-stage目标检测算法最典型的代表,其基于深度神经网络进行对象的识别和定位,运行速度很快,可以用于实时系统。了解YOLO是对目标检测算法研究的一个必须步骤。
目标检测思路
目标检测属于计算机视觉的一个中层任务,该任务可以细化为目标定位与目标识别两个任务,简单来说,找到图片中存在某个对象的区域,然后识别出该区域的具体对象是什么。上述这两个过程就是目标检测中很常用的two-stage方法(两阶段检测)。
目标识别(给定一张包含一个目标的图片,该目标占据图片大部分区域,要求识别出图片中目标的类型)属于计算机视觉的基本任务,这些年以卷积神经网络为核心的深度识别网络已经做得很好了。所以剩下的问题就是目标的定位。
当然,目标的定位有个很直接很粗暴的想法:遍历图片中所有可能的位置,搜索不同大小、宽高比的所有区域,逐个检测其中是否存在某个目标,以概率最大的结果作为输出。显然,这种思路也许精度还行,但是效率太低。
RCNN系
RCNN极具开创性地提出了候选区的方法(Region Proposals),先从输入图像中找到一些可能存在对象的候选区,这个过程称为Selective Search。在RCNN中这些候选区大概会有2000个,对这些区域进行目标识别即可完成检测(提出候选区,对候选区进行识别,这就是two-stage的具体两步)。候选区的提出大大减少了目标定位的时间,提高了目标检测的效率。
不过。。。
RCNN依然很慢,它为后来实时检测提供了可能,但也只是可能而已。后续的Fast RCNN和Faster RCNN则将这种可能变为了现实,它们针对网络结构和候选区算法进行了很多改进,已经可以达到平均0.2秒一张图片的速度。由于RCNN系并非本文重点,这里不多赘述,具体其效率变化如下表。
算法 | 平均单图处理时长(second) |
---|---|
RCNN | 49 |
Fast RCNN | 2.3 |
Faster RCNN | 0.2 |
YOLOv1
YOLO算法(全名You Only Look Once,代表只需要看一眼图片就能完成目标检测),其作者为Joseph Redmon,被称为YOLO之父,其本人在2020年初由于自己的开源算法用于军事和隐私问题,宣布退出CV领域。
YOLO创造性地将候选区和目标识别两个阶段合二为一,look once即可完成目标检测,也实现了端到端的目标检测。事实上,YOLO并没有去掉候选区,而是使用一种预定义的类似候选区的预测区域。它将图片划分为$S\times S$个网格(论文中$S=7$,下文均使用7为例),也就是49个网格每个网格允许预测出两个bbox(bounding box,边界框),共98个。也可以理解为预定义了98个候选区。