使用 YOLO 加速实时应用程序中的对象检测 !

文摘   2024-11-11 19:57   广东  


目标检测与计算机视觉有关。目标检测能够在图像和视频中检测到物体的实例。由于其在监控、安全等领域的广泛应用,推动了研究行人不断推导更高效、更具竞争力的算法。

然而,由于实时实现中的动态环境和用于目标检测的复杂算法,在实际应用中仍存在问题。近年来,卷积神经网络(CNN)已成为识别图像内容并解决计算机视觉问题的强大工具。

本文,作者开始简要介绍深度学习和目标检测框架,如卷积神经网络(CNN),YOLOv4的You Only Look Once -版本4。然后作者专注于作者提出的目标检测架构以及一些修改。传统模型在图像中检测到小型物体。

作者对模型进行了一些修改。作者的方法在准确性上给出了正确结果。

1 Introduction

近年来,无人驾驶飞行器(UAVs)得到了极大的发展,并广泛应用于诸如监视、火警检测、侦察、制图以及搜救任务等领域。许多这些应用需要实时观察,但通过UAV图像检测物体存在重大挑战。这些无人机捕获的图像往往质量较差,包括由于UAV运动引起的噪声和模糊。此外,大多数内置摄像头的分辨率较低,使得在图像中识别小目标变得困难。

由于在许多无人机操作中需要近实时目标检测,因此挑战变得更加严峻。研究行人一直在研究如何检测和跟踪特定物体(如车辆、行人和地标),以完成自主导航和安全着陆等任务。一个有前景的解决方案是使用卷积神经网络(CNNs),这是一种专为图像处理设计的深度学习模型。CNNs在图像任务中特别适合,因为它们利用局部感受野和共享权重,允许它们在不受物体精确位置影响的情况下检测图像中的模式。

这些卷积神经网络(CNN)模型通常比传统神经网络更深,通常由多个层组成,这使得它们能够处理复杂的视觉数据。CNN在计算机视觉任务中表现出高度有效性,对于需要实时、高效地执行目标检测的无人机来说,它们是理想的选择。通过识别图像中的模式并在整个图像上进行泛化,CNN在确保无人机任务成功进行目标检测方面发挥着关键作用,即使是在动态或困难的环境中也是如此。

Object Detection

目标检测是一种计算机技术,与计算机视觉和图像处理相关,它处理的是检测某一类语义目标的实例,如人类、建筑物或汽车等。每个目标都有其独特的特征,这些特征有助于分类该类。目标检测利用这些特殊特征。例如,在寻找圆形的目标时,需要寻找距离中心点垂直的圆。在寻找正方形时,需要寻找四个角上垂直且边长相等的正方形。

Need For Object Detection

无人机在人类无法进行创新的地方具有重要意义。获取来自情报、监视和侦察任务的准确、及时的数据已成为现代牵引发展策略的必要组成部分。为了让无人机在这些应用目标检测中发挥作用,跟踪变得至关重要,使其在这些应用中完全自主。空中数据的准确性直接与输入影像的空间分辨率有关,这是使用常规技术检测和定位目标的关键操作。计算机技术的进步导致了强烈和完全自动的生产实践,结合高端计算机和观察设备,可以处理位置精度和影像定向信息,这是常规技术特有的具有挑战性的问题。

Proposed Idea

卷积神经网络(卷积神经网络或CNNs)是一种非常有效的神经网络类别,在诸如图像识别和分类等领域取得了显著的成果。CNNs在识别人脸、物体和交通标志方面非常成功,不仅可以为机器人提供视觉支持,还可以为自动驾驶汽车提供动力。在动态环境中,由于背景和光照的变化,会出现较大的视觉差异,因此需要一种高级的判别模型来准确地将目标与背景区分开。因此,针对这个问题,有效的模型通常在计算上是不可行的。为了解决这两个相互矛盾的挑战,提出了一种使用卷积神经网络(CNNs)的方法,这种方法具有非常强大的判别能力,同时保持了高性能。卷积神经网络可以在多个分辨率上运行,在快速低分辨率阶段可以迅速排除背景区域,并在动态环境中准确评估训练的目标。

CNNs 基本上就是几层卷积运算,这些运算使用非线性激活函数(如 ReLU 或 tanh)应用到结果上。在传统的自馈神经网络中,作者将每个输入神经元连接到下一层的每个输出神经元。这也被称为全连接层(或仿射层)。在 CNNs 中,作者不这样做。相反,作者在输入层上使用卷积来计算输出。这导致了局部连接,其中输入的每个区域都与输出的一只神经元相连。每一层都应用不同的滤波器,通常有数百或数千个,如上述示例中的那些,并将它们的结果结合起来。还有一种被称为池化(子采样)层,但我会稍后详细介绍。在训练阶段,CNN 自动学习根据要执行的任务所需的滤波器的值。例如,在图像分类中,CNN 可能学会从第一层的基本像素中检测边缘,然后使用这些边缘在第二层检测简单的形状,并使用这些形状在更高层检测更高级的特征,如更高层的面部形状。最后一层是一个分类器,它使用这些高级特征。

运动物体跟踪是计算机视觉中的一个具有挑战性的问题,在监控系统、交通监控等许多领域有广泛应用。物体跟踪算法的目标是在连续的视频帧中定位一个运动物体。由于物体具有随机运动,跟踪一个运动物体在视频中的难度加大。尽管已经开发了许多算法并实现了许多物体跟踪的应用,但物体跟踪仍然被认为是完成困难的任务。诸如光照变化、跟踪非刚体物体、非线性运动、遮挡以及实时实现的要求等问题,使得跟踪成为计算机视觉中最具有挑战性的任务之一。在动态背景中跟踪一个运动物体的难题可以分为三个部分:使用图像处理算法进行目标检测,估计物体运动,以及补偿摄像机运动。为了应对检测中的困难,使用了卷积神经网络,检测到的坐标被传递给跟踪器,跟踪器从检测算法中定期获取输入并进行更新。

2 Working of YOLOv4 Algorithm

YOLOv4以其在AP和FPS方面的提升而闻名。YOLOv4优先考虑实时目标检测,训练在单个CPU上进行。YOLOv4在Tesla V100上,COCO数据集上取得了最先进的结果,速度(AP)达到43.5%,性能(FPS)达到65(性能)。这一成就归功于诸如DropBlock正则化、数据增强、Mish激活、跨阶段部分连接(CSP)、自对抗训练(SAT)、加权残差连接(WRC)等特性的结合。

两种类型的模型:一阶段和二阶段目标检测器。在二阶段检测器中,检测分为两个部分:首先检测感兴趣区域,然后对这些区域进行分类,以确定是否存在物体。YOLOv4作为一种单阶段目标检测器,比像R-CNN和Fast R-CNN这样的二阶段检测器更准确且更快。

2.1 Backbone

YOLOv4 使用三种模型作为其 Backbone 。

2.1.1 CSPResNext50

CSPResNext50和CSPDarknet53都是基于DenseNet的模型。CSPResNext50与CSPDarknet53的工作方式类似,并使用CSPNet策略。在考虑COCO数据集时,CSPDarknet53在分类物体方面优于CSPResNext50。CSPResNext50包含16个CNN层,感受野为,参数为20.6百万,而CSPDarknet53包含29个CNN层,感受野为,参数为27.6百万。

2.1.2 CSPDarknet53

这是一款广泛使用的目标检测backbone,采用了DarkNet-53。YOLOv4特别使用了CSPDarknet53作为其backbone。它采用了CSPNet策略,将DenseBlock特征图分为两半并通过跨阶段层次进行合并。第一部分跳过基础层并作为下一个转换层输入,而第二部分则经过DenseBlock处理。这种策略降低了计算复杂度。CSPDarknet53在ResNet模型中的其他版本之上实现了更高的准确率,并提供了出色的性能。

2.1.3 EfficientNet-B3

EfficientNet-B3是一种用于实现最先进准确率的图像分类模型。它重新研究了卷积神经网络的扩展,并基于AutoML。为了创建一个名为EfficientNet-B0的小型网络,开发了AutoML移动框架。Compound Scaling,如名称所示,有助于扩展AutoML Baseline ,从而得到EfficientNet-B1到EfficientNet-B7。

2.2 Neck

YOLOv4 Pipeline 中的第二阶段,即"Neck",收集在backbone中形成的特征,并将它们传递给 Head 进行检测。YOLOv4为这个阶段提供了几种选项:

2.2.1 FPN (Feature Pyramid Networks)

早期的检测器基于从 Backbone 网络中提取的锥形特征层次来预测物体。为了解决有效表示和多尺度特征处理的问题,FPN(Feature Pyramid Network)被引入,它通过自上而下的路径从不同尺度收集特征。

2.2.2 PAN (Path Aggregation Network)

PAN在YOLOv4算法中作为 Neck 被用于增强分割过程,同时保持语义信息,有助于准确地定位图像元素以创建 Mask 。

2.2.3 Properties of PAN

当图像通过神经网络的多个层时,其空间分辨率降低,而特征的复杂性增加,这使得像素级 Mask 识别变得具有挑战性。在YOLOv4中,FPN使用自顶向下的方法将多尺度特征相结合并保留语义定位信息。然而,为大型物体生成 Mask 可能变得复杂,因为信息必须通过多个层。PANet通过使用从下到上的横向连接来解决这一复杂性,从而减轻了FPN的复杂性。它最多包含10层,使其比FPN更简单、更高效。

2.2.4 Adaptive Feature Pooling

早期的技术如Mask-RCNN依赖单个阶段的特征进行预测。然而,使用RIO Align Pooling从上层提取特征有时会产生不准确的结果。PANet通过从所有层提取特征,并对每个特征图进行Align Pooling以提取相关特征,解决了这个问题。

2.2.5 Fully-Connected Fusion

在Mask-RCNN中,全卷积网络被用来在降低参数数量的同时保留空间信息。然而,该模型无法学习如何使用像素位置进行预测,因为参数在所有空间位置上共享。全连接层由于具有位置敏感性,可以适应不同的位置。PANet使用两层的数据来确保精确的预测。

2.2.6 SPP (Spatial Pyramid Pooling)

空间金字塔池化(SPP,Spatial Pyramid Pooling)被用来获取细粒度和粗粒度的信息。它使用不同大小的核()。这些图被结合在一起以产生最终的输出。使用SPP的优势是提高了感受野。无论特征图大小如何,它都可以创建固定大小的特征,使其对物体变形具有鲁棒性。SPP在输入尺度方面也具有灵活性,因为它可以在不同的尺度上提取池化特征。

Head

YOLOv4中的 Head 旨在进行预测,包括边界框的分类和回归。YOLOv4 Head 负责在图像内部确定物体的精确位置和尺寸,同时预测每个物体的类别。与将这些任务分开的模型相比,这种统一方法既提高了速度,又提高了准确性,使得YOLOv4特别适合实时应用。Head 提供有关边界框坐标(x, y, 高度h, 宽度w)的重要信息,这些信息定义了检测物体的位置和大小。此外, Head 还输出每个物体的置信度和预测的类别。

YOLOv4的 Head 构建在YOLOv3架构之上,并引入了优化以获得更好的性能。YOLOv4 Head 中的每个 Anchor 框都进行了潜在目标检测的分析,如果发现目标,模型将优化边界框。YOLOv4的关键特性是其速度与计算效率之间的平衡,使其适合实时应用,如自动驾驶、视频监控和无人机导航。尽管其具有高级功能,但可以在不显著增加计算需求的情况下部署在标准硬件上。

2.4 Anchor Box

Anchor 框被用来在单个帧中检测出大小不一的多个目标,它们都位于同一个单元格中。这与传统的网格不同,网格在每个帧中只检测出一个目标。如果 Anchor 框的数量发生变化,地面 truth 和预测数组的长度也会发生变化。

例如,考虑一个细胞中的 Box ,它有80个预测类别,即[Pc, P1, P2...P80, X1, Y1, X2, Y2],总共85个值。对于这些值,将使用9个 Anchor 框,因此预测结果数组的长度为

2.5 Bag of Freebies in YOLOv4

"Bag of Freebies"指的是在训练期间提高模型性能的技术,同时不增加部署时的推理时间。这些技术通过数据管理和增强策略提高模型准确性。它们通过让模型暴露于模型可能没有遇到的其他各种情况来丰富数据集。数据增强策略有助于泛化模型并提高鲁棒性,使其能从更广泛的情况中学习。

2.6 Bag of Specials in YOLOv4

"Bag of Specials" 包括在推理成本略有增加的情况下,提升后处理和连贯性的技术和模型。然而,这些技术提高了检测器的整体准确性和性能。具体选择哪些技术取决于模型的架构和技术参数,但最终目标是优化和提高整体模型。

3 Tools Required for Detection and Estimation

Software Requirements

Python是一种广泛应用于AI领域的编程语言。它具有简洁易读的语法、丰富的库和模块,以及强大的数据结构和算法支持,使其成为处理和分析大量数据的首选工具。Python在深度学习、自然语言处理、计算机视觉等领域取得了显著的成果,推动了AI技术的飞速发展。

YOLOv4是一种实时目标检测算法,它采用了新的深度卷积神经网络架构,具有更高的检测精度和实时性。与之前的YOLO算法相比,YOLOv4在保持实时性的同时,将检测精度和速度提高了约20%。

YOLOv4的核心创新在于引入了新的卷积层和激活函数,以提高模型的深度和表达能力。此外,YOLOv4还采用了新的损失函数和数据增强策略,以进一步提高检测性能。总体而言,YOLOv4是一种高效、准确的实时目标检测算法,适用于各种场景。

3.1.1 Python

Python是一种开源编程语言,它简化了计算问题的解决。它允许代码一次编写,然后在不同的平台上无修改地执行。Python是一种解释型语言,这意味着它将人类可读的代码在运行时转换为机器可执行的指令。

传统上,解释型语言被称为脚本语言,意味着它们用于简单的任务。然而,现代语言如Python现在用于大规模应用。

3.1.2 Google Colab

Google Colab 使用户可以直接在浏览器中编写和执行 Python 代码,无需任何配置。它为用户提供免费使用 GPU 的权限,并便于代码的共享。Colab 非常适合机器学习、数据分析和教育目的。Colab 笔记本将可执行代码、文本、图像、HTML 和 LaTeX 集成到单个文档中。这些笔记本存放在 Google Drive 中,便于与其他人共享和协作。

3.1.3 Darknet

暗网是一种在互联网上的覆盖网络,需要特殊的软件、配置或授权才能访问。它通常使用定制的通信协议。暗网的主要类型包括社交网络(用于点对点文件共享)和匿名 Agent 网络,如Tor。Tor、I2P和Freenet等技术最初是为了通过确保安全、匿名性和对抗审查来保护数字权利而设计的。这些网络既用于合法活动,也用于非法活动,通过诸如SecureDrop等工具,为举报人、活动人士、记者和新闻机构之间的匿名通信提供便利。

3.1.4 YOLOv4

YOLOv4在平均精确率(AP)和每秒帧数(FPS)方面取得了改进。它优先考虑实时目标检测,并且可以使用单个CPU进行模型训练。在COCO数据集上,YOLOv4在特斯拉V100上实现了最先进的结果,AP达到43.5%,FPS达到65。这些改进归因于诸如DropBlock正则化、数据增强、Mish激活、跨阶段部分连接(CSP)、自对抗训练(SAT)和加权残差连接(WRC)等特性。

4 Train YOLOv4 Custom Object Detector

现在作者将创建一个自定义的YOLOv4目标检测器,用于识别特定类别或目标。

Darknet Setup

首先,从AlexeyAB的GitHub仓库克隆Darknet。克隆后,调整Makefile以启用Darknet的OpenCV和GPU支持。调整完成后,使用Google Colab中的'make'命令构建Darknet。该仓库包含使用YOLOv4算法进行目标检测所需的配置文件。

Gathering and Labeling a Custom Dataset

为了创建一个自定义的目标检测器,您需要一个包含大量图像及其标签的综合数据集,该数据集可以让检测器进行训练。创建此类数据集有两种主要方法:使用Google图像或创建自己的数据集,然后使用标注工具手动对图像进行标签。

4.2.1 Method 1: Using Google's Open Images Dataset

此方法值得推荐,因为它可以在几分钟内收集到成千张带有自动生成的标签的图像。Google的Open Images Dataset与OIDv4工具包相结合,提供了一种快速高效的方式生成带有标签的数据集。该数据集包含了600多个类别的带有标签的图像。

4.2.1.1 Training Dataset

以下是在工具包中使用的命令来生成自定义训练数据集。为了获得最佳准确性,我选择了1500张图像,但总体来说,使用的图像越多,模型的准确性就越高。

4.2.1.2 Validation Dataset

验证数据集对于在训练后测试自定义目标检测器至关重要。OIDv4工具包提供了单独的图像用于验证,以确保训练和验证数据集之间没有重叠。您可以运行与训练数据集相同的所有命令,但出于验证目的。建议验证数据集的大小约为训练数据集的20-30%。例如,如果使用了1500张图像进行训练,那么验证数据集应该包含大约300张图像。(1500的20%等于300张)。

4.2.1.3 Converting Labels to YOLOv4 Format

默认情况下,OIDv4工具包生成的标签不是YOLOv4格式。然而,可以通过几个简单的命令轻松地进行转换。首先,在OIDv4_Toolkit文件夹的根目录中打开'classes.txt'文件,并编辑该文件以包括您刚刚下载的类,每行一个类。

接下来,运行convert_annotations.Python文件,将OIDv4标签转换为YOLOv4格式。此过程将转换训练和验证数据集的标签。

4.2.2 Method 2: Manually Labeling Images with Annotation Tool

如果您在Google的Open Images Dataset中找不到所需的图像或类别,您需要使用标注工具手动 Token 您的图像。这是一个耗时较长的工作。在之前的教程中,我展示了如何从Google Images大量下载图像,并使用LabelImg,这是一个标注工具,为YOLOv4创建自定义数据集。按照这些步骤进行操作后,您应该会得到一个包含训练和验证数据集的文件夹,如下所示。

Moving Your Custom Datasets Into Your Cloud VM

一旦您的数据集已正确格式化以用于训练和验证,您需要将它们移动到您的云虚拟机中。我建议将包含您的训练图像和文本文件的文件夹重命名为'obj',然后将其压缩成一个名为'obj.zip'的'.zip'文件。接下来,将'.zip'文件上传到您的Google Drive。同样为验证数据集执行此操作,命名为'test'。现在您应该已经在Google Drive中拥有'obj.zip'和'test.zip'两个文件夹。这将显著减少将您的数据集传输到云虚拟机所需的时间。一旦上传,您可以在云虚拟机中复制并解压缩文件。

Configuring Files for Training

接下来需要配置训练所需的文件:自定义的.cfg文件、'obj.data'、'obj.names'、'train.txt'和'test.txt'。在编辑这些文件时,需要非常小心,因为即使是轻微的错误也可能在训练期间造成重大问题。

4.4.1 Configuration File (Cfg File)

《yolov4.cfg》文件必须复制到您的Google Drive进行编辑。使用文本编辑器打开文件,并根据您的自定义目标检测器的需求进行必要的调整。您可以使用Google Drive内置的文本编辑器通过双击'yolov4-obj.cfg'并从下拉菜单中选择“使用文本编辑器打开”来编辑配置。

为获得最佳结果,请设置 'batch=64' 和 'subdivisions=16'。如果您遇到任何问题,请将 'subdivisions' 增加到 32。根据您要训练的检测器类别数量,其他更改也会有所不同。将 'max_batches' 设置为 6000,将 'steps' 设置为 4800、5400。在三个 YOLO 层中的三个 'classes' 参数应更改为 '1',并将三个在 YOLO 层之前的卷积层中的 'filters' 参数调整为 18。

为了配置网络大小,请设置'width=416'和'height=416'(或任何32的倍数)。'max_batches'的值应计算为

但是它不应小于6000。例如,如果训练1-3个类别,'max_batches'应设置为6000,但如果训练5个类别,它应设置为10000。'steps'应设置为80%和90%的'max_batches'。例如,如果'max_batches = 10000',那么'steps'应设置为8000和9000。对于'filters',计算其值为

例如,如果训练1类,设置'filters=18';如果训练4类,设置'filters=27'。

如果您在训练过程中遇到内存问题或发现训练过程过于缓慢,请将每个YOLO层中的'random=1'更改为'random=0'。这将减少训练时间和内存使用,但会略微降低准确性。

4.4.2 obj.names and obj.data Files

创建一个新的文件,名为obj.names,每行一个类名,与classes.txt中的类名顺序相同。你还将创建一个obj.data文件,并按照以下方式填充(根据需要更改类数,以及您的备份位置)。这个备份路径是作者训练过程中保存模型权重的地方。在您的Google Drive中创建一个备份文件夹,并将其正确路径放入此文件中。

4.4.3 Generating train.txt and test.txt

在开始训练作者自定义检测器之前,作者需要以下两个配置文件:train.txt和test.txt。这两个文件分别包含了作者所有训练图像和验证图像的相对路径。作者已经有了可以轻松生成这两个文件的脚本,这些脚本可以访问GitHub仓库。

只需下载这两个文件到您的本地机器,然后将它们上传到您的Google Drive,以便作者在Colab Notebook中使用它们。

现在,只需运行这两个脚本来生成这两个文本文件。如果您不确定生成文件是否成功,并且想要再次检查一切都按计划进行,只需双击File Explorer左边的train.txt,它应该包含每个训练图像路径的一行,就像在下面的图中所示。

Download Pre-trained Weights for the Convolutional Layers

这一步下载了YOLOv4网络卷积层的权重。使用这些权重,您的自定义目标检测器将更准确,训练时间将减少。您不必使用这些权重,但它们将帮助您的模型更快地收敛并变得更准确。

使用上述命令在Colab中下载预训练权重文件。

Train Custom Object Detector

终于到了这一刻。你已抵达真相大白之际。现在,你可以开始训练你定制的YOLOv4目标检测器,该检测器针对你已决定的任何自定义类别。运行以下命令。-dont_show标志阻止图表弹出,因为Colab Notebook无法直接打开图像,而-map标志会在图表上叠加平均精确度,以便查看模型的准确性。只有在有验证数据集的情况下才添加-map标志。

Checking the Mean Average Precision (mAP) of our Model

如果你在训练过程中没有添加-map标志,在训练结束后,你仍然可以通过运行以下命令来获取模型的mAP值:在训练过程中保存的任何权重文件上运行该命令,即可查看该特定权重文件的mAP值。我建议在多个保存的权重文件上运行该命令,以便进行比较并找到具有最高mAP的权重文件,因为这将是最准确的一个。

Run Custom Object Detector

现在作者已经有了一个自定义目标检测器,可以为您制作自己的检测。是时候测试一下了。

为了测试目标检测器,请使用上述命令并提供输入图像路径。它将为输入图像生成检测结果并返回输出。

6 Conclusions

在本项目中,作者成功实现了使用YOLOv4算法实现的实时目标检测系统。通过仔细设置和配置,作者训练了一个能够高效识别特定物体的自定义目标检测器。

YOLOv4算法以其在速度和准确性之间的平衡而闻名,使作者能够在保持适应各种数据集和物体类别灵活性的同时,实现最先进的结果。作者首先设置了Darknet框架并准备数据集,可以通过使用Google的Open Images Dataset或手动 Token 图像来实现。

然后,作者自定义了配置文件,包括yolov4.cfg、obj.names和obj.data,以满足作者的目标检测需求。

此外,作者还整合了预训练权重,以加速训练过程,这显著提高了准确性和降低了总体训练时间。

参考文献

[0]. Accelerating Object Detection with YOLOv4 for Real-Time Applications.

机器学习实战
多名大厂算法工程师共同运营,主要专注机器学习算法、深度学习算法、计算机视觉等领域技术干货分享,一天进步一点点
 最新文章