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
文件夹下包括已经修改统一分辨率的测试图片。
首先我们导入模型
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 文件对网络的输入和输出的超参数进行描述以及配置,这些参数包括,输入输出 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
文件夹内。
原贴链接:https://bbs.aw-ol.com/topic/1641/ 作者@YterAA