贵阳昌明基地那条辣椒分拣工序被公开讨论,是因为两组数字放在一起:这道工序原先需要 600 多名工人人工挑拣,上线 AI 视觉分拣系统后保留 48 人,做的是机器筛选之后的最终复核把关;企业常务副总李鑫在贵州省质量发展大会上同时披露,关键工序不良率降到 0.02%,2025 年营收 54 亿元创历史新高。至于被撤下产线的那部分人去了哪里,公开信息里没有说明岗位去向,本文不作推断。

抛开争论,这条线在工程上要解决的问题非常具体:传送带上铺着高速移动的辣椒,要在 0.3 秒一帧的节拍里认出霉斑、黑点、破损,再让气流装置把不合格的那颗准确吹进废料箱。农产品视觉分选真正难的地方不在”能不能识别”,而在批次差异、曝光与帧率的取舍、粉尘与光照漂移、执行器响应延迟,以及漏检与误剔的代价不对称这一整串约束。下面按这条线的工作顺序拆开写。

辣椒分拣线上高速相机与人工复核工位

一、难点不是”挑出来”,而是”每一批都不一样”

先把目标分开。霉斑、黑点、破损是三类形态学上完全不同的目标:霉斑是表面绒状团块,对比度低、边界模糊,容易被当成水膜反光或碎屑阴影;黑点是小面积高对比的点状缺陷,尺寸可能接近系统能分辨的极限,一个像素的差别就是”脏”和”病”的区别;破损靠的是轮廓缺口与内瓤外露,判据是形状而不是纹理。三类目标混在一个分类头里、共用一个阈值,结果通常是”黑点检得准、霉斑全漏”。工程上会把它们拆成独立的检测任务,各自定阈值、各自统计漏检率。

第二类变量来自原料本身。产地、采收期、含水率、粒径分布、清洗后残留的水膜,都会让”同一种缺陷”在图像里长得不一样;跨产地混批时,整批图像的均值和方差会一起漂移,看起来像模型退化,其实是原料变了。可执行的做法是把参数快照绑到批次上:相机曝光与增益、白平衡、光源驱动电流、镜头清洁记录、当批的粒径分布,全部随批次号入库。没有这一步,后续任何”识别率下降”的归因都只能靠猜。

第三类变量来自上游。单层摊料是分选精度的前提,辣椒叠在一起时,被压住的那一面等于没有检测过,这部分漏检不是算法问题,任何模型都救不回来。振动给料、翻料与摊料机构的调整,在这类项目里往往比换模型更有效。

二、0.3 秒一帧,是曝光、帧率和照明的三方取舍

“每 0.3 秒扫描一次传送带”这一句里藏着一串硬性约束,取舍关系如下表。

约束项 物理关系 放宽后的后果 常见做法
曝光时间与运动模糊 模糊量 = 带速 × 曝光时间 缺陷边缘糊掉,小目标直接消失 把模糊量压到最小缺陷尺寸的三分之一以内,属硬约束
光通量不足 短曝光进光少 提高增益换亮度,噪声随之上升 提高光源功率优先于提高增益,噪声对低对比缺陷影响最大
触发方式 定时采样会随带速变化错位 视野重叠或漏行,同一颗被重复剔除 用皮带编码器触发采集,带速变了节拍自动跟随
多相机对齐 各相机独立采样 同一颗料被两个视野分别判决 共用同一触发信号,剔除口按优先级仲裁
缺陷最小像素数 分辨率与视野冲突 视野大了像素就薄,小点检不出 先按最小缺陷尺寸定 mm/px,再倒推视野宽度
剔除时序补偿 延迟 = 相机到喷阀距离 ÷ 带速 − 阀响应 换带速后集中出现漏剔 每帧实时计算落点,不做离线标定死值
镜头污染 前玻璃积尘形成固定暗区 暗区被误判为阴影,漏检集中在同一位置 用无料的空白时段做基线,偏移超阈值告警并触发清洁
环境光漂移 天窗日光随时间与天气变化 同一批料在不同时段判据不一致 遮光罩加恒光源,把环境光当干扰项处理
算力位置 全图分类耗时不稳定 节拍抖动,剔除错位 先做 ROI 提取再分类,把重计算挪到帧后队列

噪声这一项值得单独强调。霉斑是低对比目标,高增益带来的噪声会直接把它的响应淹掉;黑点是高对比目标,噪声影响小得多。所以”帧率还能不能再提”这个问题,答案不由算力决定,而由最暗那个缺陷类别的对比度决定。我们在类似项目里通常按缺陷类别反推最低信噪比,再看曝光时间够不够,而不是先定帧率再想办法。

三、留下 48 人做最终复核,不是妥协

机器视觉的漏检率与误剔率从来不在同一侧。漏检的代价是一颗带霉斑的原料进入下道工序,最终表现为批次质量风险,损失难以在当班结算;误剔的代价是一颗好料进废料箱,按重量和单价当场可算。两种代价不对称,阈值就该向”宁可误剔”的方向偏。但偏多少必须有依据:偏得太狠,产量损失会从质量成本变成成本问题,这也是不能全自动、必须留人的经济原因之一。

人能处理的东西也和模型不同。第一类是样本外的异常:绳头、塑料片、虫体、成团结块的湿料,这些不在缺陷类别里,模型只会给出一个含糊的分数;第二类是系统自身的故障:喷阀卡滞、气路压力不足、料堆挡住了视野,这些表现是”剔除数与动作数对不上”,需要有地方核对;第三类是非视觉维度:气味、含水率、杂质掺假,摄像头看不到。

复核岗真正应该产出的东西,决定了这 48 人是最后一道质量关口还是单纯的重复劳动:

  1. 按班次、线体、产地、粒径分层抽检,并留下可统计的记录,而不是随手翻看;
  2. 回捞样本按缺陷类别归集,把标注结果回流到训练集,形成模型更新的数据来源;
  3. 优先复核两端:高置信度被剔除的(防误剔吃掉产量)与低置信度被放行的(防漏检带进风险);
  4. 记录异常工况标签,如下雨后原料带水、换产地当天、清洗工序异常;
  5. 每班用留样标准件跑一次,作为线上系统的当日基线;
  6. 把误剔造成的可计量损失写进日志,让阈值调整有经济口径可依。

岗位内容变了,这点可以客观描述:原来主要靠眼睛连续判断单颗,现在要读参数、判异常、做记录。至于是不是所有人都有机会转到这类岗位,公开信息里没有说明,不在本文讨论范围内。

四、0.02% 这类指标应该怎么验,而不是怎么报

第一步是把口径写死。分母是什么?是颗数、重量、关键工序件数还是批次数?同样的漏检情况,用”每万颗不合格品中放过几颗”和”按批次是否合格”来算,结果可以差几个数量级。指标定义应当在方案阶段就落到纸面,双方签字确认,不留到验收时讨论。

第二步是把一个数拆成两个数。任何单值”不良率”都无法用于验收,必须分开报:漏检率(不合格被判合格)和误剔率(合格被判不合格),并各自给出置信区间。只看前者会掩盖产量损失,只看后者会掩盖风险。

第三步是承认样本量这件事没有捷径。要在统计上支撑 0.02% 这个量级,观测样本需要几万到几十万颗;更麻烦的是,同批次、同产地的样本彼此相关,不能当成独立试验直接套公式,否则置信区间会明显偏窄。可行的组合是三条:

  • 分层抽样:按班次、线体、产地、粒径分段,每段独立给结果,重点覆盖边界样本(轻微黑点、边缘霉斑、部分破损),因为边界样本才是决定阈值位置的数据;
  • 留样复现:把已经人工标注并留存的标准样品,在换镜头、换光源、换模型版本之后回灌线上跑一遍,与历史记录逐项比对,这一步等价于软件里的回归测试;
  • 影子运行:新模型上线前先只判决不出手,与现网结果并行对账若干天,所有分歧样本交人工裁决,用分歧率而不是准确率来决定是否切换。

五、追溯编码要和视觉结果挂在同一个键上

公开信息里提到辣椒、菜籽油、大豆等原料按批次录入数字化编码,可反向追溯到产地与采收批次。这件事要在分选线上成立,需要两个维度交叉:原料批次(产地、采收、入厂检验)与加工批次(日期、班次、线体、设备与算法参数版本),交叉后的单元才是可追溯对象。

实际要落库的字段,比”合格 / 不合格”多得多:

字段 用途 缺了会怎样
剔除事件计数与缺陷类别分布 判断当班质量水平 只能知道”这一批不好”,不知道差在哪一类
置信度分布直方图 发现阈值漂移与原料变化 模型退化前没有任何预警信号
模型版本与阈值版本 事后复现判决 无法解释同一批料两次判决不一致
相机与光源参数快照 区分算法问题与成像问题 归因只能靠人回忆
喷阀动作数与实际剔除数差值 执行器层硬件证据 漏剔会被误记成算法漏检
图像存证策略 复核与仲裁依据 争议样本无据可查,标注回流断供

图像存证要有量化的取舍:被剔除的样本全存,正常放行的按固定比例抽样存,抽样比例本身写进配置版本。只存剔除图的做法,会让”漏检”永远无法事后确认,因为没留下的图不存在判决依据。

关联的技术做法并不复杂:用编码器的区间计数加批次切换事件,给每段料流打时间区间标签,每帧图像按采集时刻落进对应区间;批次切换由上游投料事件自动触发。人工点的切换时间不可靠,因为它永远滞后于实际切换点。追溯体系的反向能力(从成品倒查到产地与采收批次)就建立在这个区间映射上,映射一断,前面所有识别精度都无法归因。

六、洹拓视角:食品行业上视觉分选的三条判断线

这类需求找到我们时,我们会先过三条线,三条都过硬才建议做,任何一条不过就先补条件。

  • 缺陷是否可见。霉斑、黑点、破损属于可见缺陷,适合视觉。农药残留、含水率、掺假、微生物指标看不见,得走理化检测或光谱路线,两者的设备成本、判定周期、集成方式完全不同,用视觉去做等于买一个检不出目标的相机。
  • 代价是否可量化。误剔要有公斤单价,漏检要有批次风险损失的估计口径。算不出这两笔账,阈值就无从确定,也无法向管理层证明改造收益,项目会退化成”参数由供应商说了算”。
  • 样本是否可得。要覆盖全部产地与全部季节,收集周期可能是半年到一年;稀有缺陷一年可能只凑得出几十颗。还要提前定标注口径:多人判定不一致时以谁为准、是否需要破坏性验证作为金标准。样本拿不到,可以先做单类缺陷的局部上线,不要一次承诺全类目指标。

只过第一条线的项目,结局很常见:验收期靠人工兜底,兜底撤不掉,最后变成”机器做初筛、人工照旧终审”,投入只换回一个报表。反过来说,能长期跑下来的分选线,交付物从来不只有一个模型,而是三件套:双方确认的指标口径、可持续的漂移监控、有明确产出物的复核流程。硬件与算法会换,这三样东西决定了换的时候会不会重新掉坑。