系列文章目录
第九章 目标检测中的Yolo v1
目录
4.1 非最大抑制(Non-Maximum Suppression,NMS)
前言
目标检测是找出图像中所有感兴趣的目标,确定他们的类别和位置。
传统的YOLO系列属于Anchor based目标检测中的One stage方法。其中Anchor是预先设定好比例的一组候选框集合。Anchor based方法就是使用Anchor提取候选目标框,在特征图上的每一个点对Anchor进行分类和回归。Two stage表示模型分为两个阶段:第一个阶段使用anchor回归候选目标框;第二阶段使用候选目标框进一步回归和分类,输出最终目标框和对应的类别。One stage无候选框提取过程,直接在输出层回归bbox的位置和类别,速度比两阶段模型块,但是可能造成精度损失。
RCNN系列是两阶段处理模式:先提出候选区,再识别候选区中的对象。RCNN开创性的提出了候选区(Region Proposals)的方法,先从图片中搜索出一些可能存在对象的候选区(Selective Search),大概2000个左右,然后对每个候选区进行对象识别。大幅提升了对象识别和定位的效率。不过RCNN的速度依然很慢,其处理一张图片大概需要49秒。因此又有了后续的Fast RCNN 和 Faster RCNN,针对 RCNN的神经网络结构和候选区的算法不断改进,Faster RCNN已经可以达到一张图片约0.2秒的处理速度。
YOLO的第一个版本由Joseph Redmon等人于2015年提出。YOLO意思是You Only Look Once。YOLO的核心思想就是将目标检测任务转化为一个回归问题。其速度相较于前面的检测算法有非常大的提升,单张图片推理速度达到45帧/秒,Fast YOLO版本可以达到155帧/秒。
一、YOLO v1
1、整体设计
实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将图片划分为 7*7=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49*2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。
1.1 单类别单目标检测任务
单类别单目标检测任务的输出可以使用长度为5的向量(c, cx, cy, w, h)表示。其中c表示目标框中存在目标的概率(也称为目标置信度),(cx, cy)为目标边界框中心坐标,(w, h)为目标边界框尺寸。groundtruth表示为(1, cx0, cy0, w0, h0)。可通过MSE Loss训练网络。
上述方法通过回归获取目标框。对比之下,R-CNN通过滑动窗口,Fast R-CNN通过Selective Search。
1.2 单类别多目标检测任务
个人理解是假设目标数目最多为N,单类别多目标检测任务的输出使用N*5的矩阵表示。其中每一行为一个目标的回归结果,如果当前行的目标置信度c小于阈值,则将认为当前行为过检(对应目标边界框不包含目标)。
1.3 多类别多目标检测任务
每个目标都对应一个目标边界框(c, cx, cy, w, h)。当目标有多个类别的时候,需要将前面的向量(c, cx, cy, w, h)扩充为(c, cx, cy, w, h, class1, class2, ..., classN),其中(class1, class2, ..., classN)表示当前目标边界框内的目标的多分类概率。需要注意的是,仅在c大于阈值的情况,才认为目标存在,此时(class1, class2, ..., classN)才有意义。
1.4 网格划分
为了实现多目标检测,YOLO v1将输入图像划分为S*S的网格区域。如果目标边界框中心落在某一个网格区域,则这个网格区域负责回归目标。也就是说每个网格区域最多对一个目标进行预测,不同的网格区域预测不同的目标。
YOLO v1设计每个网格区域预测B个边界框,不同的predictor可能会更擅长不同领域的预测。最后预测出B个bounding box,选择预测得相对比较准的那个。YOLO v1输出的边界框个数为S*S*B,输出的目标数最多为S*S。
YOLO v1每个边界框包含5个预测值(c, x, y, w, h)。其中c表示预测边界框内是否有目标,(x, y)为目标边界框中心相对网格区域边界的偏移,(w, h)为目标边界框相对整图的尺寸。这五个参数大小均在0-1之间。预测边界框的置信度confidence作者描述为“预测边界框内是否有目标”*“预测边界框与真实边界框的IOU”。
YOLO v1的目标分类是基于网格区域的。不论一个网格区域内有多少个边界框,仅对网格区域预测分类概率,相当于对应一个网格区域所有的边界框共享类别。正因为这个,同个网格区域是没办法预测多个不同类别的目标的。
YOLO v1的输出为S*S*(B*5+C)大小的tensor。
2、YOLO标注
2.1 LabelImg标注结果
YOLO格式的标注文件是txt文件,每行代表一个目标,格式为类别ID x_center y_center width height,其中:
- 类别ID:对应classes.txt中的索引号。
- x_center, y_center:目标框中心点的归一化坐标(相对于图片宽度和高度的比例)。
- width, height:目标框宽度和高度的归一化值。
2.2 标注结果处理
对于一张输入图片,YOLO v1输出为7*7*30张量。首先,输出的 7*7维度对应于输入图片的7*7个网格区域。30对应2个预测边界框的(c, x, y, w, h)和20个类别概率。
- 对标注结果中的每一个目标,计算目标框的真实值(依据x_center,、y_center计算x和y,w=width, h=height)
同样,虽然一个网格区域中会产生2个预测边界框,但我们会选择其中一个作为预测结果,另一个会被忽略。在训练的时候,会选择B个预测边界框中和真实目标边界框IOU最大那个。所以要在训练过程中动态决定到底选择哪一个预测边界框,即该预测边界框的c=Pr(Object)=1且confidence=真实值为预测边界框和真实目标边界框的IOU,另一个预测边界框的c=Pr(Object)=0且confidence=0。
- 计算每一个目标框中心所在的网格。将目标框的真实值和类别真实值替换到对应网格区域位置当标注结果中多个目标的中心落在同一个网格区域的时候,会怎么处理输出?
例如上图中自行车的中心点位于4行3列网格中,所以输出tensor中4行3列位置的30维向量如下图所示。
3、 网络结构
3.1 编码器模块
YOLO使用一个预训练的CNN作为基础网络,通常使用轻量级的神经网络框架Darknet作为默认选择(V5前)。Darknet是一个由YOLO v1作者Joseph Redmon开发的轻量级神经网络框架。
YOLO v1中的Darknet有24层卷积+2层全连接。卷积层在ImageNet分类任务上使用224*224的输入图像进行预训练,预训练模型对应YOLO v1中Darknet的前20层。但是目标检测需要细粒度的图像信息,所以YOLO v1将模型输入分辨率从224*224增大到448*448,也就是将图像resize到统一的448*448大小作为网络的输入。剩余的4个卷积层和2个全连接层使用随机初始化。
最后一层全连接输入维度是4096,输出维度是1470,然后reshape到7*7*30。最后一层网络使用ReLU激活函数,其他层使用Leaky ReLU激活函数。
3.2 loss function
4、推理过程
训练好的YOLO网络,输入一张图片,将输出一个 7*7*30 的tensor。YOLO采用NMS(Non Maximum Suppression)算法提取出最有可能的对象和位置。
在测试的时候,首先计算S*S*B个预测边界框的class-specific confidence score(将网格区域的分类概率乘以预测框的c)。
首先,设置一个阈值,滤掉class-specific confidence score低的预测目标框。对保留的预测目标框进行NMS(Non Maximum Suppression)处理,最终得到目标检测结果。具体的实现方式是将class-specific confidence score低于阈值的设为0。
4.1 非最大抑制(Non-Maximum Suppression,NMS)
为了消除多个重叠的预测结果,YOLO使用非最大抑制算法。该算法会筛选出具有高置信度的预测边界框,并删除与其高度重叠的边界框。Andrew Ng建议每种类别分别进行NMS。
- 对于类别i,一共有S*S*B个class-specific confidence score。找到score最大的那个预测边界框,添加到输出列表
- 对每个score不为0的候选对象,计算其与上面的最大score边界框的IOU。根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0),将低于阈值的添加到输出列表
- 重复执行类别i+1
5、总结分析
现在考虑一个问题:假设类别预测不是共享的,cell中两个predictor都有各自的类别预测,这样能否在一个cell中预测两个目标?
答案是否定的。如果一个cell要预测两个目标,那么这两个predictor要怎么分工预测这两个目标?谁负责谁?不知道,所以没办法预测。而像faster rcnn这类算法,可以根据anchor与ground truth的IOU大小来安排anchor负责预测哪个物体,所以后来yolo2也采用了anchor思想,同个cell才能预测多个目标。
假设一个网格区域内有一大一小两个同类别目标,那么在测试的时候是否能同时检测出这两目标?个人感觉是有可能的。因为训练的时候仅有一个predictor对网格区域的目标负责,而测试的时候没有限制。
6、YOLO v1的优点和不足
优点:
- 假阳性FP低。相比于Fast R-CNN基于局部感兴趣区域训练,YOLO训练和推理的输入均为全局图片。Fast R-CNN将背景误认为目标的过检率较高,对比之下YOLO的过检率降低了一半。
- 端到端(end-to-end)的方法。将目标检测转化为回归问题,网络结构简单,图像输入经过一次网络前向推理就可以预测出最终的边界框及类别
- 速度快,实时性好。能达到45fps,在YOLO-tiny上可以达到155fps。
- YOLO能学习到目标的通用特征。相较于其他之前的检测算法如DPM、R-CNN系列,泛化性能更强。对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
不足:
- 准确度低于当时目标检测的最高精度
- 对于小目标或者密集型群体object的定位效果不好。对于每个格子而言,作者设计只能预测最多B个同种物体。但是最终只选择一个score最高的作为输出,即每个格子最多只得出一个box。如果多个物体的中心落在同一个格子,那么最终可能只预测出一个object。
- YOLO的loss函数中,大物体的IoU误差和小物体的IoU的误差对训练中的loss贡献值接近,造成定位不准确。作者采用了一个去平方根的方式,但还不是最好的解决方法。
- 输入尺寸固定。由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率,其他分辨率需要缩放成此固定分辨率大小。
- 采用了多个下采样层,网络学到的物体特征并不精细,因此对检测效果会有影响。
参考文献
https://arxiv.org/pdf/1506.02640
YOLO: Real-Time Object Detection
GitHub - pjreddie/darknet: Convolutional Neural Networks