YoloV3 在FPGA上运行-量化、编译和推理

YoloV3 在FPGA上运行-量化、编译和推理

在Yolo这个复杂度级别的神经网络基本很少从零开始使用HDL搭建了,基本借助于FPGA厂商推出的AI工具链(AMD的Vitis AI/Intel的OpenVINO)可以快速搭建基于神经网络的应用。

今天搭建基于 Yolov3 在FPGA上运行对象检测的示例,侧重过程。

YoloV3 架构

YOLOv3(You Only Look Once Version 3)是一种先进的实时物体检测算法。旨在快速准确地检测图像或视频帧中的物体。YOLOv3 在其前身 YOLOv2 的成功基础上进行了改进,并引入了多项增强功能以提高检测准确性和性能。

YOLOv3 的一个显著改进是使用了特征金字塔网络 (FPN),这使得模型能够提取多个尺度的特征。通过结合高分辨率和低分辨率特征图,YOLOv3 可以有效地检测各种尺寸的物体。

YOLOv3 的另一个关键特性是集成了多尺度检测方法。YOLOv3 不是以固定分辨率处理图像,而是以三种不同的尺度进行操作。这使得模型能够准确检测小物体和大物体。

YOLOv3 还采用了一种更深的神经网络架构,即 Darknet-53。该架构基于残差连接,由 53 个卷积层组成。增加的深度使 YOLOv3 能够学习更复杂的表示并捕捉输入图像中的更精细的细节。

综上所述,YOLOv3 是一种最先进的物体检测算法,它结合了特征金字塔网络、多尺度检测和更深的神经网络架构,实现了高精度和实时性能。

要探索完整的 YOLOv3 模型代码,请参阅YoloV3 主模型提供的 GitHub 存储库。

https://github.com/LogicTronix/Vitis-AI-Reference-Tutorials/tree/main/Quantizing-Compiling-YOLOv3-Pytorch-with-DPU-Inference

使用 Vitis AI 3.0 量化 Yolov3 Pytorch

在 PyTorch 中量化 YOLOv3 涉及将模型的参数从浮点数转换为低精度定点数或整数表示,以减少内存和计算要求,同时保持可接受的精度。

我们将使用 Vitis AI 3.0 (GPU) 进行量化,也可以在 Vitis AI 的 CPU docker 上执行量化。GPU docker 需要在本地构建,而 CPU docker 可以直接拉取使用。在 GPU docker 上执行量化比 CPU Docker 更快。

5233b1d7c9b7e7c5572df0333666b428.png

量化的步骤

  • 加载模型

  • 量化→量化模型

  • 前向传递

  • 处理量化模型

要访问 YOLOv3 量化的代码库,请参阅以下 GitHub 存储库:

https://github.com/LogicTronix/Vitis-AI-Reference-Tutorials/tree/main/Quantizing-Compiling-YOLOv3-Pytorch-with-DPU-Inference/Quantization/quantize_yolov3.py/Quantization/quantize_yolov3.py

步骤 1:加载模型

加载浮点训练模型,可以对其进行量化。

state_dict = torch.load(config["pretrain_snapshot"])
model.load_state_dict(state_dict)

首先,代码片段从指定文件加载 PyTorch 模型的状态字典。加载状态字典后,此行代码将状态字典加载到 PyTorch 模型中。模型变量表示我们要将参数加载到的神经网络模型。通过调用 load_state_dict,将训练后的权重和参数从保存的状态字典传输到模型中。

步骤 2:量化(生成量化模型)

量化是使用Vitis AI 提供的pytorch_nndct库中的torch_quantizer函数执行的。

from pytorch_nndct.apis importtorch_quantizer
input = torch.randn([batch_size, 3, 416, 416])
quantizer = torch_quantizer(quant_mode, model, (input), device=device, quant_config_file=config_file, target=target)
quant_model = quantizer.quant_model

上面的代码片段创建了一个量化器对象的实例。通过将参数传递给pytorch_nndct库的torch_quantizer函数来创建量化器对象。

torch_quantizer函数接受以下参数:

  • quant_mode 可以是“calib”或“test”

  • 模型是我们加载的浮动模型

  • 输入是浮点模型所需的虚拟输入,具有 batch_size 个图像,每个图像具有 3 个颜色通道(RGB),每张图片的分辨率为高 416 像素、宽 416 像素

  • 设备代表应执行量化的“cpu”或“cuda”。

  • quant_config_file 是包含量化设置和选项的配置文件。由于“calib”步骤使用默认配置文件,因此配置文件为空。在“test”步骤中,它使用从“calib”步骤导出的配置文件。

  • 目标是量化模型所针对的平台或硬件。

创建量化器对象后,使用 quant_config_file 中指定的设置和选项对模型进行量化。量化后的模型存储在 quant_model 变量中,与原始模型相比,其权重和激活精度通常较低。

步骤 3:前向传递

前向传递是指将输入数据通过网络层传播以计算输出的过程。在此前向传递过程中,输入数据流经模型的各个层,进行各种数学运算(例如矩阵乘法、激活函数和池化),最终产生预测或输出。

# Forward -- Dry Run
input_data = torch.randn([batch_size, 3, 416, 416]).to(device)
quant_model(input_data)

如上面的代码所示,对 quant_model 进行前向传递时会进行试运行,这是一个至关重要的步骤,如果不执行则会引发错误。

来自 Ug1414 [ https://docs.xilinx.com/r/en-US/ug1414-vitis-ai/Error-Codes ]:
错误代码ID:QUANTIZER_TORCH_NO_FORWARD
错误消息:导出量化结果前必须调用 torch_quantizer.quant_model FORWARD 函数。请参阅

https://github.com/Xilinx/Vitis-AI/blob/master/src/Vitis-AI-Quantizer/vai_q_
YOLO (You Only Look Once) 是一种常用于目标检测的神经网络模型。它在计算机视觉中具有广泛的应用,例如实时视频分析、自动驾驶、智能监控等。然而,YOLO的计算复杂度较高,对于一般的CPU而言往往无法满足实时处理的需求。 FPGA (Field-Programmable Gate Array) 是一种可编程逻辑器件,具有并行计算能力高灵活性。通过使用FPGA,可以有效地加速YOLO的执行速度。在FPGA上实现的YOLO可以通过并行计算的方式同时处理多个输入,并且可以根据实际需求进行灵活修改,以优化计算存储资源。 FPGA加速YOLO的过程一般可以分为三个主要步骤:数据传输、计算加速结果输出。首先,需要将输入数据从主机内存传输到FPGA芯片。接下来,在FPGA运行优化的YOLO算法,通过并行计算处理图像数据,快速检测出目标并提取特征。最后,将处理后的结果传回主机内存,供后续处理或输出使用。 相比于传统的计算平台,使用FPGA加速YOLO具有多个优势。首先,FPGA的并行计算能力使得处理速度更快,可以满足实时性的需求。其次,FPGA具有低功耗的特性,可以在保持高性能的同时节约能源。此外,FPGA还支持可编程性,可以根据不同的应用场景进行灵活的定制。 总而言之,使用FPGA加速YOLO是一种有效的方法,可以提高目标检测的实时性性能。随着FPGA技术的不断发展,相信它在计算机视觉领域的应用将会越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值