去年下半年,浙江南浔一家板式家具厂的老板找到我们。他们的工厂主要做实木餐桌、茶几和柜子,每天要处理约12立方米的实木板材——北美黑胡桃、白橡、红橡为主。生产流程里有一个环节一直让他们头疼:木材分等(木材分级,grade sorting)。

这个环节简单说就是:来料板材进厂后,质检师傅凭肉眼和经验给每块板子打等级——A级做桌面(外观面),B级做抽屉面板/侧板(半外观面),C级做内部结构件,D级切小料或报废。听起来简单,但实际执行中问题很大。

这篇文章记录我们是怎么一步步帮这家厂用AI视觉解决木材分等问题的。不讲虚的,只说做了什么、遇到了什么坑。

一、现场情况摸底

去了工厂,在分等工位蹲了两天。发现几个核心问题:

老板说的一句话说得很实在:"我损失的不是一块板子的钱,是客户的信任。那个客诉之后,那个客户下一批订单直接减半了。"

二、方案设计

目标很明确:在来料分等工位装一套AI视觉检测系统,自动完成板材分级,减少对人的依赖。

为什么选边缘AI而不是纯云方案

我一开始想过把高分辨率图像传云端去推理,但到现场一看就否了:车间里WiFi覆盖不完整,每个板子需要拍2400万像素的照片(木材缺陷需要很高分辨率才能看清),一天400片就是约20GB图像数据,全传云端根本不现实。边缘网关本地处理是唯一可行的路。

最终方案分三层:

采集层:线阵相机+特定光源

木材缺陷跟金属或塑料表面缺陷完全不同。金属表面用同轴光就能照亮,但木材需要特殊打光方案:

这个打光方案是整个项目的基础。试过好几种灯——半球光(暗场模糊看不清细节)、同轴光(高光太强掩盖了纹理)、条形光角度不对(阴影太深,把正常纹理误判为缺陷)——最后才定下来这个方案。后面会细说每一个踩坑。

边缘层:边缘AI网关做本地推理

现场部署了一台边缘AI网关(标准型S200),负责:

选择标准型S200的原因:需要6 TOPS的算力跑YOLOv8s的模型(1 TOPS的经济型跑不动8000宽的图),同时需要多路RS485接口对接现场的输送线和打标设备。

模型选型上试了三个方向,最终采用了两阶段方案

  1. 阶段一:目标检测(YOLOv8s)——检测出所有缺陷区域(节子、裂缝、树脂囊、变色、虫眼等),标注位置和类型
  2. 阶段二:分级规则引擎——根据检出缺陷的数量、大小、位置、类型,结合预设的等级判定规则,输出最终等级(A/B/C/D)

为什么不直接用端到端分类模型?试过——ResNet50直接输出等级。问题在于:木材的等级判定标准不是端到端能学好的。"A级:允许最多2个直径≤5mm的活节,位置不在中心区域"——这种带空间逻辑的规则,分类模型学不明白。两阶段方案反而更可控:检测模型负责"看到什么",规则引擎负责"怎么判",各自针对性调优。

云端层:数据看板和追溯

一个比较简单的Web看板,展示:

所有检测图像和结果在本地存3个月,云端存1年。方便客户投诉时回溯——"你说这块板子有问题,我们查一下当时的检测图片"。

三、实施过程

第一周:打光方案测试——踩了3个坑

打光是木材视觉检测中最麻烦的部分,没有之一。

坑1:条形灯光照角度

第一次装灯的时候,我按常规经验把条形灯装在相机两侧约30度角。结果拍出来的黑胡桃板子纹理阴影太深,活节和正常纹理几乎无法区分。后来把角度调到45度,阴影明显减少。但白橡木又不一样——白橡的纹理比黑胡桃粗,45度光又显得太平。最终方案是:根据不同木材品种预设不同的光照角度参数,输送线上加一个品种选择按钮。

坑2:透射光的位置

透射光装在输送带下方。但第一次装的时候透射光区域太小(只有30cm宽),板材宽的一面通过时,边缘部分透射光照不到,腐朽区看不见。后来换成了整条60cm宽的定制LED透射面板。

坑3:环境光的干扰

车间顶灯是日光灯管。白橡木板材检测的时候,顶灯的反光在板材表面形成高光条,被模型误判为"颜色异常"。解决办法很简单——在检测工位上方加了一个遮光罩。

第二周:样本采集和标注

木材缺陷标注远比想象中复杂。一个"节子"就有6种类型:

光区分活节和死节就让标注团队头疼了好一阵——有些死节从表面看跟活节一模一样,只是周围有一圈变色环。最后定了一个标注规范:用探针轻戳,能戳动的才算死节,不能以视觉判断为准。

一共采集了约2000片板材的高清图像,标注了约15000个缺陷实例。这个数据量对工业检测来说不算大——但木材的多样性覆盖得还算全面(黑胡桃、白橡、红橡、樱桃木各约500片)。

第三周到第四周:模型训练和迭代

用YOLOv8s做训练,输入图像切成640×640的滑动窗口,步长320。训练集1400片,验证集300片,测试集300片。

第一个版本跑出来mAP@0.5有约0.82,看起来还行。但一放到现场跑,问题就来了。

问题1:过量检

模型把正常的木材纹理特征(矿物条纹、色斑)大量误判为"颜色异常"。白橡的木射线纹路特别明显,在模型看来跟裂缝很像。解决方式:在训练集里大量补充"正常但看起来异常"的负样本,让模型学会区分纹理和缺陷。

问题2:分级规则太死板

第一版规则引擎用的是简单的"A级:缺陷数≤2,且无死节/裂缝"。结果发现很多板子缺陷数量超标但缺陷都在边缘(后期切边能切掉),却被判了B级。后来改了规则:缺陷按区域加权——中心区域(最终成品会保留的区域)的缺陷权重是边缘区域的3倍。

教训:木材分等最终是个"业务规则"问题,不是纯视觉问题。视觉检测做到80分,剩下20分靠规则引擎调优。

第五周:联调上线

联调阶段出现了最大的意外——输送线速度波动。输送带的实际速度跟设定值差了约5-8%,导致线阵相机采集的图像被拉伸或压缩,缺陷尺寸计算偏差较大。

解决方案:在输送线上加了一个编码器,实时测量输送带的实际速度,同步给相机做触发信号。这样无论速度怎么波动,每行像素对应的物理尺寸保持一致。

另一个小问题:打标设备(用喷码机在板材侧面打等级标记)的触发延迟。从边缘网关输出"等级B"到喷码机实际喷上去,有约300ms的延迟,导致喷码位置偏差了几厘米。后来加了延时补偿参数。

四、实际效果

系统上线运行了3个多月后,我们和厂里一起做了个复盘。

分等一致性明显提升
同一个批次板材,三个师傅之间的一致率从约70%提升到约95%(以AI系统结果为参考基准)。
材料利用率提高约8%
以前为了保险,师傅倾向于"有疑问就降级"。AI系统能做到更细微的区分——有些板子虽然有几个小活节,但位置都在切边范围内,可以按A级使用。
单板检测周期:约15秒
从板材进入检测区域到喷码完成,整个过程约15秒。人工分等一片平均要45秒(翻面、检查两面、思考分级、记录)。

也有几个没能解决的问题:

五、踩坑汇总

整个项目跑下来,踩了这些坑,记录一下:

  1. 打光方案不要一次定型,必须到现场试——不同木材品种、不同厚度、不同含水率,光照方案都要微调
  2. 负样本比正样本重要——"看起来像缺陷的正常纹理"是最大的误报来源,要花精力收集
  3. 输送线精度比相机精度更重要——编码器是必须的,不要省
  4. 分级规则要跟业务跑几周才能定——我们改了三版规则,每次都是跟厂长、质检主管、三个师傅一起讨论后才定下来
  5. 新品种需要快速适应机制——工厂不可能只用固定几种木材,要预留快速标注+增量训练的流程
  6. 现场环境光要考虑——车间顶灯、窗户进来的阳光、甚至不同季节的日照角度,都会影响检测一致性
  7. 不要低估标注难度——木材缺陷的标注非常主观,三个师傅自己都吵过几次"这个是活节还是死节"

六、我的思考

这个项目让我对"AI+传统制造"这事儿有了新的认识。

AI不是取代人,是帮人提升判断一致性。在这个项目里,三个师傅仍然在岗——AI会标记"有疑问"的板子让师傅复核,师傅的经验用来优化规则引擎。人机协作比纯自动更靠谱。

家具行业做AI视觉的难点不在模型,在工艺。打光方案、输送线同步、品种切换、湿度补偿——这些环节花的精力是模型训练的3倍以上。但如果这些环节不做扎实,模型再先进也白搭。

木材可能是视觉检测里比较难的材料之一。不像金属、塑料、陶瓷这些人工材料有固定的表面特征,木材每块都不一样——同一种树、同一批板材,纹理、颜色、缺陷分布天差地别。模型需要很强的泛化能力,数据采集阶段就要尽量覆盖各种变体。

最让我意外的是:厂长说最有价值的功能不是分等,而是追溯。"以前客户回来投诉,我只能说不好意思退钱。现在我可以调出当时那张板子的检测图像,跟客户解释——这块板子出库时是A级,但客户在加工过程中把表面磨薄了,露出了内部的活节。这不是我们的问题。"这一点完全在我做方案设计时预料之外。

更多案例和实际项目经验分享,可以在 www.bycims5g.cn/cases/ 上找到。

七、经验总结

如果你也在考虑做木材或类似自然材料的AI视觉检测,给几个实在的建议:

  1. 先做打光测试再做模型——打光不好,模型怎么学都没用。花2-3天在现场试不同角度和亮度的光源
  2. 负样本库持续维护——上线后前两个月,定期检查模型的误报,把新的"看起来像缺陷但其实是正常纹理"的样本加入训练集
  3. 分级规则跟业务部门一起迭代——不要让算法工程师独自定规则,质检主管和厂长必须参与
  4. 留好手动接管的通路——模型不确定的板子要能一键转人工复核,别搞"自动驾驶"式的全自动
  5. 追溯功能可能是意外的高价值点——很多客户投诉不是因为板子真的有问题,而是无法证明"出厂时没问题"

整个项目的完整代码、模型训练脚本、标注规范和部署文档,我整理在项目文档里了,留给厂里后续维护使用。遇到类似问题也欢迎交流。