【零基础深度学习教程第八课:目标检测(下)】

一、YOLO算法

1.1 传统目标检测算法缺点

在上一节中介绍的改进算法虽然很好的避免了计算资源的浪费,但是确存在一个致命缺点:无法输出“能最精准地将图片中的对象框出”的边界框,如下图:

在这里插入图片描述
可以发现,无论边界框如何滑动,没有一个能最精准地将图片中的对象框出的边界框,因为最完美的边界框甚至不是正方形(假设图片中的对象是只猫,那么最完美边界框的形状应该跟猫的轮廓重合)

1.2 YOLO算法

1.2.1 算法思想

近几年提出的YOLO算法就能解决上述问题。YOLO算法的目标检测思想是:用一个网格盖住输入图像(网格密度可以手动设置),将目标“识别与定位”算法逐一应用于每一个格子中,最后输出每个格子的预测值(注意:该算法并没有在每个格子中分别跑一次算法,而是只对整张图片跑了一次,这与上一节介绍的改进算法很相似)。我们可以任意控制格子的密度,总有一个格子能最好地框出图片中的目标
例如下图,用一个 3×3 的网格盖住这张图片(现实情况中网格的密度要大得多),然后将目标“识别与定位”算法逐一应用于这 9 个格子中,最后输出每个格子的预测值:

在这里插入图片描述

1.2.2 标签值的构造

对于训练集中标签值的构造:对于图像中的某一个格子,其标签值的构造为(假设只有三个类别需要识别):y = [ Pc bx by bh bw c1 c2 c3 ]T   
而这整张图片中有 9 个格子,每一个格子的标签值都为一个y向量,所以整张图片的标签值应该为 9 个y向量叠加起来的一个 3×3×8 的向量,算法的输出值y^也为 3×3×8 的向量。所以将YOLO算法的过程表示如下
在这里插入图片描述
注:YOLO算法中不包含全连接层,只有卷积与池化(这与上一节介绍的改进算法相似)。

1.2.3 特殊情况说明

假如出现下图中这种情况:
在这里插入图片描述
用一个 2×2 的网格划分图像,但是我们发现:图片中的目标(圆球),在每一个格子中都出现了,那么是否意味着每个格子的输出预测值都是 1 呢?
其实对于这种情况,只需要找到图片中目标的中心点(如上图中标出的圆心),该中心点位于哪个格子中,则这个目标就属于哪个格子中
还有一种情况是一个格子中出现了多个目标的中心点,这种情况之后讨论(由于实际情况中的网格密度很大,格子很小,所以出现这种情况的概率较低)。

二、非极大值抑制(NMS)

非极大值抑制可让yolo算法的输出效果更好,在介绍非最大值抑制之前,先了解一下什么是交并比。

2.1 交并比(IOU)

如何衡量目标检测算法的精准度呢?假设下图中红色框是标签值标记的边界框,紫色框是模型预测的边界框。所谓交并比(Intersection over union),就是计算两个边界框(标签框和预测框)的交集与并集之比:也就是计算下图中黄色部分的面积与绿色部分的面积之比。
在这里插入图片描述
一般 IOU >= 0.5 时就说这个目标检测算法还不错(如果预测框与标签框完美重合,那么IOU=1)。交并比越接近1,说明模型预测准确率越高,所以如何你对模型要求很严格,可以把交并比的阈值设置得高一些,比如0.6甚至0.7。

2.2 目标检测中存在的问题

目标检测算法中存在一个问题:无论使用滑动窗口、特征点搜索还是YOLO的网格定位,在定位时都会出现很多个候选边界框,实际看到的情形就是好多区域的交叉重叠,不知道哪个才是最优边界框,如下图所示:

在这里插入图片描述

例如用YOLO算法对下图中的汽车进行检测,理论上每辆车都只存在一个中心点,那么也就意味这只有两个格子会检测出有车。
但实际情况是模型并不知道这两辆车的中心点具体存在于哪个格子中(因为车的中心点其实是模糊的),所以就会造成对同一辆车检测多次,因为可能不止一个格子检测出其中心点,结果就是出现多个候选边界框。

在这里插入图片描述
如上图所示,三个绿色格子与三个黄色格子中都有可能出现中心点。针对该问题有 3 种传统的解决思路:第一种,选取这些边界框的交集,即公共区域作为最后的最佳边界框;第二种,这些边界框的并集。当然这里也不是只要相交就直接取并集,需要相交的框满足交集占最小框的面积达到一定比例(也就是阈值)才合并;第三种,也就是非极大值抑制。总体来说3种思路都各有千秋,不能一概评论哪种好坏。

2.3 非极大值抑制(NMS)

假设下图是目标检测算法的检测结果:
在这里插入图片描述
注:图中边界框旁边的数字反映了模型预测的准确度,也称为置信度。
由图可知,模型对同一辆车进行了多次检测,得到了多个边界框。而非极大值抑制要做的就是清理这些检测结果,保证最后一辆车有一个边界框。那么具体是怎么清理的呢?以右边这辆车为例:先将置信度最高的边界框取出(0.9这个框),然后依次计算其余的几个框与这个0.9的框的IOU,将IOU较高(通过设定阈值)的框舍弃,然后保留下来的框继续重复上述操作直到最后只剩下一个框:
在这里插入图片描述

三、Anchor boxes

截至目前还有一个问题就是一个格子只能检测出一个对象。如果想让一个格子检测出两个对象,可以通过使用anchor box实现。

3.1 Anchor boxes实现过程

如下图所示,这个人和这辆车的中心点同时存在于一个格子中:

在这里插入图片描述
这种情况下,无法再用 y = [ Pc bx by bh bw c1 c2 c3 ]T 作为输出标签形式,此时需要用到 anchor box,步骤如下:
(1)第一步:定义anchor box
预先定义两个不同形状的anchor box:
在这里插入图片描述
(2)第二步:计算交并比
现在有个问题:哪个 anchor box 对应车,哪个 anchor box 对应人呢?虽然这里很容易看出来,但是实际中当不容易看出来时,只需要计算这两个 anchor box 分别与人的轮廓或车的轮廓交并比即可。例如 anchor box 1 与人的交并比 anchor box 2 与人的交并比大,那么 anchor box 1 就是对应人的。
(3)构造数据集标签
将标签与anchor box关联起来,那么定义的标签形式为:y = [ Pc bx by bh bw c1 c2 c3 Pc bx by bh bw c1 c2 c3 ]T。前八个元素代表 anchor box 1,后八个元素代表anchor box 2。例如这个例子中,该图片的标签值应该为y = [ 1 bx by bh bw 1 0 0 1 bx by bh bw 0 1 0 ]T(假设c1代表人、c2代表汽车、c3代表摩托车)

3.2 特殊情况说明

当出现一个格子中有三个及以上目标的中心点时,anchor box 将不再适用;当一个格子中两个 anchor box 的边界几乎重合时,算法的效果也很差。面对上述两种情况,需另谋他法。
以上就是关于利用 anchor box 实现一个格子检测多个目标的过程。其实在实际中,一个格子出现两个目标中心点的情况很少,特别是使用密度较大的网格进行处理时。

四、YOLO算法整合

4.1 构造数据集

需求:利用yolo算法实现图片中的汽车检测
在这里插入图片描述
使用 3×3 的网格和两个 anchor box,分别计算两个 anchor box 与汽车轮廓的交并比,得出最佳 anchor box。将数据集标签值构造为:y = [ Pc bx by bh bw c1 c2 c3 Pc bx by bh bw c1 c2 c3 ]T
由图可知:前七格与第九格没有目标,所以这八个格子的目标值为:y=[ 0 ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ]T   
第八个格子的数据集目标值为:y=[ 0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0 ]T   
则整张图片的标签值与输出的y^维度都为:3 × 3 × 16

4.2 算法实现

当构造好数据集之后,将其划分出的训练集放入卷积网络进行训练,得到目标检测模型。然后将测试集放入模型得出预测结果:

在这里插入图片描述
当预测结束时,也许对这辆车会生成多个边界框,此时需要利用非极大值抑制进行筛选。

4.3 案例分析

需求:利用 yolo 算法实现目标检测(检测图片中的汽车、行人、摩托)
在这里插入图片描述
(1)第一步:如果使用两个anchor box,那么意味着对这九个格子中的任何一个格子,在执行算法后都会得到两个预测的边界框,如下图
在这里插入图片描述
注:有些anchor box边框可能会超过所预测格子的范围。

(2)第二步:抛弃概率较低的anchor box,得到下图
在这里插入图片描述
(3)第三步:对于每个类别(汽车、行人、摩托),单独运行非最大值抑制进行最终筛选,得到最终的预测结果

在这里插入图片描述
以上就是使用YOLO算法实现目标检测的标准模板,截至目前,YOLO算法仍然是目标检测算法中效果最好的。

五、R-CNN算法简介

5.1 传统目标检测算法缺点

在这里插入图片描述
无论是用传统的滑动窗口检测算法还是YOLO算法对上图进行目标检测,都需要对上图中每个区域进行目标检测(在每个区域运行一遍分类器),但是我们发现:其实这张图片中的绝大部分区域是没有目标的,这也就造成了过多计算资源的浪费。

5.2 候选区域

候选区域在很多文献中被翻译为感兴趣的区域 (Region of Interest, ROI),这是在计算机视觉中非常重要的概念。候选区域是指在一张图片中“比较有可能”出现目标的区域(不是一定会有目标),选出一张图片中的候选区域的方法是对一张图片运行图像分割算法,分割结果如下图所示:
在这里插入图片描述

5.3 R-CNN算法

R-CNN名为带区域的卷积网络,该算法尝试在进行目标检测之前选出一些候选区域,在这些候选区域上运行卷积网络(例如对上图中出现的独立颜色的色块跑卷积分类器)。有时一张复杂的图片可能分割出几千个独立色块,将边界框放置在这些独立色块之上,然后跑分类器,这样的话就可以节约很多计算资源,大大提高算法效率。综上,R-CNN算法的执行过程大致就是:先使用图像分割算法求出候选区域,然后对每个候选区域跑一遍卷积分类算法,每个区域输出一个标签(汽车、行人、摩托)和一个边界框坐标。
虽然R-CNN节约了计算资源,但是目前为止该算法的运行时间依然很长,所以有一系列的研究去改进这个算法,近几年提出了一种名为 “Fast R-CNN” 的算法,极大提高了算法运行速度,它与传统R-CNN的区别就是:快速R-CNN算法用的是滑动窗口的卷积实现(R-CNN用的单纯是滑动窗口)。但是R-CNN算法的一个缺点快速R-CNN仍然没有解决,那就是分割出候选区域的聚类步骤十分缓慢,所以近几年又提出了“Faster R-CNN”,该算法使用卷积网络实现图像分割,取代了使用传统分割算法实现图像分割。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值