点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文致力于从量化感知训练到剪枝,探索如何让YOLOv8在边缘设备上更快、更高效。想象在你的智能手机或无人机上运行一个能够实时检测物体的AI模型,而不会卡顿或耗尽电池。但这正是YOLOv8带来的目标检测的未来。YOLOv8是目前最快、最准确的物体识别模型之一,但它也相当庞大。当将这个模型部署在手机、传感器或嵌入式系统等资源有限的小型设备上时,你可能会很快遇到性能问题。这时,优化技术就派上用场了。
在本文中,我们将探讨如何通过量化感知训练(QAT)、剪枝等工具,将YOLOv8转变为一种轻量、高效的检测机器,使其在低资源设备上无缝运行。无论你是构建下一代智能摄像头还是移动应用,优化YOLOv8都是实现高性能、实时目标检测的关键。
为什么选择YOLOv8?
你可能会问,为什么不直接使用最新版本,比如YOLOv11?虽然这听起来很诱人,但YOLOv8是一个稳妥的选择,尤其是在处理资源受限的设备时。它在性能和计算资源需求之间取得了平衡——提供了令人印象深刻的性能,而不需要过多的计算资源。新版本可能会带来一些花哨的功能,但它们也往往增加了复杂性或更高的资源需求,而这些需求在许多应用场景中可能并不必要。
优化YOLOv8以适应低资源设备的技术
有几种方法可以使YOLOv8更加高效,包括:
1. 量化感知训练(QAT)
2. 剪枝
3. 知识蒸馏
4. 训练后量化
评估改进效果
在应用这些技术后,重要的是评估它们的效果。为此,你需要跟踪以下指标:
通过比较优化前后的这些指标,你将看到这些技术如何帮助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 torch
import torchvision
from torch.quantization import get_default_qat_qconfig, prepare_qat, convert
from yolov8 import YOLOv8 # Assuming a YOLOv8 import setup
model = YOLOv8()
qconfig = get_default_qat_qconfig('fbgemm') # For CPU backend
model.qconfig = qconfig
model = 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 training
model = 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 usual
for 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 data
def 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 test
dummy_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 cv2
import torch
import time
import numpy as np
# Load test image and preprocess
test_img_path = "datasets/test/images/maksssksksss7.png"
image = cv2.imread(test_img_path) # Read image
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Convert to RGB
image = cv2.resize(image, (640, 640)) # Resize to YOLOv8 input size
image = image / 255.0 # Normalize pixel values to [0, 1]
image = np.transpose(image, (2, 0, 1)) # Change HWC to CHW format
image = np.expand_dims(image, axis=0) # Add batch dimension
image_tensor = torch.tensor(image, dtype=torch.float32) # Convert to tensor
# Measure latency
start_time = time.time()
with torch.no_grad():
results = quantized_model(image_tensor)
end_time = time.time()
latency = (end_time - start_time) * 1000 # Milliseconds
print(f"Inference Latency: {latency:.2f} ms")
较低的延迟直接提升了用户体验,尤其是在监控、自动化监控或机器人导航等场景中。
未来高效使用检测模型的方向
虽然本文重点介绍了通过量化感知训练(QAT)和训练后量化等技术优化YOLOv8,但这些概念还有很大的潜力可以进一步扩展和增强。以下是一些值得探索的未来方向:
结论
优化YOLOv8是使其在计算能力有限的设备(如智能手机或无人机)上运行的关键。通过使用量化感知训练(QAT)、剪枝和训练后量化等技术,你可以使YOLOv8更加高效、轻量和快速。这些技术将帮助YOLOv8在保持出色性能的同时,更适合边缘设备。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~