197、NCNN 平台部署 YOLOv11:模型转换、量化参数设置与 Android C++ API 推理调用
一、从一次线上崩溃说起
上个月帮客户调一个Android端YOLOv11检测App,模型在PC上跑FP32精度0.82,一上手机直接崩——NCNN加载时报“layer input shape mismatch”。查了两天,发现是ONNX导出时把动态batch写死了,NCNN解析时输入维度对不上。更坑的是,客户用的骁龙865,量化后mAP掉了12个点,最后发现是量化校准集只用了20张图,激活值分布根本没覆盖全。
这种坑我踩了不下十次。今天这篇笔记,把YOLOv11从PyTorch到NCNN的完整部署链路拆开揉碎,重点讲模型转换的暗坑、量化参数怎么调、Android端C++ API怎么封装才能跑得稳。所有代码都经过实际验证,消融实验数据来自我手头一台Redmi K60(骁龙8+)和一台小米平板5(骁龙870)。
二、模型转换:ONNX导出是第一个鬼门关
2.1 导出ONNX的正确姿势
YOLOv11的官方导出脚本默认带opset=17,但NCNN对某些算子支持不完整。我踩过的坑:torch.split在opset 17下会拆成Slice+Shape组合,NCNN解析时shape推断会炸。
正确做法