人类可以在几毫秒内分辨出我们视线内的物体。假如现在你环顾四周,你能很快的了解周围的环境,快速识别出相关目标,即便此刻你正在看这篇文章,也不会花很多时间的。这就是实时目标检测。
假如你想学习实时目标检测技术,但不确定从哪里开始;假如你想要构建一个计算机视觉模型来检测类似于上面视频中的对象目标,那么这篇文章很适合你!
概述
实时目标检测技术正风靡计算机视觉行业
对最新实时目标检测框架SlimYOLOv3的介绍
SlimYOLOv3体系架构研究,包括其底层目标检测原理
前言
人类可以在几毫秒内分辨出我们视线内的物体。假如现在你环顾四周,你能很快的了解周围的环境,快速识别出相关目标,即便此刻你正在看这篇文章,也不会花很多时间的。
这就是实时目标检测。如果我们能让机器也做到这样是不是很酷?感谢最近在深度学习和计算机视觉方面的技术突破,这样的场景我们确实可以实现了。我们不仅可以依靠目标检测算法来检测图像中的目标,还可以使其达到人类的速度和准确度。
real_time_object_detection.mp4
假如你想学习实时目标检测技术,但不确定从哪里开始;假如你想要构建一个计算机视觉模型来检测类似于上面视频中的对象目标,那么这篇文章很适合你!
我们首先会研究目标检测的各种细微差别(包括有可能面临的一些潜在挑战)。然后,我会介绍 SlimYOLOv3 框架,并深入探讨它是如何在底层实时检测目标对象的。
如果你对计算机视觉这个奇妙的领域还不熟悉,也可以到我们为此设计的课程中学习:
目录
什么是目标检测?
目标检测的应用
为什么要实时目标检测?
实时目标检测中的挑战
SlimYOLOv3介绍
了解SlimYOLOv3的架构体系
什么是目标检测?
在深入研究如何进行实时检测目标之前,我们先了解下基础知识。如果你对计算机视觉还比较陌生,这一步尤其重要。
目标检测是一种用于识别图像中目标位置的技术。如果图像中只有一个对象,我们想要检测这个对象,这就是图像定位,如果一个图像中有多个对象怎么办?这就是目标检测!
让我用一个例子来解释一下:
左边的图像只有一个对象(一条狗),因此检测这个对象是一个图像定位问题。右边的图片有两个物体(一只猫和一只狗),检测这两个对象属于目标检测。
如果你想深入了解目标检测,请参考我更全面深入的介绍:
现在,你可能想知道—为什么需要目标检测?更重要的是,为什么我们需要执行实时目标检测?我们将在下面回答这些问题。
目标检测的应用
目前,目标检测在工业中得到了广泛的应用。希望从事计算机视觉相关工作的人都应该熟悉这些应用场景。
目标检测的用例范围从个人安全到自动驾驶系统都有,下面让我们来讨论一些当前比较普遍的应用场景。
自动驾驶汽车
这是目标检测中比较有趣也是比较前沿的应用场景。老实说,这也是我比较感兴趣的方向。
自动驾驶汽车(也称为自动驾驶汽车)是一种能够在很少或没有人类引导的情况下自动行驶的车辆。现在,为了让汽车做出下一步的决策,向前移动或应用刹车或转弯,它必须知道它周围所有物体的位置。利用目标检测技术,车辆可以检测到其他车辆、行人、交通信号等目标。
人脸检测和人脸识别
人脸检测和识别可能是计算机视觉应用最广泛的领域。每次你在 Facebook、Instagram 或谷歌上上传照片时,它都会自动检测照片中的人。这就是计算机视觉在工作中的应用。
行为识别
它的目的是识别一个或多个系列图像的活动或动作。目标检测是其背后的核心概原理,它检测活动并识别动作。
目标计数
我们可以使用目标检测算法来计算图像甚至实时视频中的目标对象数量。计算物品的数量在很多方面都很有帮助,包括分析商店的人流量,或者估算人群中的人数。
这些只是一些流行的目标检测应用场景。在这个行业中涌现出了一大批优秀的公司,所以如果你也知道一些的话,也可以给我们分享。
现在,真实情况是大多数应用场景需要实时分析。这个行业领域的动态特性要求获得即时结果,这就是实时对象检测的作用所在。
为什么需要实时目标检测?
我们以自动驾驶汽车为例。假设我们已经训练了一个对象检测模型,它需要几秒钟(比如每张图像 2 秒)来检测图像中的对象,我们将该模型部署到一辆自动驾驶汽车上。
你认为这辆车怎么样?这辆汽车能够探测到前方的物体并及时采取相应的行动吗?
当然不能!这里的反应时间太长了。汽车花太多的时间进行决策,可能会导致严重的情况,比较交通事故。因此,在这样的场景中,我们需要一个能够提供实时结果的模型。该模型应该能够检测对象并在微秒内做出推断。
一些常用的对象检测算法包括RCNN、Fast RCNN、Faster RCNN和YOLO。
本文的目的不是深入研究这些技术,而是了解用于实时目标检测的 SlimYOLOv3 体系架构。如果你想了解更多关于这些技术的知识,请参考下面的教程:
当我们不需要实时检测时,这些技术非常有效。不幸的是,当面对实时分析的场景时,它们往往达不到预期效果。下面让我们来看看在尝试构建自己的实时对象检测模型时可能遇到的一些挑战。
实时目标检测的挑战
实时目标检测模型应该能够感知环境、解析场景并最终做出相应的决策。模型应该能够识别场景中所有类型的对象。一旦确定了对象的类型,模型应该通过在每个对象周围定义一个包围框来定位这些对象的位置。
这里有两个函数。首先对图像中的对象进行分类(图像分类),然后用一个包围框定位对象(对象检测)。
在处理实时问题时,我们可能会面临多重挑战:
我们如何处理多变性?这些多变性可能在物体的形状、亮度水平等方面存在差异。
部署目标检测模型。这通常需要大量的内存和计算能力,特别是在我们日常使用的机器上。
最后,我们还必须在检测性能和实时需求之间保持平衡。通常,如果满足了实时需求,我们会看到性能下降,反之亦然。因此,平衡这两个方面也是一个挑战。
那么,我们如何才能克服这些挑战呢?这就是本文的关键所在——SlimYOLOv3框架!SlimYOLOv3 旨在处理这些限制,并以惊人的精度执行实时目标检测。
下面我们首先了解下 SlimYOLOv3 是什么,然后我们再研究其体系架构细节,以便更好地理解它。
SlimYOLOv3 介绍
你知道深度学习是如何工作的吗?下面是一个典型的流程:
首先,设计一个模型结构
微调模型的超参数
训练模型
最后,评估优化
模型中有多个组件或连接。其中一些连接,经过几次迭代之后,变得冗余,因此我们可以从模型中删除这些连接。删除这些连接称为修剪。
剪修剪不会显著影响模型的性能,反而对计算能力需求会显著降低。因此,在 SlimYOLOv3 中,对卷积层进行了修剪。修剪后,我们对模型进行微调,以补偿模型性能的下降。
与原YOLOv3模型相比,修剪后的模型可训练参数更少,计算量更小,更便于实时检测目标。
现在来研究下 SlimYOLOv3 的体系结构,以便更好、更清楚地理解这个框架的底层工作原理。
了解 SlimYOLOv3 的体系结构
下图演示了 SlimYOLOv3 的工作原理:
SlimYOLOv3 是 YOLOv3 的演进版本。它对 YOLOv3 的卷积层进行了修剪,以实现更精简、更快的效果。但是我们为什么要使用 YOLOv3 呢?为什么不是其他的目标检测算法像 RCNN 或者 Fast RCNN?
为什么选择 YOLOv3 ?
深度目标检测模型基本上有两种类型(或两类)
两级探测器
RCNN 家族的探测器属于两级探测器。这个过程包括两个阶段。首先,提取区域建议,然后对每个建议进行分类,并预测边界框。这些检测器通常具有较好的检测精度,但是这些带有区域建议的检测器的推理时间需要大量的计算和运行时内存。
单级探测器
YOLO 系列探测器属于单级探测器。这是一个单阶段的过程。这些模型使用预定义的锚,这些锚涵盖了图像的空间位置、比例和纵横比。因此,我们不需要额外的分支来提取区域提案。由于所有的计算都在一个网络中,所以它们比两级检测器运行得更快。YOLOv3 也是一个单级探测器,目前是最先进的目标检测技术。
稀疏性训练
接着进行 YOLOv3 模型的稀疏性训练:
在这里,我们使用以下步骤修剪 YOLOv3 模型:
首先,评估YOLOv3模型每个组件的重要性。后面会有如何确定的细节
一旦评估出了结果,我们就会删除不那么重要的组件
移除的组件可以是单独的神经连接,也可以是网络结构。为了定义每个组件的权重,我们根据它们的贡献对网络中的每个神经元进行排序。有多种方法可以做到:
可以取神经元权值的L1/L2正则化均值
每个神经元的平均激活量
神经元输出的次数不是零
在 SlimYOLOv3 中,权重的计算是基于神经元权值的 L1 正则化均值作为尺度因子。这些尺度因子的绝对值就是信道的权重。为了加快 YOLOv3 模型的收敛速度,提高模型的泛化能力,在每一个卷积层之后都使用了 batch 归一化层。
SlimYOLOv3
然后我们定义一个全局阈值,假设ŷ,丢弃所有通道,有一个比例因子小于这个阈值。通过这种方式,我们修剪了 YOLOv3 架构,得到了 SlimYOLOv3 架构:
在评估比例因子时,没有考虑 YOLOv3 体系结构的 maxpool 层和 upsample 层,因为它们与层数的通道数无关。
微调修正
现在我们有了 SlimYOLOv3 模型,那么接下来要怎样做呢?
我们对其进行微调,以补偿性能的下降,最后评估微调后的模型,以确定修剪后的模型是否适合部署。
稀疏性训练在减小尺度因子,从而使卷积层的特征通道稀疏化方面是非常有效的。用更大的惩罚因子α= 0.01 训练, 会导致尺度因子的积极衰减,模型开始过度拟合。
SlimYOLOv3,α= 0.0001的惩罚因子用于执行通道修剪。
总结
在本文中,我们讨论了很多基础知识。我们了解了不同的目标检测算法,如 RCNN、Fast RCNN、Faster RCNN,以及目前最先进的 YOLO 目标检测算法。然后,我们研究了 SlimYOLOv3 架构,它是 YOLO 的精简版本,可以用于实时目标检测。
我很高兴已经拿到了 SlimYOLOv3 的代码!我将尝试实现 SlimYOLOv3,之后再与你们分享我的经验。
原文链接:
A Friendly Introduction to Real-Time Object Detection using the Powerful SlimYOLOv3 Framework
评论