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 更快。

量化的步骤
加载模型
量化→量化模型
前向传递
处理量化模型
要访问 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_