135、YOLOv12核心架构深度解剖(十):YOLOv12推理部署框架ONNX/TensorRT/NCNN适配指南——从PyTorch到移动端的全链路部署实战
135、YOLOv12核心架构深度解剖(十):YOLOv12推理部署框架ONNX/TensorRT/NCNN适配指南——从PyTorch到移动端的全链路部署实战兄弟们,今天这篇咱们不聊训练,聊点更接地气的——部署。前阵子有个做工业质检的朋友半夜给我打电话,说他的YOLOv12在服务器上跑得飞起,一上Jetson Orin就卡成PPT,问是不是模型写错了。我让他把导出日志发过来,一看,好家伙,用的是PyTorch直接推理,连ONNX都没过。这问题我见太多了,今天就把从PyTorch到移动端的全链路部署流程掰开揉碎了讲清楚,特别是YOLOv12里那些新结构在转换时埋的雷,咱们一个个排掉。先看ONNX导出。YOLOv12和v8最大的区别是多了基于注意力机制的ELAN模块,里面有个叫RepVGGBlock的玩意儿,训练时是3x3+1x1+BN三条分支,推理时得重参数化合并成单卷积。你要是直接torch.onnx.export,导出的图里会带着BN层和add节点,TensorRT跑起来倒还行,但NCNN那边直接报不支持。正确做法是导出前先调用模型的fuse()方法,把BN折叠进卷积权重里。这里踩过坑——YOLOv12的fuse()和v8不一样,它需要先冻结BN的running_mean和running_var,再遍历所有RepVGGBlock手动合并,别指望官方代码一步到位。我写了个工具函数,遍历model.modules(),遇到RepVGGBlock