当前位置: 首页 > news >正文

海思3519DV500 深度学习模型转换流程

1. 背景与平台介绍

海思 Hi3519DV500 是面向智能 IPC、人脸识别、车辆识别等场景的高性能视觉 SoC,集成了双核 NNIE(Neural Network Inference Engine)以及 DSP 加速单元,支持多种深度学习网络的高效推理。将训练好的模型部署到这类终端设备上,核心环节之一就是模型转换,本文主要介绍将 PyTorch 训练得到的 .pth 权重文件转换为海思平台专用 .om 权重文件的方法。

2. 准备工作

2.1 以Ubuntu系统为例,需要在conda环境中新建一个python3.7.5虚拟环境

conda create-npy3_7_5python=3.7.5 conda activate py3_7_5

2.2 下载Hi3519DV500官方SDK,找到文件夹下的MindStudio,安装Ascend-cann-toolkit

cdMindStudiochmod+x Ascend-cann-toolkit_6.10.t03spc011b090_linux.x86_64.runsudo./Ascend-cann-toolkit_6.10.t03spc011b090_linux.x86_64.run--install

安装成功后,安装路径为: /usr/local/Ascend
设置环境变量:

source/usr/local/Ascend/ascend-toolkit/svp_latest/x86_64-linux/script/setenv.sh

3. 模型转换

3.1 将训练好的.pth文件转换为.onnx文件,以ResNet50为例。

importosimporttorch from resnet50importresnet50 def export_to_onnx(weights_path, onnx_path,num_classes=2,opset_version=13):""" 将PyTorch模型(.pth/.pt)转换为ONNX格式 参数: weights_path: PyTorch权重文件路径(.pth 或 .pt)onnx_path: 输出ONNX文件路径 num_classes: 分类类别数量 opset_version: ONNX opset版本(推荐13)""" device=torch.device("cpu")# 创建模型print(f"Creating ResNet50 model with {num_classes} classes...")model=resnet50(num_classes=num_classes)# 加载权重assert os.path.exists(weights_path), f"Weights file not found: {weights_path}"print(f"Loading weights from: {weights_path}")model.load_state_dict(torch.load(weights_path,map_location=device))# 设置为推理模式model.eval()# 创建示例输入 (1, 3, 224, 224)dummy_input=torch.randn(1,3,224,224,device=device)# 导出为ONNXprint(f"Exporting to ONNX: {onnx_path}")torch.onnx.export(model, dummy_input, onnx_path,export_params=True,opset_version=opset_version,do_constant_folding=True,input_names=['input'],output_names=['output'],dynamic_axes={'input':{0:'batch_size'},'output':{0:'batch_size'}},dynamo=False)print(f"ONNX model saved to: {onnx_path}")# 验证ONNX模型try:importonnx print("Verifying ONNX model...")onnx_model=onnx.load(onnx_path)onnx.checker.check_model(onnx_model)print("ONNX model verification passed!")# 打印模型信息print(f"\nONNX Model Info:")print(f" - Opset version: {onnx_model.opset_import[0].version}")print(f" - Inputs: {[i.name for i in onnx_model.graph.input]}")print(f" - Outputs: {[o.name for o in onnx_model.graph.output]}")except ImportError: print("onnx package not installed, skipping verification.")print("Install with: pip install onnx")except Exception as e: print(f"ONNX verification failed: {e}")if__name__=='__main__':# 配置参数WEIGHTS_PATH='./resNet50.pth'ONNX_PATH='./resnet50.onnx'NUM_CLASSES=2OPSET_VERSION=13export_to_onnx(WEIGHTS_PATH, ONNX_PATH, NUM_CLASSES, OPSET_VERSION)

3.2 在官方源码中找到对应的模型


官方sample的readme中有使用ATC工具进行模型转换的相关指令:

以onnx格式为例:

atc--model="./model/resnet50.onnx"--framework=5--output="./model/resnet50"--input_shape="input:1,3,224,224"--input_format=NCHW--soc_version=Hi3519DV500--insert_op_conf="./insert_op.cfg"--image_list="./data/image_paths.txt"--input_type="input:UINT8"--batch_num=1--log_level=0--dump_data=0--compile_mode=0--save_original_model=true--online_model_type=0--model:指定ONNX模型文件路径。--framework=5:声明输入为ONNX格式(5固定标识ONNX)。 --output:设置.om离线模型输出路径及文件名前缀。 --input_shape:定义输入张量形状(格式:节点名:批大小,通道,高,宽),必须与实际数据一致。--input_format=NCHW:指定输入数据内存排布顺序(N=批大小,C=通道,H=高,W=宽)。--soc_version=Hi3519DV500:必须匹配目标芯片型号,用于适配硬件特性。 --insert_op_conf:指定AIPP预处理配置文件,实现硬件级图像预处理(如归一化)。 --image_list:提供校准图像路径列表(每行1张),INT8量化必需,直接影响精度。--input_type=UINT8:声明输入为8位整型(0~255),与AIPP配置联动。--batch_num=1:量化校准时单次处理图像数量(嵌入式设备通常为1)。--save_original_model=true:保留原始模型中间表示,用于问题分析。--log_level=0:日志级别(0=仅错误,调试建议设3)。--dump_data=0:是否转存中间数据(0=不转存,问题定位时设1)。--compile_mode=0:编译模式(0=标准优化,1=快速模式)。--online_model_type=0:模型类型(0=离线模型,ATC仅支持0)。

其中需要注意input_shape,需要通过Netron工具查看实际输入,点击最顶部节点(通常是Conv层),在右侧的属性面板中,查看 Inputs 对应的名称和维度。

image_list是ATC模型转换时用于校准量化的图像路径列表文件,其内容格式和路径要求极为严格。必须满足:每行是一个可访问的图像绝对路径,且所有图像尺寸必须严格匹配input_shape参数指定的尺寸。

http://www.jsqmd.com/news/1113425/

相关文章:

  • 本地maven,项目没有启动按钮或有报红(缺少依赖),解决方法
  • Claude API 销售话术优化:从客户异议到成交建议
  • DRG存档编辑器:5分钟掌握《深岩银河》游戏数据修改技巧
  • 三步永久保存微信聊天记录:WeChatMsg让你的数字记忆永不丢失
  • 线性回归实战:从最小二乘到残差诊断与模型解释性
  • Cinux: 加载第一个内核:从 bootloader 跳进 C++
  • 偏科不用慌!长桥一对一补差,补齐高考短板
  • 炭黑在氮化镓(GaN)的作用
  • Navicat Mac版无限试用重置终极指南:三种免费方法快速恢复14天试用期
  • pgsql自增序列
  • FreeCad好用的快捷键:Gesture
  • 3步掌握B站视频下载:bilibili-downloader终极指南
  • Casdoor实战:从统一身份认证到AI网关的部署与集成指南
  • Coze平台AI智能体开发实战:从角色定义到多智能体协作
  • 不得不服chatgpt
  • Fofa Viewer终极指南:5分钟掌握网络安全资产搜索利器 [特殊字符]
  • 云克隆液相悬浮芯片上新啦!IFNg、IL12、IL13、IL17、IL1b、IL22、IL4、IL5、IL8、TGFb1、TNFa 联合检测
  • 时间序列分析实战:从数据诊断到生产级预测服务
  • Linux 文件查找练习
  • 发行节点与定价沟通:管理玩家预期的两个关键维度
  • 计算机Java毕设实战-基于 SpringBoot 的社区垃圾站点运维与分类管理系统的设计与实现 基于 SpringBoot 的居民垃圾分类登记【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 普通本科零基础转网安五年,如今月薪突破两万,聊聊不为人知的行业真相,转行前务必细读
  • 2026年管理者必知:番禺口才培训究竟学些什么?
  • Java毕设选题推荐:基于 SpringBoot 的高校学院摄影社团运营管理系统的设计与实现 基于 SpringBoot 的万里学院社团摄影作品【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Python接口自动化:从Requests、Pytest到Allure的完整框架搭建指南
  • AI大模型选型实战指南:成本、稳定性和数据安全三维决策
  • 计算机Java毕设实战-基于 SpringBoot 的员工上下班签到考勤管控系统的设计与实现 基于 SpringBoot 的企业请假加班考勤统计【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 应用材料、泛林布局 PLP,赛道重构对产业影响几何
  • Java毕设选题推荐:基于 SpringBoot 的垃圾分类宣传与智能监管系统的设计与实现 基于 SpringBoot 的社区垃圾投放记录统计分【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开源成果 | 灵龙 2.0 深度搭载旭日 S600,开源生态加速人形机器人应用落地