YOLOv5 目标检测
该测试程序会推理 YOLOv5 模型实现目标检测, 结果仅以打印的形式输出。
PC 端交叉编译 YOLO 程序
Duo256M YOLOv5 代码位置:sample_yolov5.cpp
编译方法
参考上一章节 简介 中的方法编译示例程序,编译完成后,会在 sample/cvi_yolo/
目录下生成我们需要的 sample_yolov5
程序。
获取 cvimodel
你可以直接下载预编译好的 yolov5s int8 对称量化 cvimodel 模型,亦可按照模型编译手动转换模型。
下载预编译好的 cvimodel
- Duo256M
# int8 对称模型
wget https://github.com/milkv-duo/cvitek-tdl-sdk-sg200x/raw/main/cvimodel/yolov5_cv181x_int8_sym.cvimodel
模型编译
导出 yolov5s.onnx 模型
-
首先载 yolov5 官方仓库代码,地址如下: ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
git clone https://github.com/ultralytics/yolov5.git
-
配置工作环境
cd yolov5
pip3 install -r requirements.txt
pip3 install onnx -
获取 yolov5 的 .pt 格式的模型,例如下载 yolov5s 模型的地址:yolov5s
wget https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt
-
将 cvitek-tdl-sdk-sg200x/sample/yolo_export/yolov5_export.py 复制到 yolov5 仓库目录下
利用 yolov5_export.py 替换 forward 函数让 yolov5 的后处理由 RISC-V 来做并导出 onnx 格式模型
python3 yolov5_export.py --weights ./yolov5s.pt --img-size 640 640
参数解释
--weights pytorch 模型路径
--img-size 图片输入大小
TPU-MLIR 转换模型
请参考 TPU-MLIR 文档 配置好 TPU-MLIR 工作环境,参数解析请参考 TPU-MLIR 文档。
具体实现步骤分三步:
-
model_transform.py
将 onnx 模型转化成 mlir 中间格式模型onnx -> model_transform.py -> mlir
-
run_calibration.py
生成 int8 量化校准表calibration_set -> run_calibration.py -> calibration_table
-
model_deploy.py
将 mlir 配合 int8 量化表生成用于 TPU 推理的 cvimodelmlir + calibration_table ->model_deploy.py -> cvimodel
onnx 转 MLIR
model_transform.py \
--model_name yolov5s \
--model_def yolov5s.onnx \
--input_shapes [[1,3,640,640]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--test_input ../image/dog.jpg \
--test_result yolov5s_top_outputs.npz \
--mlir yolov5s.mlir
转换成 mlir 文件之后,会生成一个 yolov5s_in_f32.npz
文件,该文件是模型的输入文件。
MLIR 转 INT8 模型 (仅支持 INT8 量化模型)
量化成 INT8 模型前需要运行 calibration.py,得到校准表,输入数据的数量根据情况准备 100~1000 张左右,这里演示准备了 100 张 COCO2017 的图片:
run_calibration.py yolov5s.mlir \
--dataset ../COCO2017 \
--input_num 100 \
-o yolov5s_cali_table
然后用校准表生成 int8 对称 cvimodel:
model_deploy.py \
--mlir yolov5s.mlir \
--quant_input --quant_output \
--quantize INT8 \
--calibration_table yolov5s_cali_table \
--processor cv181x \
--test_input yolov5s_in_f32.npz \
--test_reference yolov5s_top_outputs.npz \
--tolerance 0.85,0.45 \
--model yolov5_cv181x_int8_sym.cvimodel
编译完成后,会生成名为 yolov5_cv181x_int8_sym.cvimodel
的文件。