将pytorch 模型转为 ncnn模型

将pytorch 模型转为 ncnn模型(vs 2019 )

step 1 pth文件转为onnx文件

具体步骤可以参考:https://github.com/ultralytics/yolov5/blob/master/export.py
和https://blog.youkuaiyun.com/weixin_44753371/article/details/119328952的step1

step2:.onnx转ncnn模型

编译protobuf-3.4.0

下载 protobuf-3.4.0 https://github.com/google/protobuf/archive/v3.4.0.zip

cd <protobuf-root-dir>
mkdir build
cd build
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
nmake
nmake install

Build ncnn library

cd <ncnn-root-dir>
mkdir -p build
cd build
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build/install/include -DProtobuf_LIBRARIES=<protobuf-root-dir>/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build/install/bin/protoc.exe ..
nmake
nmake install

或:

cd <ncnn-root-dir>
mkdir -p build
cd build
cmake -G"Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/src -DProtobuf_LIBRARIES=<protobuf-root-dir>/build-vs2019/Release/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build-vs2019/Release/protoc.exe ..

cmake --build . --config Release

[option] -DNCNN_VULKAN=ON …

\build\tools\onnx\Release 路径下可以找到onnx2ncnn.exe文件.

onnx模型转为ncnn

cd <ncnn-root-dir>\build\tools\onnx\Release
onnx2nccn.exe <onnxfilepath> 
# 当前目录下就会出现ncnn.bin,ncnn.param文件

step2 报错处理

  • 1:nmake not find

找到nmake.exe文件的位置然后加入PATH环境变量:

D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64


  • 2: RC Pass 1: command “rc /fo CMakeFiles\cmTC_deb0b.dir/manifest.res CMakeFiles\cmTC_deb0b.dir/manifest.rc” failed (exit code 0) with the following output:
    系统找不到指定的文件。NMAKE : fatal error U1077: ““D:\Program Files\CMake\bin\cmake.exe””: 返回代码“0xffffffff”
    Stop.
    NMAKE : fatal error U1077: ““D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe””: 返回代码“0x2”
    Stop.

找到rc.exe文件的位置加入path

C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\rc.exe

将step2 的build目录清空并且将命令 替换为:

参考自:https://github.com/Tencent/ncnn/issues/2549

cd <protobuf-root-dir>
mkdir build
cd build
cmake -G"Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake

cmake --build . --config Release


cmake -G"Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF …/cmake

运行结果如下所示:

image-20210826173143846.png

cmake --build . --config Release 运行结果如下:

image-20210826174418843-1629971268515.png

Visual Studio 17 2022        = Generates Visual Studio 2022 project files.
                                 Use -A option to specify architecture.

* Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
        Use -A option to specify architecture.
    Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                   Optional [arch] can be "Win64" or "ARM".
    Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                   Optional [arch] can be "Win64" or "ARM".
    Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
                                   Optional [arch] can be "Win64" or "ARM".
    Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                   Optional [arch] can be "Win64" or "ARM".
    Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
                                   Optional [arch] can be "Win64" or "IA64".
    Visual Studio 9 2008 [arch]  = Generates Visual Studio 2008 project files.
                                   Optional [arch] can be "Win64" or "IA64".
  • 报错信息:CMake Error at CMakeLists.txt:265 (message):
    The submodules were not downloaded! Please update submodules with “git
    submodule update --init” and try again.

    # 不要使用download zip 下载 ncnn,使用git clone 下载
    git clone https://github.com.cnpmjs.org/Tencent/ncnn.git
    cd ncnn
    git  submodule update --init
    # 然后执行step2 ncnn编译操作
    

    ncnn编译成功后如下图所示:

image-20210827111116194-1630033879029.png

cmake --build . --config Release 运行结果如下:

image-20210827111836387.png

参考链接:

  • https://github.com/Tencent/ncnn/issues/2549
  • https://blog.youkuaiyun.com/weixin_44753371/article/details/119328952
  • https://github.com/ultralytics/yolov5/blob/master/export.py
  • https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017
<think>我们正在讨论如何加载或运行深度学习模型。根据用户的问题,他/她想了解如何加载或启动深度学习模型。结合站内引用,我们可以提供一些步骤和策略。引用[1]提到了深度学习模型在实际应用中的关键步骤,但没有直接说明如何加载模型。引用[2]、[3]、[4]则涉及了模型部署,这包含了加载模型的部分。特别是引用[3]提到了将PyTorch训练好的模型部署到安卓端的过程,包括将.pth文件换为ncnn支持的模型文件,然后在安卓端加载运行。引用[4]则提到了C++部署深度学习模型的学习路线,其中涉及模型量化、剪枝等优化技术,这些优化后也需要加载模型。因此,加载或运行深度学习模型的一般步骤包括:1.**模型换**(如果需要):将训练框架保存的模型换为目标部署环境支持的格式。例如,PyTorch的.pth文件可换为ONNX格式,再换为ncnn格式(用于移动端)或TensorRT引擎(用于GPU)。2.**加载模型**:在目标环境中,使用相应的库加载换后的模型文件。3.**准备输入数据**:将输入数据(如图像、文本)预处理为模型需要的格式(例如归一化、调整大小等)。4.**运行模型**:将预处理后的数据输入模型,执行前向传播(推理)得到输出。5.**后处理**:将模型的输出换为有意义的应用程序结果。具体步骤因框架和环境而异。下面以几个常见场景为例:###1.PyTorch模型加载(Python环境)在PyTorch中,加载模型通常包括以下步骤:```pythonimporttorchimporttorchvision.modelsasmodels#定义模型结构(必须与保存时一致)model=models.resnet18(pretrained=False)num_ftrs=model.fc.in_featuresmodel.fc=torch.nn.Linear(num_ftrs,10)#假设我们分类10类#加载模型权重(通常为.pth或.pt文件)model.load_state_dict(torch.load('model_weights.pth'))model.eval()#设置为评估模式(关闭dropout等)#准备输入数据(示例:一张随机图像)input_tensor=torch.randn(1,3,224,224)#输入尺寸根据模型要求调整#运行模型withtorch.no_grad():output=model(input_tensor)```###2.使用ONNX加载模型(跨框架)ONNX是一种开放格式,可以在不同框架中互操作。例如,将PyTorch模型转为ONNX后,可用ONNXRuntime运行:```pythonimportonnxruntime#加载ONNX模型ort_session=onnxruntime.InferenceSession("model.onnx")#准备输入(需要按照模型的输入名称)input_name=ort_session.get_inputs()[0].nameinput_data=...#预处理后的数据(numpy数组)#运行模型outputs=ort_session.run(None,{input_name:input_data})```###3.移动端部署(如安卓)引用[3]提到使用ncnn。一般步骤:-将PyTorch模型ONNX,再用ncnn工具转为ncnn格式(.param和.bin)。-在安卓项目中集成ncnn库,然后加载模型:```cpp#include<ncnn/net.h>ncnn::Netnet;net.load_param("model.param");net.load_model("model.bin");```-准备输入数据并推理(参考ncnn示例)。###4.边缘设备(如树莓派、Arduino)引用[2]提到部署到嵌入式芯片。通常需要将模型换为TensorFlowLite格式(.tflite):```python#在Python中加载TensorFlowLite模型importtensorflowastfinterpreter=tf.lite.Interpreter(model_path="model.tflite")interpreter.allocate_tensors()input_details=interpreter.get_input_details()output_details=interpreter.get_output_details()#准备输入数据input_data=...#预处理后的numpy数组,形状匹配interpreter.set_tensor(input_details[0]['index'],input_data)#运行interpreter.invoke()output_data=interpreter.get_tensor(output_details[0]['index'])```###注意事项-**模型格式匹配**:确保加载的模型格式与框架要求一致。-**预处理和后处理**:必须与训练时一致,否则影响结果。-**硬件加速**:部署时可利用硬件加速库如TensorRT(NVIDIAGPU)、CoreML(苹果)等。-**内存管理**:在资源受限的设备上要关注内存和计算量。以上是加载或运行深度学习模型的基本方法。实际应用中,还需根据部署环境(服务器、Web、移动端、嵌入式)选择合适的框架和优化策略。§§相关问题§§1.加载模型时出现模型结构与权重不匹配问题,如何解决?2.模型部署到嵌入式设备上需要考虑哪些资源限制?3.除了PyTorch和TensorFlow,还有哪些深度学习框架支持模型加载?4.如何优化加载深度学习模型的性能?</think> ### 如何加载或运行深度学习模型 加载和运行深度学习模型分为四个核心步骤,结合引用内容具体说明: #### 1. **模型换(格式预处理)** 训练好的模型(如PyTorch的`.pth`文件)需换为部署环境支持的格式: - 移动端:换为ncnn格式([^3]) - 嵌入式设备:换为TensorFlow Lite或专用格式([^2]) - 服务端:可转为ONNX或TensorRT格式([^4]) ```python # PyTorchONNX示例 import torch model = torch.load("model.pth") dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "model.onnx") ``` #### 2. **环境配置与库加载** - **Python环境**(服务器/PC): ```python import torch model = torch.jit.load("model.pt") # PyTorch model.eval() ``` - **移动端(安卓)**: 集成ncnn等推理框架([^3]),通过JNI调用C++代码: ```java // Android示例 Ncnn.init(); // 初始化ncnn引擎 Net net = new Net(); net.load_param("model.param"); net.load_model("model.bin"); ``` - **嵌入式设备**: 使用TensorFlow Lite Micro或专用推理引擎([^2][^4]) #### 3. **数据预处理与推理** 输入数据需匹配训练时的预处理逻辑: ```python # 图像预处理示例 import cv2 image = cv2.imread("input.jpg") image = cv2.resize(image, (224, 224)) tensor = torch.tensor(image).permute(2,0,1).float()/255.0 # 模型推理 with torch.no_grad(): output = model(tensor.unsqueeze(0)) ``` #### 4. **性能优化关键策略**([^4]) - **量化压缩**:将FP32转为INT8,减少75%内存占用 - **批处理**:一次处理多组数据提升吞吐量 - **硬件加速**:调用GPU/NPU加速芯片(安卓端用NNAPI) > **典型场景对比**: > | 部署目标 | 推荐框架 | 模型要求 | > |--------------|----------------|-------------| > | 服务器 | PyTorch/TensorRT | 无限制 | > | 安卓/iOS | ncnn/TFLite | 量化/轻量化 | > | 树莓派 | TFLite Micro | <10MB | ### 常见问题解决方案 1. **架构不匹配错误** - 原因:训练/推理环境库版本不一致 - 方案:使用`torch.jit.trace`固化模型架构 2. **移动端内存溢出** - 方案:应用模型剪枝([^4]) + INT8量化 3. **实时性不足** - 方案:批处理 + 异步推理流水线 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值