从ONNX到NCNN:Android端模型部署的完整环境搭建与转换实战
1. 环境准备搭建Windows下的开发工具链在开始ONNX到NCNN的模型转换之前我们需要先配置好开发环境。这个过程就像盖房子前要准备砖块和水泥一样缺一不可。我去年在给公司部署人脸识别模型时就因为没有正确配置环境浪费了两天时间后来才发现是OpenCV版本不兼容的问题。首先需要安装的是Visual Studio 2019。建议选择16.11版本虽然其他小版本也能用但这个版本最稳定。安装时只需要勾选C桌面开发组件就够了其他组件用不上。安装完成后记得检查下是否安装了Windows 10 SDK版本19041或更高这个在后面编译时会用到。接下来是CMake的安装。我推荐使用3.19.1版本实测下来这个版本和后续工具链配合最好。安装完成后需要把CMake的bin目录比如C:\Program Files\CMake\bin添加到系统环境变量Path中。测试是否安装成功很简单打开cmd输入cmake --version能看到版本号就说明安装正确。OpenCV的安装稍微复杂些。建议使用3.4.10版本这个版本和NCNN的兼容性最好。下载后解压到某个目录比如D:\opencv然后需要把OpenCV的bin目录D:\opencv\build\x64\vc15\bin添加到用户环境变量中。这里有个坑要注意一定要添加到用户变量而不是系统变量否则可能会和其他软件冲突。2. 编译Protobuf模型转换的基础组件Protobuf是Google开发的一个序列化工具NCNN用它来处理模型参数。就像快递打包需要统一的包装盒一样Protobuf就是模型参数的标准包装。我在第一次编译时遇到了不少问题后来发现是版本选择不当导致的。我们需要使用protobuf 3.4.0版本可以从GitHub下载源码。解压后在开始菜单找到x64 Native Tools Command Prompt for VS 2019右键以管理员身份运行。这个命令行工具很重要它配置好了VS2019的编译环境。进入protobuf源码目录后依次执行以下命令mkdir build-vs2019 cd build-vs2019 cmake -GNMake Makefiles -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX%cd%/install -Dprotobuf_BUILD_TESTSOFF -Dprotobuf_MSVC_STATIC_RUNTIMEOFF ../cmake nmake nmake install这个过程大概需要15-20分钟取决于你的电脑配置。编译完成后会在build-vs2019目录下生成install文件夹里面包含了我们需要的头文件和库文件。记得把这个路径记下来后面编译NCNN时会用到。3. 编译NCNN框架打造模型运行引擎NCNN是腾讯开源的神经网络推理框架专门为移动端优化过。就像把燃油发动机改装成电动车一样我们需要把通用的ONNX模型转换成NCNN专属格式。首先克隆NCNN的源码git clone https://github.com/Tencent/ncnn.git cd ncnn git submodule update --init然后创建编译目录并配置编译选项。这里需要特别注意路径的设置我整理了一个表格说明关键参数参数名示例值说明Protobuf_INCLUDE_DIRE:/protobuf-3.4.0/build-vs2019/install/includeProtobuf头文件路径Protobuf_LIBRARIESE:/protobuf-3.4.0/build-vs2019/install/lib/libprotobuf.libProtobuf库文件路径Protobuf_PROTOC_EXECUTABLEE:/protobuf-3.4.0/build-vs2019/install/bin/protoc.exeProtobuf编译器路径OpenCV_DIRD:/opencv/buildOpenCV安装路径完整的编译命令如下mkdir build-vs2019 cd build-vs2019 cmake -GNMake Makefiles -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX%cd%/install -DProtobuf_INCLUDE_DIR你的protobuf头文件路径 -DProtobuf_LIBRARIES你的protobuf库文件路径 -DProtobuf_PROTOC_EXECUTABLE你的protoc.exe路径 -DOpenCV_DIR你的OpenCV路径 .. nmake nmake install编译过程大概需要30分钟。完成后在build-vs2019/tools/onnx目录下会生成onnx2ncnn.exe工具这就是我们转换模型的关键。4. 模型优化与转换从ONNX到NCNN拿到onnx2ncnn工具后先别急着转换。就像搬家前要整理物品一样我们需要先优化ONNX模型。原始ONNX模型往往包含很多冗余节点直接转换可能会出错。安装onnx-simplifier工具pip install -i https://pypi.douban.com/simple -U onnx-simplifier --user优化模型命令python -m onnxsim input.onnx output-sim.onnx优化完成后就可以用onnx2ncnn工具转换了onnx2ncnn output-sim.onnx model.param model.bin转换后会生成两个文件.param文件描述模型结构.bin文件保存模型参数。我在实际项目中遇到过转换失败的情况通常是以下原因ONNX模型使用了NCNN不支持的算子模型输入输出维度设置不正确ONNX版本太新与转换工具不兼容遇到问题时可以尝试用ONNX Runtime先运行原始模型确保模型本身是正确的。如果某些算子不支持可以考虑用NCNN的自定义层功能或者修改模型结构避开这些算子。5. Android端部署让模型跑在手机上有了NCNN模型文件后就可以集成到Android项目中了。这个过程就像把组装好的发动机装到汽车上需要处理好接口和动力传输。首先在Android Studio中配置NCNN把编译好的NCNN库文件.so放到app/src/main/jniLibs目录在build.gradle中配置NDK版本添加必要的头文件到cpp/include目录一个简单的图像分类示例代码#include ncnn/net.h ncnn::Net net; net.load_param(model.param); net.load_model(model.bin); ncnn::Mat in ncnn::Mat::from_pixels(image.data, ncnn::Mat::PIXEL_RGB, image.cols, image.rows); ncnn::Mat out; ncnn::Extractor ex net.create_extractor(); ex.input(input, in); ex.extract(output, out);在实际部署时有几个性能优化技巧使用NCNN的Vulkan后端可以提升GPU推理速度对输入图像做归一化处理时尽量用矩阵运算而不是循环合理设置线程数通常4线程能达到最佳性能使用FP16量化可以减小模型体积提升推理速度我在一个图像识别项目中经过这些优化后推理速度从原来的200ms降到了50ms效果非常明显。6. 常见问题与调试技巧在模型转换和部署过程中难免会遇到各种问题。根据我的经验90%的问题都集中在环境配置和模型兼容性上。环境问题排查清单检查所有环境变量是否设置正确确认VS2019的C组件完整安装验证CMake版本是否≥3.15检查Protobuf和OpenCV路径是否正确模型转换问题如果onnx2ncnn转换失败先用Netron工具查看ONNX模型结构检查模型输入输出节点名称是否匹配尝试用onnxruntime验证ONNX模型能否正常运行Android端问题如果so库加载失败检查ABI配置是否正确出现内存泄漏时使用Android Profiler工具分析对于黑屏或无输出情况检查图像预处理是否正确记得保存完整的编译日志遇到问题时这些日志能提供重要线索。去年我遇到一个诡异的编译错误后来发现是Windows路径长度限制导致的把项目移到磁盘根目录就解决了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2545529.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!