1. 课程导入与场景锚定
在正式动手导出模型之前,先把三件事看清楚:我们要解决的农业识别任务到底长什么样、ONNX在其中扮演什么角色、以及这门课会带你做出什么。很多同学一上来就急着敲 torch.onnx.export,结果模型在服务器上跑得好好的,一放到田间地头的边缘设备上就报错、变慢、精度掉点。根本原因往往不是导出命令写错了,而是对"任务—模型—运行时—硬件"这条链路缺乏整体认知。本节就是帮你把这条链路先搭起来。
农业识别任务全景:不是只有"分类"
农业场景下的视觉识别任务,按输出形态大致可以分成四类,它们对模型导出和部署的要求差异很大:
- 图像分类:判断一张图属于哪一类,例如作物病害类别(健康、叶斑病、锈病)、成熟度等级。输出是一个概率向量,后处理最简单,导出时最不容易出问题。
- 目标检测:定位并识别多个对象,例如数果实、找虫害、检测杂草。输出通常是边界框坐标加类别分数,后处理涉及 NMS(非极大值抑制),是导出后最容易"精度对不上"的环节。
- 语义分割:逐像素分类,例如地块分割、病斑区域面积统计。输出是与输入同尺寸(或下采样后)的掩码,对输入尺寸的动态性较敏感。
- 关键点/姿态:例如植株茎秆关键点、果实采摘点定位,输出是坐标点集合,常用于采摘机器人。
这四类任务的共同点是:训练框架多为 PyTorch,而最终落地的设备五花八门——云端 GPU 服务器、田间边缘盒子(如 Jetson 系列)、工控机、甚至手机 App。训练环境和部署环境的这种"错位",正是 ONNX 要解决的问题。
ONNX 的角色:模型世界的"通用插头"
ONNX(Open Neural Network Exchange)是一种开放的模型表示格式。你可以把它理解成模型世界的通用插头:PyTorch、TensorFlow、PaddlePaddle 等框架训练出的模型,先转换成 ONNX 这个中间表示,再由 ONNX Runtime、TensorRT、OpenVINO 等推理引擎加载执行。它的价值体现在三个层面:
框架解耦——部署端不需要安装庞大的训练框架,只需要一个轻量推理引擎;硬件解耦——同一份 ONNX 模型可以通过不同 Execution Provider 跑在 CPU、CUDA GPU、TensorRT、OpenVINO 等后端上;图优化——ONNX 图在导出和推理阶段可以做算子融合、常量折叠等优化,提升推理速度。
但要注意,ONNX 不是"万能转换器"。它只保证计算图结构的可移植性,不保证每个算子在所有后端都被支持,也不保证数值结果逐位一致。所以导出之后必须做一致性校验,这一点后面章节会反复强调。
课程实战项目:一个贯穿始终的病害识别模型
为了让知识不悬空,本课程围绕一个具体的实战项目展开:作物叶片病害分类模型。设定如下(均为教学示例,非实测数据):输入为 224×224 的 RGB 叶片图像,主干网络采用轻量级卷积网络,输出 5 类——健康、叶斑病、锈病、白粉病、虫害。训练在 PyTorch 中完成,最终目标是让这个模型能同时跑在云端服务器和一台边缘设备上。
选择分类任务作为主线,是因为它足够简单,能把注意力集中在"导出—校验—部署"这条主链上;同时它又足够真实,涵盖了农业识别中最常见的落地形态。在后续章节中,我们会逐步加入动态 batch、预处理融合、量化等进阶内容,让这个项目从"能跑"走向"好用"。
学习路径:四段式推进
整门课按能力递进分为四个阶段,你可以对照自己的基础选择性加速:
- 认知与准备(第 1–6 章):理解 ONNX 生态、环境搭建、模型结构与输入输出签名梳理。这一阶段的关键产出是"知道自己要导出什么"。
- 导出与校验(第 7–15 章):掌握
torch.onnx.export的关键参数(opset、dynamic_axes、input_names/output_names),处理常见算子不支持问题,并用 ONNX Runtime 做数值一致性比对。这一阶段的关键产出是"一份可信的 .onnx 文件"。 - 优化与加速(第 16–23 章):图优化、算子融合、INT8 量化、动态尺寸适配,以及不同 Execution Provider 的选择与调优。关键产出是"满足端侧时延与体积要求的模型"。
- 部署与工程化(第 24–30 章):在边缘设备上完成推理服务封装、预处理/后处理对齐、性能压测与上线检查。关键产出是"可交付的部署方案"。
先建立一条判断标准
在后续所有章节中,我们都用同一套标准判断"导出是否成功":其一,ONNX 模型能被 ONNX Runtime 正常加载且无算子告警;其二,在相同输入下,ONNX 输出与 PyTorch 输出的最大绝对误差在可接受范围内(分类任务通常关注 top-1 是否一致,数值误差可参考 1e-4 量级);其三,端侧推理时延与内存占用满足业务约束。这三条会在不同章节被反复使用,请先记住它们。
现在你已经知道这门课要做什么、为什么用 ONNX、以及会经过哪些阶段。接下来就可以进入环境准备,把工具链装起来,让第一个模型真正跑通导出流程。