华为昇腾310B1平台深度学习算法模型转换

目录

1 模型转换(集成nms算子到模型中)

1.1 基础模型说明

1.2 模型转换

1.2.1 设置环境变量

1.2.2 安装yolov5依赖(gcc需要>7.5)

1.2.3 转换fp16模型

2 模型转换(使用atc,不集成nms算子)

参考文献:


1 模型转换(集成nms算子到模型中)

1.1 基础模型说明

对于Yolov5模型,华为提供了单独的脚本执行转换,目的通过自定义的Yolov5后处理算子将NMS操作集成到离线模型中,提高推理性能。Yolov5模型转换脚本位于计算库的ascend_yolov5_pt2om,模型转换时使用官方原始yolov5s-v6.1为基础训练的人车非.pt模型,该模型有3个输出。转换工具会自动将3个输出合并为一个输出,并转为onnx模型,之后再转为om模型。默认精度为FP16。

对于INT8,当前转换工具量化后准确率有下降,对于实时性强的场景不适合,暂不使用。

ascend_yolov5_pt2om已上传到csdn资源(你自己的百度网盘里面也有一份)https://download.csdn.net/download/u013171226/89286331?spm=1001.2014.3001.5501

1.2 模型转换

模型转换主要是将.pt模型转为Ascentd可推理的.om模型,包括三种数据类型(fp16、fp32和int8),模型转换过程下。模型转换使用ascend_yolov5_pt2om工程实现。

1.2.1 设置环境变量

source /usr/local/Ascend/ascend-toolkit/set_env.sh 

1.2.2 安装yolov5依赖(gcc需要>7.5)

pip install -r requirements.txtpip install onnx
pip install onnxruntime==1.6.0
pip install onnxsimpip install opc-tool==0.1.0
pip install decorator 
pip install protobuf==3.20.3
pip install numpy

1.2.3 转换fp16模型

bash common/pth2om.sh --version 6.1 --type fp16 --model yolov5_pcb_608_out3 --img_size 608 --class_num 3 --bs 1 --soc Ascend310B1

其中pth2om.sh脚本内容如下,在ascend_yolov5_pt2om文件夹里面有

## 帮助信息
### === Model Options ===
###  --version      yolov5 tags [2.0/3.1/4.0/5.0/6.0/6.1], default: 6.1
###  --model        yolov5[n/s/m/l/x], default: yolov5s
###  --bs           batch size, default: 4
### === Build Options ===
###  --type         data type [fp16/int8], default: fp16
###  --calib_bs     batch size of calibration data (int8 use only), default: 16
### === Inference Options ===
###  --mode         infer/val, default: infer
###  --conf         confidence threshold, default: 0.4
###  --iou          NMS IOU threshold, default: 0.5
###  --output_dir   output dir, default: output
### === Environment Options ===
###  --soc          soc version [Ascend310/Ascend310P?], default: Ascend310
### === Help Options ===
###  -h             print this messagehelp() {sed -rn 's/^### ?//;T;p;' "$0"
}## 参数设置
GETOPT_ARGS=`getopt -o 'h' -al version:,model:,img_size:,channel_num:,bs:,class_num:,type:,calib_bs:,mode:,conf:,iou:,output_dir:,soc: -- "$@"`
eval set -- "$GETOPT_ARGS"
while [ -n "$1" ]
docase "$1" in-h) help; exit 0 ;; --version) version=$2; shift 2;;--model) model=$2; shift 2;;--img_size) img_size=$2; shift 2;;--channel_num) channel_num=$2; shift 2;;--bs) bs=$2; shift 2;;--class_num) class_num=$2; shift 2;;--type) type=$2; shift 2;;--calib_bs) calib_bs=$2; shift 2;;--mode) mode=$2; shift 2;;--conf) conf=$2; shift 2;;--iou) iou=$2; shift 2;;--output_dir) output_dir=$2; shift 2;;--soc) soc=$2; shift 2;;--) break ;;esac
doneif [[ -z $version ]]; then version=6.1; fi
if [[ -z $model ]]; then model=yolov5s; fi
if [[ -z $img_size ]]; then img_size=608; fi
if [[ -z $channel_num ]]; then channel_num=3; fi
if [[ -z $bs ]]; then bs=4; fi
if [[ -z $class_num ]]; then class_num=3; fi
if [[ -z $type ]]; then type=fp16; fi
if [[ -z $calib_bs ]]; then calib_bs=16; fi
if [[ -z $mode ]]; then mode=infer; fi
if [[ -z $conf ]]; then conf=0.4; fi
if [[ -z $iou ]]; then iou=0.5; fi
if [[ -z $output_dir ]]; then output_dir=output; fi
if [[ -z $soc ]]; then echo "error: missing 1 required argument: 'soc'"; exit 1 ; fiif [[ ${type} == fp16 ]] ; thenargs_info="=== pth2om args === \n version: $version \n model: $model \n bs: $bs \n type: $type \n mode: $mode \n conf: $conf \n iou: $iou \n output_dir: $output_dir \n soc: $soc"echo -e $args_info
elseargs_info="=== pth2om args === \nversion: $version \n model: $model \n bs: $bs \n type: $type \n calib_bs: $calib_bs \n mode: $mode \n conf: $conf \n iou: $iou \n output_dir: $output_dir \n soc: $soc"echo -e $args_info
fiif [ ! -d ${output_dir} ]; thenmkdir ${output_dir}
fi## pt导出om模型
echo "Starting 修改pytorch源码"
git checkout . && git checkout v${version}
git apply v${version}/v${version}.patchecho "Starting 导出onnx模型并简化"
if [[ ${version} == 6* ]] ; thenpython3 export.py --weights=${model}.pt --imgsz=${img_size} --batch-size=${bs} --opset=11 --dynamic || exit 1
elsepython3 models/export.py --weights=${model}.pt --img-size=${img_size} --batch-size=${bs} --opset=11 --dynamic || exit 1
fi
python3 -m onnxsim ${model}.onnx ${model}.onnx --dynamic-input-shape --input-shape images:${bs},${channel_num},${img_size},${img_size} || exit 1
model_tmp=${model}if [ ${type} == int8 ] ; thenecho "Starting 生成量化数据"python3 common/quantize/generate_data.py --img_info_file=common/quantize/img_info_amct.txt --save_path=amct_data --batch_size=${calib_bs} --img_size=${img_size} || exit 1if [[ ${version} == 6.1 && ${model} == yolov5[nl] ]] ; thenecho "Starting pre_amct"python3 common/quantize/calibration_scale.py --input=${model}.onnx --output=${model}_cali.onnx --mode=pre_amct || exit 1echo "Starting onnx模型量化"bash common/quantize/amct.sh ${model}_cali.onnx || exit 1if [[ -f ${output_dir}/result_deploy_model.onnx ]];thenmv ${output_dir}/result_deploy_model.onnx ${model}_amct.onnxfirm -rf ${model}_cali.onnxecho "Starting after_amct"python3 common/quantize/calibration_scale.py --input=${model}_amct.onnx --output=${model}_amct.onnx --mode=after_amct || exit 1elseecho "Starting onnx模型量化"bash common/quantize/amct.sh ${model}.onnx || exit 1if [[ -f ${output_dir}/result_deploy_model.onnx ]];thenmv ${output_dir}/result_deploy_model.onnx ${model}_amct.onnxfifimodel_tmp=${model}_amctif [[ -f ${output_dir}/result_* ]];thenrm -rf  ${output_dir}/result_result_fake_quant_model.onnxrm -rf  ${output_dir}/result_quant.jsonfi
fiecho "Starting 修改onnx模型,添加NMS后处理算子"
python3 common/util/modify_model.py --pt=${model}.pt --onnx=${model_tmp}.onnx --img-size=${img_size} --class-num=${class_num} --conf-thres=${conf} --iou-thres=${iou} || exit 1echo "Starting onnx导出om模型(有后处理)"
bash common/util/atc.sh infer ${model_tmp}_nms.onnx ${output_dir}/${model_tmp}_nms ${img_size} ${channel_num} ${bs} ${soc} || exit 1
rm -rf ${model_tmp}_nms.onnxif [[ ${mode} == val ]] ; thenecho "Starting onnx导出om模型(无后处理)"bash common/util/atc.sh val ${model_tmp}.onnx ${output_dir}/${model_tmp} ${bs} ${soc} || exit 1rm -rf ${model_tmp}.onnx
fiecho -e "pth导出om模型 Success \n"

然后atc.sh脚本内容如下,在ascend_yolov5_pt2om文件夹里面也有

mode=$1
onnx=$2
om=$3
img_size=$4
channel_num=$5
bs=$6
soc=$7if [ ${mode} == val ];theninput_shape="images:${bs},${channel_num},${img_size},${img_size}"input_fp16_nodes="images"
elif [ ${mode} == infer ];theninput_shape="images:${bs},${channel_num},${img_size},${img_size};img_info:${bs},4"input_fp16_nodes="images;img_info"
fiif [[ ${soc} == Ascend310 ]];thenatc --model=${onnx} \--framework=5 \--output=${om}_bs${bs} \--input_format=NCHW \--input_shape=${input_shape} \--log=error \--soc_version=${soc} \--input_fp16_nodes=${input_fp16_nodes} \--output_type=FP16
fiif [[ ${soc} == Ascend310B1 ]];thenatc --model=${onnx} \--framework=5 \--output=${om}_bs${bs} \--input_format=NCHW \--input_shape=${input_shape} \--log=error \--soc_version=${soc} \--optypelist_for_implmode="Sigmoid" \--op_select_implmode=high_performance \--fusion_switch_file=common/util/fusion.cfg \--insert_op_conf=aipp_yolov5.cfg#--input_fp16_nodes=${input_fp16_nodes} #--output_type=FP16 
fiif [[ ${soc} == Ascend310P? ]];thenatc --model=${onnx} \--framework=5 \--output=${om}_bs${bs} \--input_format=NCHW \--input_shape=${input_shape} \--log=error \--soc_version=${soc} \--optypelist_for_implmode="Sigmoid" \--op_select_implmode=high_performance \--fusion_switch_file=common/util/fusion.cfg \--insert_op_conf=aipp_yolov5.cfg#--input_fp16_nodes=${input_fp16_nodes} #--output_type=FP16 
fiif [[ ${soc} == Ascend710 ]];thenatc --model=${onnx} \--framework=5 \--output=${om}_bs${bs} \--input_format=NCHW \--input_shape=${input_shape} \--log=error \--soc_version=${soc} \--optypelist_for_implmode="Sigmoid" \--op_select_implmode=high_performance \--fusion_switch_file=common/util/fusion.cfg #--insert_op_conf=aipp_yolov5.cfg
#       --insert_op_conf=aipp.cfg
#       --insert_op_conf=aipp_yolov5.cfg
fiif [[ ${soc} == Ascend910 ]];thenatc --model=${onnx} \--framework=5 \--output=${om}_bs${bs} \--input_format=NCHW \--input_shape=${input_shape} \--log=error \--soc_version=${soc} \--optypelist_for_implmode="Sigmoid" \--op_select_implmode=high_performance \--fusion_switch_file=common/util/fusion.cfg #--insert_op_conf=aipp_yolov5.cfg
#       --insert_op_conf=aipp.cfg
#       --insert_op_conf=aipp_yolov5.cfg
fi

2 模型转换(使用atc,不集成nms算子)

      上述模型转换都是基于.pt文件转换为.om模型文件。另外,还可以直接应用atc工具将onnx模型转为.om模型。

bash common/util/atc.sh infer yolov5_pcb_608_out3_nms.onnx output/yolov5_pcb_608_out3_nms 1 Ascend310B1

或者直接使用atc工具转换

      (1)人车非模型
        atc --model=yolov5_pcb_608_out3_nms.onnx \
            --framework=5 \
            --output=yolov5_pcb_608_out3_bs4 \
            --input_format=NCHW \
            --input_shape="images:1,3,640,640;img_info:1,4" \
            --log=error \
            --soc_version=Ascend710 \
            --optypelist_for_implmode="Sigmoid" \
            --op_select_implmode=high_performance 
        
      (2)行人结构化模型
        atc --model=pedes_structure.onnx \
            --framework=5 \
            --output=pedes_structure \
            --input_format=NCHW \
            --input_shape="x:-1,3,224,224" \
            --dynamic_batch_size="1,2,4,8" \
            --log=error \
            --soc_version=Ascend710 \
            --optypelist_for_implmode="Sigmoid" \
            --op_select_implmode=high_performance 

参考文献:

海思Hi3519 DV500 部署yolov5并加速优化_dv500移植yolov5-CSDN博客

samples: CANN Samples - Gitee.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm2024版,更换安装源

1、选择Python Packages 2、点击图中的小齿轮 3、点击 号 4、添加源地址 常用源如下: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn…

【3】STM32·FreeRTOS·任务挂起和恢复

目录 一、任务的挂起与恢复的API函数 1.1、任务挂起函数介绍 1.2、任务恢复函数介绍(任务中恢复) 1.3、任务恢复函数介绍(中断中恢复) 二、任务挂起与恢复实验 一、任务的挂起与恢复的API函数 API函数描述vTaskSuspend()挂起…

HTML5 Canvas发光Loading动画特效源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的,整个loading动画是发光3D的视觉效果,HTML5非常强大。 …

索引失效情况

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 一、索引列上运算操作。 不要在索引列上进行运算操作,否则索引会失效。 在tb_user的phone列加上索引,然后进行条件查询&am…

nginx自动部署-跨操作系统

项目里面有一个需求,就是需要用让nginx进程提供给系统管理一个start,stop和getPid方法,这样系统管理可以自动拉起来nginx,达到自动部署的目的。离线部署同样适用 这样一来,我就需要提供windows版本linux不同版本的nginx源码包&am…

解决Vue devtools插件数据变化不会自动刷新

我们使用devtools插件在监测vuex中表单或自定义组件的数据,发现页面数据发生变化后,但是devtools中还是老数据,必须手动点击devtools刷新才能拿到最新的数据。很烦! 解决方案: 打开chrome的设置,向下翻&…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中,Stream流是Java 8引入的一个重要概念,它提供了一种新的处理集合的方式,可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作,比如过滤、映射、排序、聚合等,同时也支持并行处理&#xf…

SAP供应商预付款业务

业务理解: 预付账款是企业向供应商预付的款项 应付账款是企业尚未支付的款项。 两者区别: 预付账款属于企业的资产,应计入预付账款科目中,而应付账款属于企业的负债,应计入应付账款科目中。应付账款是提前支付的…

macOS 如何使用Visual Studio Code 编译C++

在 macOS,则默认系统 C++ 编译器是 Clang。 要使用 Visual Studio Code 在 macOS 上的 Clang 中指定 C++ 版本,可以按如下所示修改tasks.json 文件: 在 Visual Studio Code 中打开您的 C++ 项目。按 Ctrl+Shift+P(或 macOS 上的 Cmd+Shift+P)打开命令面板。在命令面板中键…

自学错误合集--MessageSource国际化接口

java后端自学错误总结 一.MessageSource国际化接口总结 一.MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析 消息,并支持消息的…

字节、进制、字符串格式化

文章目录 1.字节2.不同的进制之间转换数值3.bytes()用法4.struct.unpack()用法5.字符串格式化{:03.2f} 1.字节 字节(Byte)是计算机存储和处理数据的基本单位之一。一个字节可以存储8个二进制位(bit),每个二进制位可以…

【Android】使用Handler实现一个定时器

需求 实现一个定时任务,每隔一秒执行一次 实现 使用Handler实现 private Handler topUIHandler;private void initTopUiHandler() {topUIHandler new Handler(getMainLooper()) {Overridepublic void handleMessage(Message msg) {//执行这个定时任务updateTop…

软件项目管理期末复习题8-16章

第八章软件项目质量计划 一、填空题 1、(审计)是对过程或产品的一次独立质量评估。 2、质量成本包括预防成本和(缺陷成本)。 3、(软件质量)是软件满足明确说明或者隐含的需求的程度。 5、McCall质量模…

【华为】IPSec VPN手动配置

【华为】IPSec VPN手动配置 拓扑配置ISP - 2AR1NAT - Easy IPIPSec VPN AR3NATIPsec VPN PC检验 配置文档AR1AR2 拓扑 配置 配置步骤 1、配置IP地址,ISP 路由器用 Lo0 模拟互联网 2、漳州和福州两个出口路由器配置默认路由指向ISP路由器 3、进行 IPsec VPN配置&…

数据的输入和输出

早期的总线系统 为了解决通信的问题、主板上铺设了一条公共线路、各个设备都连接到这条线路上、不管谁要和谁通信、都能使用它来传输、这条线路就是总线。 总线上有CPU、内存、鼠标、键盘、硬盘、网卡、声卡、显卡等… 说是一条总线、实际上是包含了传输数据的数据总线、传输…

场景文本检测识别学习 day09(Swin Transformer论文精读)

Swin Transformer Swin Transformer 提出ViT具有两个缺点: 1. 没有多尺度特征 ,不能生成多尺度的特征图传给FPN (检测) \ U-Net (分割),从而对于不同大小的物体都能进行良好感知,即只有16 * 16的patch尺寸 2. 全局计算自注意力浪…

智密腾讯云直播组建--准备腾讯云环境

在准备接入之前,开发者需要自行准备腾讯云方面以及uniapp方面所需的资料,申请对应的服务与应用数据,本篇将教您如何从0开始完成腾讯云环境准备全部步骤所需资料 本服务依赖于腾讯云云服务,从而为直播间提供业务支持。通过腾讯多个…

js 关于数组排序的方法

在JavaScript中,数组排序主要有两种主要方法:Array.prototype.sort() 和自定义排序函数。 Array.prototype.sort() sort() 方法按照字符串Unicode码点顺序对数组元素进行排序,并返回数组。对于非字符串类型的数组元素,sort() 方…

springcloud第4季 springcloud-alibaba之sentinel2

一 sentinel实操实例 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。

使用Java动态创建Flowable会签模型

theme: channing-cyan 在企业级应用开发中,工作流管理系统如Flowable扮演着至关重要的角色,特别是在自动化业务流程、任务分配和审批流程设计上。动态创建流程模型,尤其是会签(Parallel Gateway)模型,是提…