农产品分选线上的AI检测到底能不能打,我用一个真实项目给大伙儿验证了一遍。这条产线我前后跟了一个多月,从方案设计、数据采集、模型训练一路干到产线部署,最终的结果比预期还稳:检测速度从原来人工目检为主的混线状态提升了3倍以上,漏检率从6%~8%直接压到1.5%以下。这篇文章不吹方案,只复盘这一路怎么选型、怎么训练模型、怎么排坑,给准备上农产品AI检测的同行一个完整可参考的实战样本。
1. 项目背景与目标拆解:为什么非要上AI检测
1.1 传统人工目检的瓶颈,比想象中更严重
农产品检测这个事,听起来简单,做起来全是细节。我这次做的项目是一家水果初加工企业的柑橘分选线,主要检测碰压伤、霉变、腐烂、果梗残留这几类瑕疵。以前的流程是果品从分选机上来之后,经过一条皮带,靠几个老师傅站在工位旁边用肉眼快速挑出坏果。
产线的物理节拍是1秒过5个果左右,人工目检在这种速度下根本反应不过来。老师傅平均一个人一分钟能仔细看大概60到80个果,但产线速度提上去之后,实际就是“看一眼抓一把”,漏检率常年游走在6%~8%,赶上产地阴雨天气多、病虫害多发的时候,漏检率能冲到10%以上。企业最怕的不是多雇几个人,而是漏检的坏果流入市场,客诉和退货带来的损失远比人工成本大得多。
更麻烦的是质量问题不可追溯。人工挑出来的坏果随手一扔,没有记录,没有标准,同一个批次在不同班次、不同工人手里挑出来的标准可能完全不一样。产量越大越混乱,管理成本高,客户的信任度也会被一点点消耗掉。
1.2 我们定的三个硬指标和验收口径
这次项目的目标不能用“上AI、提效率”这种空话糊弄,必须在一开始就把验收标准钉死。我们和甲方反复对齐后,定下了三个核心指标,后面所有技术决策都围绕这三条展开:
- 检测节拍:单相机工位检测速度不低于每秒4个果,合计整线处理速度比人工+半自动混线提升至少2倍,目标3倍;
- 漏检率:从现有的6%左右降到2%以下,这是质量问题,属于红线指标;
- 误检率:控制在3%以内。误检率太高也不行,把好果当坏果踢出去,损耗变大,产线上会被骂死。
漏检率和误检率的定义,项目一开始我们就和甲方确认清楚了,避免验收的时候扯皮。漏检率=未检出的实际缺陷果数量 ÷ 抽样中真实缺陷果总数量 × 100%。误检率=被误判为缺陷的健康果数量 ÷ 全部抽样果数量 × 100%。
2. 方案选型与整体思路:为什么视觉AI能行
2.1 传统图像处理算法为什么搞不定农产品
立项调研的时候,我们最先考虑的不是深度学习,而是传统图像处理方案,毕竟开发成本低、部署轻。但实测下来发现,农产品表面太不“规矩”了。柑橘表面的颜色纹理复杂,不同品种、不同成熟度、不同产地的果皮底色差异很大。新鲜伤疤和老疤痕在灰度图和RGB图上看,边界模糊,传统的阈值分割、边缘检测、形态学处理,连最基础的缺陷区域分割都很难稳定完成。
以碰压伤为例,刚发生的碰压伤在果皮上只是一小块颜色加深的区域,和正常的果皮颜色过渡非常平滑,局部对比度极低。用固定阈值一类的算法去测,要么全部漏掉,要么把大量正常果皮上的斑点、花斑误判成缺陷。表面反光也是个头疼问题,柑橘果皮自带一层蜡质,在光照下形成高光区域,传统算法很容易在高光边缘产生假边界,误检率直接失控。
所以方案最终还是锁定在深度学习视觉模型上。深度学习模型对纹理、颜色、形态的抽象能力远强于手工特征,能学到“碰压伤虽然颜色接近果皮,但纹理走向和局部梯度特征不同”这类潜层规律。简单说,传统算法是在拿尺子量“标准的圆”,AI是在学“什么样的圆受过伤”,后者更适合农产品这种非标对象。
2.2 硬件选型:相机、光源、算力怎么配
硬件选型这块,我踩了好几个坑,先说结论:农产品产线检测,光源比相机重要,算力比模型大小重要。
- 相机:用的彩色工业相机,分辨率500万像素,帧率不低于30fps。柑橘这类圆形水果,单个果径在60到90mm,500万像素在单果尺寸上进行缺陷识别完全够用。太高分辨率的相机反而拖累处理速度,没必要。
- 镜头:配的是16mm定焦工业镜头,焦距定死,光圈优先保证景深覆盖果体表面弧面,防止边缘失焦。
- 光源:这套系统最难的点就在光源。柑橘是球形表面,直射光会产生大面积高光反射,影响缺陷识别。我们试了环形光、条光、同轴光,最后选了暗场反射加双侧条形光的组合,让光线尽量均匀铺开,同时把高光区域控制在果体边缘很小范围内。后续实测发现,光源角度差一度,漏检率可能差一个百分点。
- 工控机:用的是高性能工控机加独立GPU,模型推理放在GPU上跑。CPU扛模型推理在工业场景下基本不可行,后面详说。
2.3 检测任务清单和判定标准的对齐
农产品缺陷的类型非常多,不能眉毛胡子一把抓。我们和企业品控团队反复确认,把检测目标收敛为四类核心缺陷:霉变、腐烂、碰压伤、果梗残留。
这几类的优先级也不一样。霉变和腐烂属于严重缺陷,漏检就是质量事故,优先级最高,判定标准从严;碰压伤是常规缺陷,允许轻伤,但不允许重度碰伤和渗汁;果梗残留属于外观等级问题,判定标准松一些。
这里有个经验:检测范围和品控标准一定要在启动项目前写清楚。如果一开始不把缺陷分级、判定尺度确认清楚,后面模型训练、调试阈值时就会反复推翻重来,浪费至少一周时间。
3. 数据准备与模型训练:项目最重的工程量
3.1 样本采集:必须去产线真实环境下拍
模型训练绕不开数据,而农产品检测项目最容易翻车的地方恰恰是数据采集阶段。很多人图省事,用手机在办公室拍几张坏果照片,或者直接在网上找图库,这种数据训练出的模型,到了产线基本就是废的。
工业相机、暗场光、皮带运动状态,这些条件下的成像效果和手机完全不同。产线环境里果体在快速移动,有运动模糊,有背景干扰,有灰尘颗粒,这些噪声在真实环境下很常见,但如果训练数据里没有这些噪声,模型就学不会区分“瑕疵”和“环境噪声”。所以我在项目里坚持要求,样本采集必须到产线上做,直接架好相机和光源,用和正式运行一致的参数拍摄,把所有真实环境中的干扰因素拍进去。
我们总共采集了2万多个柑橘样本,连续拍了四天,覆盖不同批次的果实。采集回来的图像再经过筛选和清洗,去除模糊、遮挡、异常光照的图像,最后剩下约18000张可用图像。
3.2 标注规则的制定比标注本身更关键
标注这个环节看着简单,其实特别容易被低估。我见过很多项目败在标注不规范上:同样一个缺陷,这个人框了,那个人没框,或者有的人把整果框进去,有的人只框局部,模型训练出来之后表现飘忽不定。
我们定了这么几条标注规则:一是必须按缺陷类别单独打标签,不能标注“坏果”这种大而全的类别;二是单个果上有多个缺陷时,每个缺陷单独标注,不允许合并框;三是只标缺陷区域,不标整个果子;四是争议样本由品控人员最终裁决,标注员不能自行决定。
此外还补充了一个关键策略:对严重缺陷样本做了超额标注,比如霉变和腐烂类,我们要求优先保证全量标注,哪怕样本再少,也不能漏标。后来模型的表现证明了这一步非常值,因为漏标一个严重缺陷样本,模型就可能在推理时把一个腐烂果当成好果放过去。
3.3 模型选型与训练参数:轻量级YOLO足够用
模型选型上,我们测试了多个分割和检测网络。农产品缺陷识别有两个技术路径:一是检测框,二是分割掩码。分割掩码的定位精度更高,但部署速度慢;检测框的速度快,对硬件要求低。经过权衡,我最终选了基于YOLO架构的目标检测模型,采用小体量版本,在GPU上推理时延控制在20毫秒以内。
很多人非要上复杂的大模型,觉得准确率高。但工业产线的现实很残酷:推理速度不达标,准确率再高也白搭。我们用YOLO小模型加合理的训练策略,mAP50就能做到93%以上,完全够用。
训练参数的关键项我直接列一下:
- 输入分辨率:640x640,和工业相机原始ROI区域匹配;
- 训练轮次:200轮,早停在30轮无增益时触发;
- 优化器:SGD配合余弦退火调度器;
- 批大小:32;
- 数据增强:Mosaic增强、HSV扰动、随机翻转、随机旋转少量角度。
Mosaic增强对农产品检测特别有效,因为单张图像里果实数量有限,Mosaic把多张图拼接成一张,相当于在一张图里同时提供多个果的上下文信息,模型对密集场景和小目标的适应能力明显提高。
3.4 阈值调优:置信度、NMS、类别权重的配合
训练完模型之后,很多新手直接拿去部署,结果漏检率压不下去,误检率又高得离谱。问题多半出在推理阈值没有结合实际产线场景调优。
我们做了一轮系统性的阈值扫描实验。在验证集上,分别调整置信度阈值和NMS的IoU阈值,画出了漏检率和误检率的权衡曲线。默认置信度阈值是0.5,但在这个项目里,默认值表现并不理想。把置信度阈值降到0.3之后,漏检率明显下降,而误检率上升幅度还在可控范围内;进一步降到0.2,漏检率改善不明显,误检率却大幅上升,果断放弃。最终采用0.3作为主阈值。
为了平衡不同缺陷类别的偏置,我们给严重缺陷类(霉变、腐烂)设置了较低的类别置信度阈值,比如0.25,确保这类缺陷优先检出;给果梗残留设置了更高的0.4,降低误检率。这个策略不用重新训练模型,纯推理侧调整就能立竿见影。
这里有一个训练细节要提醒:严重缺陷样本天然少,类别不均衡会导致模型对少数类的学习和检出能力偏弱。除了常规的类别权重设置,我们还对严重缺陷的样本做了过采样和额外的旋转缩放增强,保证模型见过足够多的变化。
4. 部署到产线的实操过程与速度优化
4.1 部署环境的三大块:采集、推理、剔除联动
整个系统部署到产线后,核心链路是相机采集图像、GPU推理、剔除机构动作三块。采集端由工业相机和光电传感器触发,果体经过光电位置时触发相机抓拍,避免连续运行时的无效帧浪费算力。推理端运行在工控机GPU上,模型输入640x640的图像,输出缺陷类别和位置框。剔除端接到PLC信号,当推理结果命中缺陷类别时,PLC延时控制气嘴吹掉坏果。
光电传感器触发这个细节特别值得说。一开始我们没接光电触发,相机一直连续拍摄,GPU算力被大量无果图像占用,推理队列堆满,速度根本提不上来。后来改了触发逻辑,只有果体通过检测区域时才抓拍一帧,GPU负载立刻降下来一大截。
4.2 速度卡在3倍关口时的三个优化手段
项目前期实测,节拍在每秒3个果左右就是上不去了,离每秒4个果的目标还差一截。逐个排查后,发现瓶颈不在模型推理本身,而在整条数据链路。
第一个瓶颈是图像解码。工业相机直接输出高分辨率原始格式图像,传出来后由CPU做解码和预处理,这一步耗掉了将近30毫秒,比GPU推理本身还慢。我们把原始格式换成压缩率适中的无损压缩格式传输,解码时间降了一半。
第二个瓶颈是预处理里的几何变换。输入图像需要做缩放和填充到640x640,默认实现每次新建内存,反复分配释放。改成预分配缓存,多线程并行执行缩放和归一化,预处理耗时从15毫秒压到5毫秒以下。
第三个瓶颈是推理没有用TensorRT加速。我们起初用模型原生的推理接口跑,速度虽然能接受,但距离目标节拍差一口气。转成TensorRT FP16精度后,推理时延从22毫秒降到11毫秒,整整快了一倍。对于中小企业,不需要上昂贵的高端显卡,一张常规算力级别的GPU就能轻松应对。
4.3 整线节拍实测:3倍+不是吹出来的
优化完毕后,我们做了连续三天的满负荷实测。产线以1.0米/秒的皮带速度运行,单相机检测工位的实际处理能力达到每秒5个柑橘,整线的分选吞吐量比原来的“人工+半自动混线”状态提升了3.2倍。漏检率方面,每天随机抽检1000个过检果,人工复核缺陷,三天的漏检率分别为1.6%、1.4%、1.2%,平均值约1.4%。误检率稳定在2.5%左右。
对比数据我整理成了下表,方便直观参考:
| 指标 | 原人工+半自动混线 | AI检测系统 |
|---|---|---|
| 检测速度 | 约1.2个果/秒/人 | 约5个果/秒/工位 |
| 漏检率 | 6%~8% | 1.2%~1.6% |
| 误检率 | 约5%(主观判断无量化) | 约2.5% |
| 检测标准一致性 | 波动大 | 统一阈值,稳定 |
| 过程数据记录 | 无 | 全量图像+结果可追溯 |
5. 常见问题与排查技巧实录
5.1 漏检率一直降不下来,问题出在哪
如果模型训练完,漏检率还是高,先别急着加数据或换模型,按优先级排查下面几个点:
- 光源是否均匀覆盖整个视野。我调试时就遇到过曝光不均的问题,果体走向定位在暗角,缺陷特征直接丢失。解决办法是调整光源角度,并增加遮光罩减少环境光干扰。
- 运动模糊是否严重。皮带速度过快时,曝光时间太长会导致果体边缘发虚,细小缺陷被糊掉。把曝光时间从800微秒缩短到500微秒后,图像清晰度明显改善。
- 旋转严重缺陷的样本比例是否不足。腐烂和霉变的早期样品很难识别,如果训练数据里早中期样本太少,模型只能学会晚期严重腐烂,漏检率自然压不下去。补拍一批早期霉变样本,重新训练后改善明显。
5.2 误检率过高,别急着调高置信度阈值
误检率高,大部分人会直接调高阈值,但很容易把漏检率又带上去。正确做法是先从数据侧找原因。我遇到过误检集中在某几个批次果上的情况,原因出在数据增强做得不够,模型对特定背景图案特别敏感。检查后发现产线皮带上有固定纹理和小水渍,模型把这些当成了缺陷。解决办法是把干净的皮带图像加入训练集,并标注为背景类别,让模型学会忽略背景,误检率直接降了一个百分点。
5.3 现场长期运行的维护坑
农产品产线环境比较恶劣,粉尘、水汽、震动都不可忽视。镜头表面隔三差五就会被尘土遮掩,即便肉眼看不到,成像质量也在缓慢下降。我们配置了一个简单的定期清洁流程,每4小时用气枪清洁一次镜头和光源,并在软件里写了图像清晰度监测指标,一旦整体图像锐度下降超过设定值就报警。这招救过一次大问题:某次光源角度被维护工人碰到,导致光源分布异常,如果不是清晰度监测报警,可能整个白班都要抱着问题数据跑。
5.4 经验速查表
| 问题 | 排查顺序 | 常用解法 |
|---|---|---|
| 漏检率高 | 1. 光源 2. 曝光 3. 训练数据 4. 阈值 | 光源调整、缩短曝光、补样本、调类别阈值 |
| 误检率高 | 1. 背景干扰 2. 样本均衡 3. 阈值后处理 | 加背景样本、过采样、调置信度阈值 |
| 速度不达标 | 1. 解码 2. 预处理 3. 推理加速 | 压缩格式、缓存复用、TensorRT/OpenVINO |
| 识别时好时坏 | 1. 环境光 2. 镜头清洁 3. 硬件稳定性 | 遮光罩、定期清洁、监控图像质量 |
写在最后的实战体会
这套系统上线后跑了一个多月,给我最大的感受是:农产品AI检测并不是一个“模型训练完就能躺赢”的活,真正决定成败的是对产线场景的理解和数据闭环的建设。举个实际的例子,模型跑起来之后,我们每天都会把当天检出结果和人工复检结果做对比,每周抽一天把模型漏检的图像找出来,补进训练集做增量训练。这个滚雪球式的数据闭环,才是漏检率能持续稳定在1.5%以下的核心原因。
另外一个建议给准备上项目的同行:一定要在项目早期就把“标准”这个东西想清楚。标准不只是技术团队内部的指标,更要是品控团队、产线操作工、设备维护人员都能统一理解的判定口径。这个对齐工作花的时间,会在调试阶段加倍还回来。
如果你也正在做类似的分选产线改造,希望这篇实战记录能帮你少踩几个坑。农产品质检的想象空间很大,从柑橘到苹果、土豆、番茄,从分选线到采收、仓储环节,只要把底层方案吃透,换产品只是数据层面的问题,算法和工程链路是可以复用的。