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/
darknet 版的 yolov3 模型包含两个文件,分别是权重文件 yolov3.weights
和模型结构描述文件 yolov3.cfg
这里两个都需要下载。下载完毕后放到配置好 NPU 开发工具的环境内。
打开模型结构描述文件 yolov3.cfg
,将 width
与 height
改为 416
以获得更好的性能。
然后还需要准备 dataset.txt
和测试的图片文件作为量化使用。先在 dataset.txt
文件中写入图片的路径和 id
./data/01.jpg 0
./data/02.jpg 1
然后将测试的图片放到文件夹里,这里我们准备 2 张不同的图片以供量化使用。
至此所有准备就完成了,你准备的文件看起来是这样的:
文件夹下包含 yolov3.cfg, yolov3.weight
这两个模型文件,一个dataset.txt
文件,存放量化使用的图片路径与 id,data
文件夹下包括已经修改统一分辨率的测试图片。
若如下图的情况,yolov.weight已经下载并且按照教程安装,但生成的文件与示例不匹配,可以在yolov.weight目录下打开终止执行解决该问题。
模型的转换
导入模型
首先我们导入模型
pegasus import darknet --model yolov3.cfg --weights yolov3.weights --output-model yolov3.json --output-data yolov3.data
导入生成两个文件,分别是是 yolov3.data
和 yolov3.json
文件,他们是 YOLO V3 网络对应的芯原内部格式表示文件,分别对应原始模型文件的 yolov3.weights
和 yolov3.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
修改 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
预推理
利用前文的量化表执行预推理,得到推理 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
导出模板代码与模型
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}
至此,模型转换完成,生成的模型存放在 ovxilb/yolov3_nbg_unify
文件夹内。