跳转至

NPU 转换 YOLO V3 模型

YOLO 全称是 You Only Look Once(你只需看一次),从名称上也能看出这种算法速度快的优势,因此在许多边缘设备上,YOLO 算法的使用十分广泛。YOLOV3 是华盛顿大学研究生 Joseph Redmon 所开发,他也因此凭借该算法获得了计算机视觉领域的很多奖项。

本文将通过 YOLO V3 模型的下载、转换、仿真三部分讲解如何使用现成的模型转换为 V853 NPU 所支持的模型。

模型的准备

在开始转换模型之前,需要准备模型。

模型可以通过自行准备数据集,工具训练而成,也可以从网上下载已经训练好了的 YOLO V3 模型。

本文演示的是从网上下载的已经训练好的模型。

我们使用的框架是 darknet,模型为 YOLOv3-608。 其训练的数据集是 COCO trainval 数据集,模型可以在这里下载到:https://pjreddie.com/darknet/yolo/

image-20220707144833952

darknet 版的 yolov3 模型包含两个文件,分别是权重文件 yolov3.weights 和模型结构描述文件 yolov3.cfg 这里两个都需要下载。下载完毕后放到配置好 NPU 开发工具的环境内。

image-20220707140244912

打开模型结构描述文件 yolov3.cfg,将 widthheight 改为 416 以获得更好的性能。

然后还需要准备 dataset.txt 和测试的图片文件作为量化使用。先在 dataset.txt 文件中写入图片的路径和 id

./data/01.jpg 0
./data/02.jpg 1

然后将测试的图片放到文件夹里,这里我们准备 2 张不同的图片以供量化使用。

image-20220707141349654

至此所有准备就完成了,你准备的文件看起来是这样的:

文件夹下包含 yolov3.cfg, yolov3.weight 这两个模型文件,一个dataset.txt 文件,存放量化使用的图片路径与 id,data 文件夹下包括已经修改统一分辨率的测试图片。

image-20220712140525248

若如下图的情况,yolov.weight已经下载并且按照教程安装,但生成的文件与示例不匹配,可以在yolov.weight目录下打开终止执行解决该问题。

image-20220712140525248

模型的转换

导入模型

首先我们导入模型

pegasus import darknet --model yolov3.cfg --weights yolov3.weights --output-model yolov3.json --output-data yolov3.data

image-20220707143444505

导入生成两个文件,分别是是 yolov3.datayolov3.json 文件,他们是 YOLO V3 网络对应的芯原内部格式表示文件,分别对应原始模型文件的 yolov3.weightsyolov3.cfg

创建 YML 文件

YML 文件对网络的输入和输出的超参数进行描述以及配置,这些参数包括,输入输出 tensor 的形状,归一化系数 (均值,零点),图像格式,tensor 的输出格式,后处理方式等等

pegasus generate inputmeta --model yolov3.json --input-meta-output yolov3_inputmeta.yml

pegasus generate postprocess-file --model yolov3.json --postprocess-file-output yolov3_postprocessmeta.yml

image-20220707143632918

修改 yolov3_inputmeta.yml 文件中的的 scale 参数为 0.0039(1/255),目的是对输入 tensor 进行归一化,和网络进行训练的时候是对应的。

量化

生成下量化表文件,使用非对称量化,uint8,修改 --batch-size 参数为你的 dataset.txt 里提供的图片数量。

pegasus quantize --model yolov3.json --model-data yolov3.data --batch-size 1 --device CPU --with-input-meta yolov3_inputmeta.yml --rebuild --model-quantize yolov3.quantize --quantizer asymmetric_affine --qtype uint8

image-20220707160124399

预推理

利用前文的量化表执行预推理,得到推理 tensor,yolov3 是 1 输入 3 输出网络,所以一共产生了 4 个 tensor

pegasus inference --model yolov3.json --model-data yolov3.data --batch-size 1 --dtype quantized --model-quantize yolov3.quantize --device CPU --with-input-meta yolov3_inputmeta.yml --postprocess-file yolov3_postprocessmeta.yml

image-20220707160428085

导出模板代码与模型

pegasus export ovxlib --model yolov3.json --model-data yolov3.data --dtype quantized --model-quantize yolov3.quantize --batch-size 1 --save-fused-graph --target-ide-project 'linux64' --with-input-meta yolov3_inputmeta.yml --output-path ovxilb/yolov3/yolov3prj --pack-nbg-unify --postprocess-file yolov3_postprocessmeta.yml --optimize "VIP9000PICO_PID0XEE" --viv-sdk ${VIV_SDK}

image-20220707161514265

至此,模型转换完成,生成的模型存放在 ovxilb/yolov3_nbg_unify 文件夹内。

image-20220707161646814