香橙派aipro 原版yolov5运行

背景

使用github上的yolov5模型在aipro上推理。比较官方示例中的模型和github上模型的推理速度,并尝试提升github上模型的推理速度。

准备

模型准备

在服务器上(我这里是ubuntu+nvidia GPU)准备原版代码 pt 模型,再将pt模型转为onnx。github下载的原版onnx可能会有问题,没有仔细验证了。
我的转换命令如下

python export.py --weights yolov5s.pt --include onnx --opset 11

amct工具准备

在aipro上准备,用于对onnx进行量化,量化后再用atc工具转om。
参考:昇腾官方文档

推理

使用atc工具将onnx转为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

使用samples中yolov5的推理代码。但有以下两点需要注意。

  1. 输入数据需要使用float16。
  2. 需要归一化操作,即除以255。

每一个关键操作耗时

我这里的每一个关键操作耗时如下

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秒

samples中om模型每一个关键操作耗时

这是示例中使用模型文件的耗时分析,与原版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完成以下两个功能。

  1. BGR转RGB;
  2. 归一化,即除以255。
    配置文件如下:
# 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
}

重新转换为om模型

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秒

推理优化——aipp + amtc(未完成)

amtc量化

参考:官方文档
先准备量化需要的数据,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"

量化后转om

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秒
仅仅只有两毫秒的加速。
感觉优化不明显,不知道是不是哪一步有错误。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值