当前位置: 首页 > article >正文

嵌入式与 YOLO 目标检测的完美融合

一、嵌入式结合 YOLO 的背景与意义

传统的大型图像处理设备存在诸多局限性。一方面,这些设备通常体积庞大,难以在实际的应用场景中灵活部署,仅限于在特定的办公室或实验室内使用。获取数据的过程往往耗费很长时间,导致处理图像数据的实时性效率很低。另一方面,大型设备的成本较高,无论是购买还是维护,都需要投入大量的资金和人力。

相比之下,嵌入式结合 YOLO 目标检测具有显著的优势。首先,提高了图像处理的实用效率。嵌入式设备可以更加便捷地部署在各种实际场景中,如智能安防、机器人视觉、工业检测等,能够快速获取图像数据并进行实时处理,大大缩短了数据获取的时间。其次,减少了成本投入。嵌入式设备通常体积小巧、功耗低,相比大型设备,其购买和维护成本更低。同时,YOLO 目标检测算法具有高效、准确的特点,能够在嵌入式设备有限的计算资源下实现快速的目标检测。

例如,在人造草坪生产过程中,传统的断线检测通常依靠人工,不仅效率低下,而且成本较高。而通过构建基于嵌入式结合 YOLO 的视觉检测系统,可以实时检测断线情况。在驻厂一个半月的时间里,根据不同问题对算法进行调整,一代产品已在工厂试运行中,除了白线外,断线识别准确率达到 99%,误报率低于 10%。二代产品计划改用嵌入式主板,算法上用 YOLOv5 代替传统算法,进一步降低成本并提高对复杂环境的适应性。

总之,嵌入式结合 YOLO 目标检测为图像处理提供了一种高效、便捷、低成本的解决方案,在各个领域都具有广阔的应用前景。

二、YOLO 模型下载与准备

一)YOLOv5 源码下载

YOLOv5 v6.0 源码可以通过以下方式下载:使用git clone -b v6.0 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite命令将 YOLOv5 源码下载到本地。下载完成后,可以根据自己的需求将相关文件放置到合适的位置。比如,可以在项目目录下创建一个专门的文件夹来存放模型文件和数据集等。

(二)数据集制作

  1. 处理数据集的原因:进行数据预处理是为了将原始数据转换为可以理解的格式或者符合挖掘的格式。在真实世界中,数据通常是不完整的、不一致的、极易受到噪声侵扰的。低质量的数据将导致低质量的挖掘结果。对于 YOLO 目标检测来说,高质量的数据集能够提高模型的准确性和泛化能力。
  1. 抽帧处理:对于视频数据集,可以采用抽帧的方法来扩充数据集。例如,可以使用以下方法获取视频长度:“def get_video_duration(filename): cap = cv2.VideoCapture(filename); if cap.isOpened(): rate = cap.get(5); frame_num = cap.get(7); duration = frame_num / rate; return duration; return -1”。然后根据视频长度判断一秒分割成多少帧,比如“length = get_video_duration(all_files[i]); zhen = int(35 / length)”,最终抽取的视频帧将为 35 左右。这样可以从大量视频文件中抽取若干帧,为数据集提供更多的样本。
  1. 格式转换:不同的数据集格式可能不适合直接用于 YOLO 模型的训练,因此需要进行格式转换。比如,PaddleX GUI 支持 ImageNet 格式的图像分类数据集、VOC 格式的目标检测数据集、COCO 格式的实例分割数据集等。可以使用相应的接口将数据转换成与 YOLO 模型适配的格式。例如,“import paddlex as pdx; pdx.tools.labelme2voc(image_dir='labelme_imgs', json_dir='labelme_jsons', dataset_save_dir='voc_dataset')”可实现 LabelMe 数据集到 VOC 数据集的转换。此外,还可以将自己的数据集转换为 cifar 数据集格式,cifar 数据集共有 60000 张彩色图像,分为 10 个类,每类 6000 张图,其中 50000 张用于训练,10000 张用于测试。具体转换方法可以参考相关资料,先了解 cifar 数据集的基本情况和各文件详细内容,然后通过代码实现数据集的转换。

三、YOLO 模型训练

(一)配置文件修改

在确保 PyTorch 环境以及需要的包安装完成后,就可以开始对项目进行配置文件的修改以进行模型训练。首先,在data目录下添加配置文件UA-DETRAC.yaml,其内容如下(需修改为自己的存储路径):

train: D:/yolov5/yolov5-6.0/UA-DETRAC_train/images/train/ #16551 images
val: D:/yolov5/yolov5-6.0/UA-DETRAC_train/images/val/  #4952 images
nc: 4
names: ['car',  'bus',  'van', 'others']

 接着,在models目录下添加配置文件yolov5s_car.yaml,填充内容如下:

# parameters
nc: 4 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
 - [10,13, 16,30, 33,23] # P3/8
 - [30,61, 62,45, 59,119] # P4/16
 - [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
 # [from, number, module, args]
 [[-1,1, Focus, [64, 3]],  # 0-P1/2
 [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
 [-1, 3, C3, [128]],
 [-1,1, Conv, [256, 3, 2]],  # 3-P3/8
 [-1, 9, C3, [256]],
 [-1,1, Conv, [512, 3, 2]],  # 5-P4/16
 [-1, 9, C3, [512]],
 [-1,1, Conv, [1024, 3, 2]],  # 7-P5/32
 [-1, 1, SPP, [1024, [5, 9, 13]]],
 [-1,3, C3, [1024, False]],  # 9]
# YOLOv5 head
head:
 [[-1,1, Conv, [512, 1, 1]],
 [-1,1, nn.Upsample, [None, 2, 'nearest']],
 [[-1,6], 1, Concat, [1]],  # cat backbone P4
 [-1, 3, C3, [512, False]],  # 13
 [-1, 1, Conv, [256, 1, 1]],
 [-1,1, nn.Upsample, [None, 2, 'nearest']],
 [[-1,4], 1, Concat, [1]],  # cat backbone P3
 [-1, 3, C3, [256, False]],  # 17 (P3/8-small)
 [-1, 1, Conv, [256, 3, 2]],
 [[-1,14], 1, Concat, [1]],  # cat head P4
 [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)
 [-1, 1, Conv, [512, 3, 2]],
 [[-1,10], 1, Concat, [1]],  # cat head P5
 [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
 [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

 然后,修改train.py的parse_opt函数里的以下配置参数:

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='models/yolov5s_car.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/UA-DETRAC.yaml', help='dataset.yaml path')

原train.py设置的训练轮数为 300,为了测试代码能否跑通,可将训练轮数修改为 5。

parser.add_argument('--epochs', type=int, default=5)

 

(二)训练过程与问题解决

在训练过程中可能会出现一些问题。例如,可能会出现字体下载失败的问题,提示“Downloading https://ultralytics.com/assets/Arial.ttf to C:\Users\li\AppData\Roaming\Ultralytics\Arial.ttf…”然后程序异常终止。这是因为 yolo 项目需要用到“Arial.ttf”这个字体,运行代码尝试下载该字体导致了下载失败。有两种解决方法,一种是提前下载好该字体,一种是直接屏蔽字体检查。具体做法是将utils目录下的plots.py的字体检查代码注释掉,如下:

class Annotator:
    # if RANK in (-1,0):
    #     check_font()  # download TTF if necessary
    # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations
    def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'):
        # assert im.data.contiguous, 'Image not contiguous. Apply np.ascontiguousarray(im) to Annotator() input images.'
        self.pil = pil or not is_ascii(example) or is_chinese(example)
        if self.pil:  # use PIL
            self.im = im if isinstance(im, Image.Image) else Image.fromarray(im)
            self.draw = ImageDraw.Draw(self.im)
            self.font = check_font(font='Arial.Unicode.ttf' if is_chinese(example) else font, size=font_size or max(round(sum(self.im.size) / 2 * 0.035), 12))
        else:  # use cv2
            self.im = im
            self.lw = line_width or max(round(sum(im.shape) / 2 * 0.003), 2)  # line width
        # 将下面的代码注释掉,完事。
        # if RANK in (-1,0):
        #     check_font()  # download TTF if necessary

另一个问题是 wandb 报错,影响训练。wandb 是用来做训练过程可视化的,但频繁报错。解决方法是修改工程中的utils/loggers/wandb/wandb_utils.py,将原来的代码注释掉,添加wandb = None这行代码。同时,修改工程中的utils/loggers/–init–.py。如果在训练过程中出现因为计算机内存太小,加载数据集时爆内存的情况,可修改train.py的配置参数即可。

四、YOLOV3 在嵌入式设备上的实现

(一)准备工作

激活开发板,使其具备可使用的操作系统,通常采用 Linux Ubuntu16.04 系统。接着安装工具包,如 CUDA8.0、CUDNN5.0、OPENCV3.4。这些工具包为后续的 YOLOV3 在嵌入式设备上的运行提供了必要的环境支持。

(二)参数配置与编译安装

  1. 参数配置:修改 darknet 文件夹下的配置文件 Makefile 中的参数使其与开发板的硬件配置相匹配。具体来说,将 GPU、CUDNN、OPENCV 三个参数对应的值改为“1”。同时,根据开发板的 GPU 计算性能,设置 GPU 架构参数。例如,当开发板为 NVIDIA JETSON TX2 时,开发板的 GPU 计算性能配置为 6.2,对应的 GPU 架构参数为 62。
  1. 编译安装:使用 make 指令编译安装 DARKNET。编译完成后,下载并将权重文件保存至 darknet 文件夹下。

(三)运行测试

  1. 运行方法:在 darknet 目录下运行测试程序,依次输入 YOLOV3 对应的网络结构文件即 yolov3.cfg 文件、权重 yolov3.weights 文件、待测图片或视频文件。
  1. 注意事项:确保配置文件和权重文件的路径正确,以免出现无法找到文件的错误。同时,对于视频文件的测试,要注意视频的格式是否被支持,以及视频的分辨率是否与模型训练时的设置相匹配,以保证测试结果的准确性。如果在测试过程中出现错误,可以根据错误提示信息进行排查和解决。

五、YOLOv10 在嵌入式设备上的新框架

一)框架优势

YOLOv10 的新框架具有显著的特点。在加速性能方面,它利用进化深度智能框架来优化网络架构,参数减少了 2.8 倍,同时 IOU 仅下降约 2%。这种优化使得模型在嵌入式设备上的运行更加高效,能够以实时方式执行视频中的目标检测。此外,运动自适应推理方法也是该框架的一大亮点。由于并非所有捕获的视频帧都包含唯一信息,不需要对所有帧进行深度推理。通过这种方法,框架可以确定特定视频帧是否需要深度推理,从而减少对计算资源的需求,显著降低功耗系统以及提高处理速度。与原始 YOLOv8 相比,所提出的框架可以将深度推理的数量平均减少 38.13%,视频中目标检测的平均加速约为 3.3 倍,在 Nvidia Jetson TX1 嵌入式系统上平均约为 18FPS。

(二)无 NMS 训练策略

YOLOv10 采用了无 NMS 的训练策略,该策略具有双标签分配和一致的匹配度量。在训练期间,模型使用两个预测头,一个采用一对多分配,另一个使用一对一分配。一对多分配在训练期间为一个真实物体标签分配多个预测框,提供了丰富的监督信号,有助于优化并实现卓越的性能。一对一分配在训练阶段,每个标签将根据类别与回归的双重代价被分配至多一个正样本,在推理期间使用一对一分配的预测结果,从而实现无 NMS 的高效推理。这种策略消除了对 NMS 后处理的依赖,提高了推理效率,同时在保持高效率的同时获得了竞争性的性能。

(三)实验结果

与原始 YOLOv8 相比,YOLOv10 的新框架在性能上有了显著提升。在速度方面,平均加速约为 3.3 倍,能够在嵌入式设备上以更高的帧率进行目标检测。在精度方面,虽然参数减少了,但通过优化的网络架构和无 NMS 的训练策略,仍然能够保持较高的检测精度。例如,在相同性能下,YOLOv10-B 与 YOLOv9-C 相比,延迟减少了 46%。在不同的模型规模下,YOLOv10 系列也展现出了优势。如 YOLOv10-L 和 YOLOv10-X 在相同的模型规模下分别比 YOLOv8-L 和 YOLOv8-X 的平均精度(AP)提升了 0.3 和 0.5,同时它们的参数量分别减少了 1.8 倍和 2.3 倍。YOLOv10-M 的 AP 与 YOLOv9-M 和 YOLO-MS 相当,但参数量分别减少了 23%和 31%。这些实验结果充分证明了 YOLOv10 在嵌入式设备上的性能优势。

六、YOLO 在嵌入式系统中的集成方法

(一)算法总览

YOLOV3 在网络结构上进行了一系列改进,进一步提高了目标检测的准确性和性能。YOLOV3 采用了名为 Darknet-53 的网络结构,相较于 YOLOV2 中的 Darknet-19 结构更深。Darknet-53 由残差模块组成,可以更好地捕捉图像中的特征。同时,YOLOV3 引入了多尺度预测的概念,通过在不同尺度上进行目标检测,可以更好地适应不同大小的目标。YOLOV3 在网络的输出层引入了三个不同尺度的特征图,分别用于检测大、中、小尺度的目标。此外,YOLOV3 还借鉴了特征金字塔网络(FPN)的思想,通过跨层连接和上采样操作,将不同层次的特征图进行融合,从而提取更丰富的语义信息。这样可以提高对不同尺度目标的检测能力。

在精度和速度的平衡方面,YOLOV3 做到了较好的权衡。根据搜索结果中的数据,YOLOV3 在保持较高速度的同时,提高了目标检测的准确性。例如,YOLOV3 在 22ms 的时间内达到了 28.2mAP,与 SSD 的精度差不多但是比它快了 3 倍。这使得 YOLOV3 能够应用于实时目标检测场景,如嵌入式系统中的智能安防、机器人视觉等领域。

(二)Anchor 数量调整

YOLOV2 的 anchor 只有 5 个,并且在同一个尺度的特征层上进行检测,效果并不是太好。而 YOLOV3 在 anchor 数量上做了调整,增加到了 9 个。作者通过对 COCO 数据集进行 k-means 聚类,得到了 9 个 anchor,大小分别为(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。这样的调整使得模型能够更好地适应不同形状的目标,提高了检测的准确性。

然而,过多的 anchor 会对速度产生一定的影响。在实际应用中,需要根据具体情况进行权衡。例如,在一些对速度要求较高的嵌入式系统中,可以适当减少 anchor 的数量,以提高检测速度。同时,可以通过优化网络结构和训练策略,来提高模型在较少 anchor 数量下的检测性能。

七、YOLO 在嵌入式设备上的部署

(一)设备选择与挑战

Raspberry Pi 作为一种典型的嵌入式设备,在部署 YOLO 时面临着诸多挑战。首先,Raspberry Pi 的处理能力有限,其搭载的处理器通常无法与传统的桌面级或服务器级处理器相比。例如,Raspberry Pi 3 Model B 配备了 1.2 GHz Cortex-A53 ARM CPU 和 1 GB RAM,而 Raspberry Pi 4 配备了 1.8 GHz Cortex-A72 ARM CPU 和 1、4 或 8 GB RAM。这样的硬件配置对于大规模的 YOLO 模型来说可能难以直接承载。其次,内存容量受限也是一个问题。YOLO 模型通常需要一定的内存来存储模型参数和进行推理计算,而嵌入式设备的内存相对较小,可能无法满足模型的需求。例如,在运行一些复杂的 YOLO 模型时,可能会出现内存不足的错误提示。最后,功耗也是需要考虑的因素。Raspberry Pi 通常以电池为电源,因此需要对模型进行优化,以降低功耗,延长设备的使用时间。

(二)开发环境配置与优化

在配置开发环境方面,首先需要安装必要的软件和工具。例如,可以安装 Python 环境,并通过 pip 安装相关的库和依赖项。对于 YOLO 的部署,可能需要安装深度学习框架如 TensorFlow Lite 或 PyTorch Lite,以及 OpenCV 等图像处理库。在编译优化方面,可以使用一些工具和技术来提高模型的运行效率。例如,可以使用模型压缩和剪枝技术,如 TensorFlow 的 Model Optimization Toolkit、Caffe 的模型剪枝工具包和 PyTorch 的模型压缩库等,来减小模型的大小和计算量。同时,可以进行量化操作,将模型参数和激活值表示为较低位数的定点数或浮点数,以提高推理速度并减少内存占用。此外,还可以利用硬件加速,如使用 GPU 或专用的目标检测芯片来提高处理速度。在性能提升技巧方面,可以采用数据增强技术,增加训练数据的多样性,提高模型的泛化能力。还可以进行模型调优,调整超参数,如学习率、批次大小等,以获得更好的性能。

(三)实际部署与建议

在实际部署过程中,首先需要将优化后的模型部署到 Raspberry Pi 上。可以通过将模型转换为适合嵌入式设备的格式,如 TensorFlow Lite 的.tflite 格式或 PyTorch Lite 的.ptl 格式,并将其复制到设备上。然后,编写代码来加载模型并进行目标检测。在实际部署过程中,需要注意以下几点建议和最佳实践。首先,要根据设备的性能和资源限制选择合适的 YOLO 模型版本。例如,可以选择轻量级的 Tiny YOLO 或 YOLOv3-SPP 等模型,以减小模型的大小和计算复杂度。其次,要进行充分的测试和优化,确保模型在嵌入式设备上能够稳定运行,并满足实时性要求。可以通过调整模型的参数、优化代码等方式来提高性能。最后,要注意设备的功耗管理,避免过度消耗电池电量。可以通过降低模型的计算量、关闭不必要的功能等方式来降低功耗。总之,在嵌入式设备上部署 YOLO 需要综合考虑设备的性能、资源限制和实际需求,进行合理的选择和优化,以实现高效的目标检测。

 


http://www.kler.cn/news/359166.html

相关文章:

  • Mac ARM 本地运行 Mini-Omni 记录
  • Redis 性能优化选择:Pika 的配置与使用详解
  • 备考408——数据结构基础知识
  • 模型驱动架构(MDA)设计方法及其应用分析
  • C++面试速通宝典——28
  • RestTemplate基本使用之HTTP实现GET请求和POST请求
  • Pymysql中Mysql连接默认会开启事务处理-数据表名行数列表SQL以及python中的日志模板 logoru 及常用参数配置解析
  • 内网穿透之Linux系统安装神卓互联【超详细,小白一看就会】
  • 2024-moectf Web WP
  • docker配置加速器
  • git分支模型
  • 情绪稳定!别再让Git合并冲突影响你工作了
  • 音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现
  • [论文阅读]Large Language Models Are Reasoning Teachers
  • 《深度学习》OpenCV 人脸检测、微笑检测 原理及案例解析
  • commvault测试(1):cv10使用辅助拷贝实现不同MA的数据同步
  • 在文件里引用目录文件下的静态资源图片不显示
  • Element笔记
  • MoCoOp_ Mixture of Prompt Learning for Vision Language Models
  • xlnt加载excel报错:xl/workbook.xml:2:2581: error: attribute ‘localSheetId‘ expected