海思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_52.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.sh3. 模型转换
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参数指定的尺寸。
