介绍
人类可以在几毫秒内在我们的视线中挑选出物体。事实上,你现在就环顾四周,你将观察到周围环境并快速检测到存在的物体,并且把目光回到我们这篇文章来。大概需要多长时间?
这就是实时目标检测。如果我们能让机器做到这一点有多酷?开心的是现在我们就可以做到!主要由于最近在深度学习和计算机视觉方面的突破,我们不仅可以依靠目标检测算法来检测图像中的物体,而且还可以以人类的速度和准确度来实现。
我们将首先看看目标检测的各种细微差别(包括你可能面临的潜在挑战)。然后,我将介绍SlimYOLOv3框架并深入探讨它如何工作以实时检测目标。
什么是目标检测?
在我们深入研究如何实时检测目标之前,让我们首先介绍一下基础知识。如果你是计算机视觉领域初学者,这一点尤为重要。
目标检测是我们用于识别图像中目标位置的技术。如果图像中有单个目标,并且我们想要检测该目标,则称为图像定位。如果图像中有多个目标怎么办?嗯,这就是目标检测!让我用一个例子解释一下:
左侧的图像具有单个目标(狗),因此检测该目标将是图像定位问题。右边的图像有两个目标(一只猫和一只狗)。检测这两个目标则是目标检测问题。
现在,你可能想知道为什么需要目标检测?更重要的是,为什么我们需要执行实时目标检测?我们将在下一节回答这些问题。
目标检测的应用
目标检测现在正在业界广泛使用。任何从事计算机视觉工作的人都应该清楚地了解这些应用。
目标检测的使用范围从个人安全到自动车辆系统。让我们讨论一些当前和无处不在的应用。
自动驾驶
这是目标检测最有趣和最近的应用之一。
自动驾驶汽车是能够在很少或没有人为引导的情况下自行移动的车辆。现在,为了让汽车决定它的行动,即要么向前移动,要么停车,要么转弯,它必须知道它周围所有物体的位置。使用目标检测技术,汽车可以检测其他汽车,行人,交通信号等物体。
人脸检测与人脸识别
人脸检测和识别可能是计算机视觉中应用最广泛的应用。每次在Facebook,Instagram或Google相册上传图片时,它都会自动检测图像中的人物。
行为识别
你会喜欢这个,目的是识别一个或多个图像系列的活动或动作。目标检测是其背后的核心概念,它检测行为然后识别操作。这是一个很酷的例子:
目标计数
我们可以使用目标检测算法来计算图像中的目标数量,甚至是实时视频中的目标数量。计算目标的数量有很多方面,包括分析存储表现或估计人群中的人数。
而大多数应用程序需要实时分析。我们行业的动态性质倾向于即时结果,而这正是实时目标检测的结果。
为什么要进行实时目标检测?
我们以自动驾驶汽车为例。考虑到我们已经训练了一个目标检测模型,它需要几秒钟(比如每个图像2秒)来检测图像中的物体,我们最终将这个模型部署在自动驾驶汽车中。
你觉得这个模型会好吗?汽车能够检测到它前面的物体并采取相应的措施吗?
当然不是!这里的推理时间太多了。汽车将花费大量时间做出可能导致事故等严重情况的决策。因此,在这种情况下,我们需要一个能够为我们提供实时结果的模型。该模型应该能够检测目标并在几微秒内进行推断。
用于目标检测的一些常用算法包括RCNN,Fast RCNN,Faster RCNN和YOLO。
本文的目的不是深入研究这些技术,而是了解用于实时目标检测的SlimYOLOv3架构。当我们不需要实时检测时,这些技术非常有效。不幸的是,当面对实时分析时,他们往往不是很好。让我们来看看在尝试构建自己的实时目标检测模型时可能遇到的一些挑战。
实时目标检测的挑战
实时目标检测模型应该能够感知环境,解析场景并最终做出相应的反应。模型应该能够识别场景中存在的所有类型的目标。一旦识别出目标的类型,模型应该通过在每个目标周围定义边界框来定位这些目标的位置。
所以,这里有两个功能。首先,对图像中的目标进行分类(图像分类),然后使用边界框(目标检测)定位目标。
当我们处理实时问题时,我们可能面临多重挑战:
-
我们如何处理变化?变化可能与物体形状,亮度等有所不同。
-
部署目标检测模型。这通常需要大量的内存和计算能力,特别是在我们每天使用的机器上
-
最后,我们还必须在检测性能和实时要求之间保持平衡。通常,如果满足实时要求,我们会看到性能会有所下降,反之亦然。因此,平衡这两个方面也是一个挑战
那么我们如何克服这些挑战呢?好吧,这是文章的关键所在--SlimYOLOv3框架!SlimYOLOv3旨在处理这些限制并以令人难以置信的精度执行实时目标检测。
让我们首先了解SlimYOLOv3是什么,然后我们将介绍架构细节以更好地理解框架。
SlimYOLOv3介绍
你能猜出深度学习管道是如何工作的吗?以下是典型流程的基本摘要:
-
首先,我们设计模型结构
-
微调该模型的超参数
-
训练模型
-
最后评估模型
模型中有多个组件或连接。经过几次迭代后,其中一些连接变得多余,因此我们可以从模型中删除这些连接。删除这些连接称为剪枝。
剪枝不会显着影响模型的性能,并且计算要求将显着降低。因此,在SlimYOLOv3中,在卷积层上执行剪枝。我们将在下一部分中了解有关如何完成此剪枝的更多信息。
剪枝后,我们对模型进行微调以补偿模型性能的下降。
与原始YOLOv3相比,剪枝后的模型导致较少的训练参数和较低的计算要求,因此对于实时目标检测更方便。
现在让我们讨论一下SlimYOLOv3的结构,以便更好,更清楚地理解这个框架底层的工作原理。
了解SlimYOLOv3的结构
下图说明了SlimYOLOv3的工作原理:
SlimYOLOv3是YOLOv3的修改版本。YOLOv3的卷积层被剪枝以实现小和更快的版本。但是等等, 为什么我们首先使用YOLOv3?为什么不用RCNN,Faster RCNN等其他目标检测算法呢?
为什么是YOLOv3?
基本上有两种类型深度目标检测模型:
-
Two-stage detectors
-
属于RCNN系列的探测器属于Two-stage detectors。该过程包含两个阶段。首先,我们提取候选区域,然后对每个候选区域进行分类并预测边界框。这些探测器通常可以提供良好的探测精度,但这些探测器对于候选区域的推断时间需要大量的计算和实时存储
-
-
Single-stage detectors
-
属于YOLO系列的探测器属于Single-stage detectors。这是一个单阶段的过程。这些模型利用预定义的锚点来覆盖图像中的空间位置,比例和纵横比。因此,我们不需要额外的分支来提取候选区域。由于所有计算都在单个网络中,因此它们比Single-stage detectors更可能运行得更快。YOLOv3也是Single-stage detectors,目前是目标检测的最先进技术
-
稀疏训练(Sparsity training)
下一步是YOLOv3模型的稀疏训练:
在这里,我们使用以下步骤剪枝YOLOv3模型:
-
首先,我们评估YOLOv3模型的每个组件的重要性。我将简要讨论如何确定这些组件的重要性的细节
-
一旦评估了重要性,我们就会删除不太重要的组件
移除的组件可以是单独的神经连接或网络结构。为了定义每个组件的重要性,我们根据它们的贡献对网络的每个神经元进行排序。有多种方法可以做到:
-
我们可以采用L1 / L2正则化神经元权重的平均值
-
每个神经元的平均激活
-
神经元输出不为零的次数
在SlimYOLOv3中,基于被认为是缩放因子的L1正则化神经元权重的平均值来计算重要性。这些缩放因子的绝对值是通道的重要性。为了加速收敛并改进YOLOv3模型的泛化,在每个卷积层之后使用批量归一化层。
SlimYOLOv3
然后我们定义一个全局阈值,比如说ŷ,并丢弃任何缩放因子小于此阈值的通道。通过这种方式,我们修剪了YOLOv3架构并获得了SlimYOLOv3架构:
在评估缩放因子时,尚未考虑YOLOv3架构的最大池化层和上采样层。
Fine-tuning
我们现在有SlimYOLOv3模型,那么下一步是什么?我们对其进行微调以补偿性能下降,并最终评估微调模型以确定修剪后的模型是否适合部署。
稀疏训练实际上在减小比例因子方面非常有效,因此使得卷积层的特征通道稀疏。以较大的惩罚因子α= 0.01训练会导致比例因子衰减,并且模型开始过度拟合。
在SlimYOLOv3中,惩罚因子α= 0.0001用于执行通道修建。
结语
我们在本文中介绍了很多内容。我们看到了不同的目标检测算法,如RCNN,Fast RCNN,Faster RCNN,以及目前最先进的目标检测YOLO。
然后,我们介绍了SlimYOLOv3架构,它是YOLO的修改版本,可用于实时目标检测。
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用SlimYOLOv3框架实现实时目标检测 - Python技术站