专栏名称: 小白学视觉
本公众号主要介绍机器视觉基础知识和新闻,以及在学习机器视觉时遇到的各种纠结和坑的心路历程。
目录
相关文章推荐
东方网  ·  痛悼!知名演员凌晨去世 ·  2 天前  
新闻夜航  ·  涨了,涨了,暴涨!超388%! ·  3 天前  
51好读  ›  专栏  ›  小白学视觉

优化YOLO实现小型设备的目标检测部署

小白学视觉  · 公众号  ·  · 2025-01-20 11:07

正文

点击上方 小白学视觉 ”,选择加" 星标 "或“ 置顶
重磅干货,第一时间送达

本文致力于从量化感知训练到剪枝,探索如何让YOLOv8在边缘设备上更快、更高效。想象在你的智能手机或无人机上运行一个能够实时检测物体的AI模型,而不会卡顿或耗尽电池。但这正是YOLOv8带来的目标检测的未来。YOLOv8是目前最快、最准确的物体识别模型之一,但它也相当庞大。当将这个模型部署在手机、传感器或嵌入式系统等资源有限的小型设备上时,你可能会很快遇到性能问题。这时,优化技术就派上用场了。
在本文中,我们将探讨如何通过量化感知训练(QAT)、剪枝等工具,将YOLOv8转变为一种轻量、高效的检测机器,使其在低资源设备上无缝运行。无论你是构建下一代智能摄像头还是移动应用,优化YOLOv8都是实现高性能、实时目标检测的关键。
为什么选择YOLOv8?
你可能会问,为什么不直接使用最新版本,比如YOLOv11?虽然这听起来很诱人,但YOLOv8是一个稳妥的选择,尤其是在处理资源受限的设备时。它在性能和计算资源需求之间取得了平衡——提供了令人印象深刻的性能,而不需要过多的计算资源。新版本可能会带来一些花哨的功能,但它们也往往增加了复杂性或更高的资源需求,而这些需求在许多应用场景中可能并不必要。
优化YOLOv8以适应低资源设备的技术
有几种方法可以使YOLOv8更加高效,包括:
1. 量化感知训练(QAT)
  • 是什么:QAT通过降低模型权重的精度(从32位到8位)来缩小模型体积。这使得模型运行更快、占用内存更少,同时不会损失太多准确性。
  • 如何帮助YOLOv8:当我们将QAT应用于YOLOv8时,它帮助模型“学习”如何处理低精度,从而使其更快、更轻量,而不会牺牲太多性能。
  • 为什么重要:对于计算能力和内存有限的边缘设备,QAT使YOLOv8更适合部署。
2. 剪枝
  • 是什么:剪枝涉及移除模型中不太有用或重要的部分(即连接或权重),从而得到一个更小、更快的模型。
  • 如何帮助YOLOv8:通过剪除不必要的权重,模型变得更轻量、资源需求更低。这有助于它在手机和传感器等资源有限的小型设备上运行。
  • 为什么重要:剪枝可以显著减少YOLOv8的内存使用和计算需求,这对于实时应用至关重要。
3. 知识蒸馏
  • 是什么:知识蒸馏 将知识从大型复杂模型(教师模型)转移到更小、更简单的 模型(学生模型),使学生模型更小但仍能表现良好。
  • 如何帮助YOLOv8:通过将YOLOv8蒸馏为更小的版本,我们可以创建一个更容易部署在边缘设备上的模型,而不会损失太多准确性。
  • 为什么重要:对于计算能力有限的设备,蒸馏后的模型使YOLOv8更加高效。
4. 训练后量化
  • 是什么:在训练模型后,我们可以应用一种更简单的量化形式,降低模型权重的精度,使其更小、运行更快。
  • 如何帮助YOLOv8:这种方法比QAT更容易,因为它不需要在训练期间进行修改,但仍然有助于减少模型体积,从而在边缘设备上实现更快的性能。
  • 为什么重要:这使得YOLOv8在训练完成后更适用于在小型设备上运行。

评估改进效果

在应用这些技术后,重要的是评估它们的效果。为此,你需要跟踪以下指标:
  • 模型大小:模型缩小了多少?
  • 速度:模型运行速度提高了多少(例如,每秒帧数)?
  • 准确性:性能与原始YOLOv8相比如何?

通过比较优化前后的这些指标,你将看到这些技术如何帮助YOLOv8在低资源设备上实现改进。

在YOLOv8中实现QAT和训练后量化
现在我们已经讨论了优化技术,接下来让我们探讨如何在YOLOv8中实际实现量化感知训练(QAT)和训练后量化。这两种方法对于减少模型体积和提高其在资源受限设备上的性能至关重要,我已经在GitHub上的YOLOv8中实现了它们。下面,我将逐步介绍如何设置和应用这些技术到YOLOv8中。参考链接:https://github.com/SupriyaRani/Face-mask-detection/tree/main
流程:开始 → 训练YOLOv8 → 量化(训练后或QAT) → 导出量化模型 → 部署到边缘设备。
1. 在YOLOv8中实现量化感知训练(QAT):
QAT需要修改训练流程,以在训练阶段模拟量化。这使得模型能够调整并适应低精度。以下是我在YOLOv8中使用的简化实现过程:
步骤1:为QAT准备YOLOv8
首先,我们加载YOLOv8模型,并使用PyTorch的量化工具设置训练环境。
import torchimport torchvisionfrom torch.quantization import get_default_qat_qconfig, prepare_qat, convertfrom yolov8 import YOLOv8  # Assuming a YOLOv8 import setup
model = YOLOv8()qconfig = get_default_qat_qconfig('fbgemm') # For CPU backend
model.qconfig = qconfigmodel = prepare_qat(model)
步骤2:使用QAT训练模型
像平常一样训练模型,确保在前向传播过程中加入量化。
# Standard training loop (assuming you have your training data loaded)for images, targets in train_dataloader:    outputs = model(images)    loss = calculate_loss(outputs, targets)    loss.backward()    optimizer.step()
# Apply QAT conversion after trainingmodel = convert(model)
步骤3:测试量化后的模型
在QAT之后,你现在可以测试优化后的模型,观察模型体积和推理速度的改进,而不会牺牲准确性。
model.eval()test_results = model(test_data)
我已经在GitHub上分享了YOLOv8的QAT示例代码,你可以在其中找到完整的实现,并根据不同用例调整参数。
量化后模型体积的减少
经过量化后,用于口罩检测的定制YOLOv8s模型体积显著减小。以下是量化前后的对比:
2. 在YOLOv8中实现训练后量化(PTQ):
与QAT不同,训练后量化是在模型完全训练后进行的。它涉及将训练后模型的权重和偏置转换为低精度格式。以下是我在YOLOv8中实现PTQ的步骤:
步骤1:正常训练模型
在不考虑量化的情况下训练YOLOv8模型。
model = YOLOv8()  # Training as usualfor images, targets in train_dataloader:    outputs = model(images)    loss = calculate_loss(outputs, targets)    loss.backward()    optimizer.step()
步骤2:应用训练后量化
训练完成后,使用PyTorch的torch.quantization将训练后的模型转换为量化版本。
model.eval()quantized_model= torch.quantization.quantize_dynamic(    model, {torch.nn.Linear}, dtype=torch.qint8)
步骤3:评估量化后的模型
应用训练后量化后,评估模型的性能,并测量模型体积和推理时间的减少。
test_results = quantized_model(test_data)
训练后量化的性能指标
让我们在虚拟数据上测试效率,比较量化前后模型的平均推理时间。
import time
# Define function to calculate the avg time taken by model for # evaluation on test datadef benchmark_model(model, input_tensor): model.eval() with torch.no_grad(): start_time = time.time() for _ in range(100): _ = model(input_tensor) end_time = time.time() return (end_time - start_time) / 100
# Create a dummy input for testdummy_input = torch.randn(1, 3, 640, 640)
original_time = benchmark_model(model, dummy_input)quantized_time = benchmark_model(quantized_model, dummy_input)
print(f"Original Model Avg Time: {original_time:.4f} seconds")print(f"Quantized Model Avg Time: {quantized_time:.4f} seconds")
经过训练后量化后,用于口罩检测的定制YOLOv8s模型在处理时间上表现出显著改进。以下是平均处理时间的对比:
延迟是一个重要的检查点
在现实场景中部署AI模型时,尤其是对于边缘设备或时间敏感的任务,延迟是一个关键因素。延迟是指模型处理输入并生成输出所需的时间。较低的延迟对于确保流畅高效的实时操作至关重要。
为什么重要?
  • 实时性能:在视频监控、机器人或无人机导航等应用中,高延迟会导致明显的延迟,降低系统的响应速度。例如,在口罩检测中,延迟的结果可能会妨碍及时的警报或干预。
  • 用户体验:流畅的实时反馈增强了可用性,尤其是在面向消费者的应用(如移动应用或智能家居设备)中。
  • 电源和资源效率:高延迟通常意味着更大的计算负载,这会给低资源设备带来压力并更快地耗尽电量。减少延迟有助于延长电池寿命并降低能耗。

推理延迟对比

经过量化后,用于口罩检测的定制YOLOv8s模型在推理延迟上表现出显著减少。这种改进对于实时应用至关重要,因为低延迟是必不可少的。以下是代码片段和关键对比结果:
import cv2import torchimport timeimport numpy as np
# Load test image and preprocesstest_img_path = "datasets/test/images/maksssksksss7.png"image = cv2.imread(test_img_path) # Read imageimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Convert to RGBimage = cv2.resize(image, (640, 640)) # Resize to YOLOv8 input sizeimage = image / 255.0 # Normalize pixel values to [0, 1]image = np.transpose(image, (2, 0, 1)) # Change HWC to CHW formatimage = np.expand_dims(image, axis=0) # Add batch dimensionimage_tensor = torch.tensor(image, dtype=torch.float32) # Convert to tensor
# Measure latencystart_time = time.time()with torch.no_grad(): results = quantized_model(image_tensor)end_time = time.time()
latency = (end_time - start_time) * 1000 # Millisecondsprint(f"Inference Latency: {latency:.2f} ms")
  • 延迟减少:量化后的模型相比原始定制模型,延迟减少了57.6%。
  • 实际影响:对于物联网设备、无人机或移动应用上的视频处理等实时应用,这种延迟减少确保了更流畅、更快速的操作。

较低的延迟直接提升了用户体验,尤其是在监控、自动化监控或机器人导航等场景中。

未来高效使用检测模型的方向
虽然本文重点介绍了通过量化感知训练(QAT)和训练后量化等技术优化YOLOv8,但这些概念还有很大的潜力可以进一步扩展和增强。以下是一些值得探索的未来方向:
  1. 剪枝和知识蒸馏:将量化与剪枝(移除不重要的神经元)或知识蒸馏(训练较小的模型以模仿较大的模型)等技术结合,可以产生更小、更快的模型,适用于资源受限的设备。
  2. 边缘与云端的混合部署:开发混合系统,其中轻量级模型在边缘设备上处理数据,而更复杂的任务则卸载到云服务。这平衡了延迟、成本和计算效率。
  3. 实时场景中的动态量化:实现动态量化,根据工作负载调整模型性能,基于当前硬件限制或输入复杂性进行优化。
  4. 跨平台部署:将实现扩展到各种平台,包括iOS(Core ML)、Android(TFLite)和Nvidia Jetson Nano,以探索实际性能和瓶颈。
  5. 在无人机和物联网设备上部署:研究优化后的YOLOv8模型在无人机和物联网设置中的表现,用于实时导航、异常检测或人群管理等任务。






请到「今天看啥」查看全文