2025年12月26日

[实战] 95%检出率!基于 Orin Nano Super 与 YOLOv8 的玉米在线视觉检测方案


0. 背景:动态流水线下的视觉挑战

在农产品自动化分选场景里,传送带速度到 30 cm/s 时,传统方案常被两件事卡住:运动模糊让特征丢失,微小缺陷(虫眼、掉粒)在大图里不容易被抓住。

这篇文章拆解一套基于 NVIDIA Jetson Orin Nano Super (67 TOPS)全局快门相机 的工业级方案。核心是 “Pose 定位 + Cls 质检” 的级联架构,标注成本更低,综合检出率稳定在 95% 以上。


1. 硬件选型:算力与成像的基石

工业视觉里,硬件决定上限,算法只是把上限逼近。

1.1 成像单元:拒绝“果冻效应”

  • 相机OV9281 USB 3.0 模组 (130万像素, 120fps)。

    • 核心理由:必须使用 Global Shutter (全局快门)。在 30cm/s 速度下,卷帘快门会使玉米拉伸变形,导致算法失效。
  • 镜头8mm 工业低畸变镜头

    • 视野 (FOV):在 850mm 安装高度下,提供约 41cm 的横向视野,完美覆盖 26cm 长的玉米且留有冗余。
  • 光源高亮 LED 条形光 (双侧 45° 对射)。

    • 策略:配合 500μs 极短曝光时间,压制运动模糊。

1.2 计算单元:云边协同

  • 训练端 (Training)NVIDIA RTX 3090 (24GB)

    • 作用:利用 24GB 显存进行 imgsz=1280 的高分辨率训练,确保微小虫眼特征不丢失。
  • 推理端 (Inference)NVIDIA Jetson Orin Nano Super (8GB)

    • 作用:新款边缘平台,67 TOPS 算力能支撑双模型串行推理,同时支持 MJPEG 硬件解码。

2. 算法架构:级联式两阶段 (Cascade Two-Stage)

为了在速度和精度之间找平衡,我们没有用“单一大模型检测”,而是采用 “先看骨架,再看皮肤” 的分层处理。

2.1 架构设计图

Stage 1 (定位): YOLOv8-Pose $\rightarrow$ Filter (断头) $\rightarrow$ ROI Crop
$\downarrow$
Stage 2 (质检): YOLOv8-Cls $\rightarrow$ Sort (良品/次品)

2.2 为什么这么设计?

  1. 逻辑阻断,节省算力:第一步发现玉米“断头”,直接判定 NG 并剔除,不用进入第二步。

  2. 数字变焦,提升精度:用 ROI Crop 把玉米从 1280 大图里抠出来,再送入第二步模型,相当于变相放大了虫眼特征

  3. 标注减负:第二步改成分类 (Classification),不用画成百上千个小框,只要把图片分进“好/坏”文件夹。


3. 核心实现细节

3.1 阶段一:结构定位与粗筛

  • 模型YOLOv8n-Pose (Nano版,极致速度)。

  • 定义:Box 框住玉米,Keypoints 标记 [根部、尖部]

  • 业务逻辑

    • 完整性判别:计算根部到尖部的欧氏距离。距离低于阈值就判为 断头 (Broken)

    • 方向识别:根据 x 坐标判断大小头朝向。

    • ROI 输出:基于 Box 坐标外扩 20 像素,裁剪出更干净的玉米图像。

3.2 阶段二:精细质检

  • 模型YOLOv8s-Cls (Small版,保留更多纹理特征)。

  • 类别定义:扁平化多分类。

    • Class 0: Good (良品)

    • Class 1: Wormhole (虫眼)

    • Class 2: Missing (掉粒)

  • 关键技巧:高分辨率推理 (High-Res Inference)

    • 痛点:分类模型常用 224x224 输入,小虫眼容易被“压没”。

    • 解法:利用 Orin Nano Super 的算力,把输入设为 448x448 甚至 640x640大图输入是小缺陷检出的关键。


4. 数据策略:如何达成 95% 检出率?

模型是容器,数据才是燃料。工业场景里,数据分布往往不平衡。

4.1 数据量 KPI

阶段类别建议数量采集策略
Stage 1 (Pose)结构定位800+覆盖旋转、平移、并排等场景。需开启旋转增强 (Rotation)。
Stage 2 (Cls)Good (良品)1500+自动录制传送带视频,脚本自动抠图。
Stage 2 (Cls)Bad (次品)300+/类瓶颈所在。 必须保证各类缺陷均衡。

4.2 “取巧”技巧:物理仿真

如果“坏玉米”样本太少导致精度上不去,建议用物理仿真补数据:

  • 模拟虫眼:使用电钻在好玉米上钻出不同孔径的洞。

  • 模拟掉粒:人为抠除部分玉米粒。

  • 模拟霉斑:使用黑色马克笔在表面随机点涂。

注意:深度学习学习的是“黑色凹陷/斑点”的特征,物理模拟的数据对模型极其有效。


5. 部署与优化:Orin Nano Super

5.1 TensorRT 加速

不要直接运行 .pt 文件。在 Orin Nano 上,必须将模型转换为 TensorRT 引擎:

# 转换 Pose 模型 (FP16精度)
yolo export model=yolov8n-pose.pt format=engine half=True device=0
# 转换 Cls 模型 (注意 imgsz 设为大分辨率)
yolo export model=yolov8s-cls.pt format=engine imgsz=448 half=True device=0

5.2 伪代码逻辑 (Python)

import cv2
from ultralytics import YOLO
# 加载 TensorRT 引擎
model_pose = YOLO('corn_pose.engine')
model_cls = YOLO('corn_cls.engine')
# 打开 USB 3.0 MJPEG 流 (利用硬件解码)
cap = cv2.VideoCapture("v4l2src ... ! nvv4l2decoder ...")
while True:
frame = cap.read() # 1280x800
# Stage 1: 定位 (低耗时)
results_pose = model_pose(frame, imgsz=640, verbose=False)
for r in results_pose:
# 逻辑剔除:断头
if is_broken(r.keypoints):
signal_plc("REJECT_BROKEN")
continue
# ROI 裁剪 (数字变焦)
crop_img = get_crop(frame, r.boxes)
# Stage 2: 质检 (大分辨率输入)
# 输入 448x448 以保留虫眼特征
results_cls = model_cls(crop_img, imgsz=448, verbose=False)
if results_cls[0].probs.top1 == 0: # Class 0 is Good
signal_plc("PASS")
else:
signal_plc("REJECT_DEFECT")

6. 总结

这套方案的价值在于**“扬长避短”**:

  1. 扬硬件之长:用 RTX 3090 做高分辨率训练,用 Orin Nano Super (67T) 做多模型推理。

  2. 避标注之短:把复杂缺陷检测转成图片分类,落地门槛更低。

通过 OV9281 全局快门 解决运动模糊,Pose 模型 做结构筛选,Cls 模型 做外观质检,这是一套经得起实战的工业视觉组合拳。