赞
踩
使用github上的yolov5模型在aipro上推理。比较官方示例中的模型和github上模型的推理速度,并尝试提升github上模型的推理速度。
在服务器上(我这里是ubuntu+nvidia GPU)准备原版代码和 pt 模型,再将pt模型转为onnx。github下载的原版onnx可能会有问题,没有仔细验证了。
我的转换命令如下
python export.py --weights yolov5s.pt --include onnx --opset 11
在aipro上准备,用于对onnx进行量化,量化后再用atc工具转om。
参考:昇腾官方文档
命令如下:
atc --model=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/yolov5s.onnx \
--framework=5 \
--output=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/yolov5s \
--input_format=NCHW \
--input_shape="images:1,3,640,640" \
--log=error \
--soc_version=Ascend310B1
我这里的每一个关键操作耗时如下
img, scale_ratio, pad_size = preprocess_image(image, cfg)
预处理用时: 0.10348892211914062秒
output = model.infer([img])[0]
推理用时: 0.033591270446777344秒
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
nms花费时间:0.004331827163696289秒
这是示例中使用模型文件的耗时分析,与原版yolo相比,主要是少了归一化操作,少了约100毫秒。
img, scale_ratio, pad_size = preprocess_image(image, cfg)
预处理用时: 0.006201028823852539秒
output = model.infer([img])[0]
推理用时: 0.03976249694824219秒
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
nms花费时间:0.004087924957275391秒
参考:官方文档
编写aipp配置文件,这里只使用aipp完成以下两个功能。
# AIPP的配置以aipp_op开始,标识这是一个AIPP算子的配置,aipp_op支持配置多个
aipp_op {
aipp_mode: static
related_input_rank: 0
input_format: RGB888_U8
src_image_size_w: 640
src_image_size_h: 640
csc_switch: false
rbuv_swap_switch :true
var_reci_chn_0: 0.003906
var_reci_chn_1: 0.003906
var_reci_chn_2: 0.003906
}
atc --model=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/yolov5s_11.onnx \
--framework=5 \
--output=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/yolov5s_aipp \
--input_format=NCHW \
--input_shape="images:1,3,640,640" \
--log=error \
--soc_version=Ascend310B1 \
--insert_op_conf=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/aipp.conf
这时图片预处理就可以省略图片通道转化和归一化的操作,同时输入数据也不需要使用float,保持原有的 uint8 即可。
这时预处理时间只需要3毫秒即可。速度与samples中的om模型基本一致。
预处理用时: 0.0030858516693115234秒
推理用时: 0.03559446334838867秒
nms花费时间:0.004183053970336914秒
参考:官方文档
先准备量化需要的数据,Python脚本如下。
import cv2 from pathlib import Path from det_utils import letterbox import random import numpy as np image_folder = "/home/HwHiAiUser/D/disk/coco/val2017" bin_file = "/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/bin/calibration.bin" paths = [str(i) for i in Path(image_folder).rglob("*.jpg")] random.shuffle(paths) paths = paths[:1] images = np.zeros((1, 3, 640, 640), dtype=np.float32) for idx, path in enumerate(paths): image = cv2.imread(path) image, scale_ratio, pad_size = letterbox(image, new_shape=(640, 640)) image = image[:, :, ::-1] image = image.transpose(2, 0, 1).astype(np.float32) image /= 255 images[idx] = image images = np.ascontiguousarray(images) images.tofile(bin_file) print("finish")
使用amtc量化,这时可以明显可以减少模型大小。
amct_onnx calibration \
--model /home/HwHiAiUser/samples/aipro-sample-code/yolo/data/weight/yolo_official/yolov5s_11.onnx \
--save_path /home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/ret \
--input_shape "images:1,3,640,640" \
--data_dir "/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/bin" \
--data_types "float32"
atc --model=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/ret_deploy_model.onnx \
--framework=5 \
--output=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/ret_deploy_model_aipp \
--input_format=NCHW \
--input_shape="images:1,3,640,640" \
--log=error \
--soc_version=Ascend310B1 \
--insert_op_conf=/home/HwHiAiUser/samples/aipro-sample-code/yolo/data/amtc_data/aipp.conf
仅使用aipp时执行100次推理平均耗时:0.0350206732749939秒
使用amtc+aipp执行100次推理平均耗时:0.032894270420074465秒
仅仅只有两毫秒的加速。
感觉优化不明显,不知道是不是哪一步有错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。