去年下半年,浙江南浔一家板式家具厂的老板找到我们。他们的工厂主要做实木餐桌、茶几和柜子,每天要处理约12立方米的实木板材——北美黑胡桃、白橡、红橡为主。生产流程里有一个环节一直让他们头疼:木材分等(木材分级,grade sorting)。
这个环节简单说就是:来料板材进厂后,质检师傅凭肉眼和经验给每块板子打等级——A级做桌面(外观面),B级做抽屉面板/侧板(半外观面),C级做内部结构件,D级切小料或报废。听起来简单,但实际执行中问题很大。
这篇文章记录我们是怎么一步步帮这家厂用AI视觉解决木材分等问题的。不讲虚的,只说做了什么、遇到了什么坑。
一、现场情况摸底
去了工厂,在分等工位蹲了两天。发现几个核心问题:
- 标准不统一:三个质检师傅对"A级"的理解不一样。一个认为"没有死节就是A",另一个要求"颜色均匀无结也无矿物线"。同一批板材,三个人分等结果能差30%
- 疲劳导致漏检:师傅一天的检测量大约300-400片板材。每片1.2米×0.4米,一天盯着看下来,下午3点后漏检率明显上升。有两个老客户专门投诉过"桌面有节疤没看出来"
- 招工难:能看懂木材缺陷的师傅至少要3年经验。厂里现有的三位师傅平均年龄52岁,老了退休了后继无人
- 退货成本高:一块被客户退回的A级桌面板,因为有个漏检的活节被投诉,退回来只能降级做B级,差价损失约150元
老板说的一句话说得很实在:"我损失的不是一块板子的钱,是客户的信任。那个客诉之后,那个客户下一批订单直接减半了。"
二、方案设计
目标很明确:在来料分等工位装一套AI视觉检测系统,自动完成板材分级,减少对人的依赖。
为什么选边缘AI而不是纯云方案
我一开始想过把高分辨率图像传云端去推理,但到现场一看就否了:车间里WiFi覆盖不完整,每个板子需要拍2400万像素的照片(木材缺陷需要很高分辨率才能看清),一天400片就是约20GB图像数据,全传云端根本不现实。边缘网关本地处理是唯一可行的路。
最终方案分三层:
采集层:线阵相机+特定光源
木材缺陷跟金属或塑料表面缺陷完全不同。金属表面用同轴光就能照亮,但木材需要特殊打光方案:
- 用线阵相机(而不是面阵相机)——板材是连续送料的,线阵相机逐行扫描,成像更均匀
- 光源用45度斜射白光LED条形灯,左右各一根——斜射光能把木材的纹理和凹凸缺陷(裂缝、凹坑)的阴影拉出来
- 额外加一根透射光(从板材下方往上打)——透射光能看清内部的腐朽、蓝变、树脂囊等内部缺陷
- 相机安装高度约80cm,拍摄精度约0.2mm/像素
这个打光方案是整个项目的基础。试过好几种灯——半球光(暗场模糊看不清细节)、同轴光(高光太强掩盖了纹理)、条形光角度不对(阴影太深,把正常纹理误判为缺陷)——最后才定下来这个方案。后面会细说每一个踩坑。
边缘层:边缘AI网关做本地推理
现场部署了一台边缘AI网关(标准型S200),负责:
- 接收线阵相机采集的板材图像(每张约8000×2000像素)
- 运行缺陷检测模型和等级分类模型
- 本地存储所有检测结果和图像
- 把结果推送到产线显示屏和产线管理系统
- 每小时上传一份汇总数据到云端
选择标准型S200的原因:需要6 TOPS的算力跑YOLOv8s的模型(1 TOPS的经济型跑不动8000宽的图),同时需要多路RS485接口对接现场的输送线和打标设备。
模型选型上试了三个方向,最终采用了两阶段方案:
- 阶段一:目标检测(YOLOv8s)——检测出所有缺陷区域(节子、裂缝、树脂囊、变色、虫眼等),标注位置和类型
- 阶段二:分级规则引擎——根据检出缺陷的数量、大小、位置、类型,结合预设的等级判定规则,输出最终等级(A/B/C/D)
为什么不直接用端到端分类模型?试过——ResNet50直接输出等级。问题在于:木材的等级判定标准不是端到端能学好的。"A级:允许最多2个直径≤5mm的活节,位置不在中心区域"——这种带空间逻辑的规则,分类模型学不明白。两阶段方案反而更可控:检测模型负责"看到什么",规则引擎负责"怎么判",各自针对性调优。
云端层:数据看板和追溯
一个比较简单的Web看板,展示:
- 今日检测量、各等级占比
- 每片板材的检测结果缩略图(标注了缺陷位置和等级)
- 等级分布历史趋势
- 缺陷类型分布统计
- 异常板子(降级/退货记录)的追溯查询
所有检测图像和结果在本地存3个月,云端存1年。方便客户投诉时回溯——"你说这块板子有问题,我们查一下当时的检测图片"。
三、实施过程
第一周:打光方案测试——踩了3个坑
打光是木材视觉检测中最麻烦的部分,没有之一。
坑1:条形灯光照角度
第一次装灯的时候,我按常规经验把条形灯装在相机两侧约30度角。结果拍出来的黑胡桃板子纹理阴影太深,活节和正常纹理几乎无法区分。后来把角度调到45度,阴影明显减少。但白橡木又不一样——白橡的纹理比黑胡桃粗,45度光又显得太平。最终方案是:根据不同木材品种预设不同的光照角度参数,输送线上加一个品种选择按钮。
坑2:透射光的位置
透射光装在输送带下方。但第一次装的时候透射光区域太小(只有30cm宽),板材宽的一面通过时,边缘部分透射光照不到,腐朽区看不见。后来换成了整条60cm宽的定制LED透射面板。
坑3:环境光的干扰
车间顶灯是日光灯管。白橡木板材检测的时候,顶灯的反光在板材表面形成高光条,被模型误判为"颜色异常"。解决办法很简单——在检测工位上方加了一个遮光罩。
第二周:样本采集和标注
木材缺陷标注远比想象中复杂。一个"节子"就有6种类型:
- 活节(sound knot)——跟周围木材结合紧密,允许少量存在
- 死节(dead knot)——已经松脱或即将掉落,必须标注
- 落节(loose knot)——节子已经掉了,剩一个洞
- 针节(pin knot)——极小(≤3mm)的节子
- 芽节(sprout knot)——正在生长的芽形成的节
- 腐朽节(rotten knot)——节子已经开始腐烂
光区分活节和死节就让标注团队头疼了好一阵——有些死节从表面看跟活节一模一样,只是周围有一圈变色环。最后定了一个标注规范:用探针轻戳,能戳动的才算死节,不能以视觉判断为准。
一共采集了约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系统结果为参考基准)。
以前为了保险,师傅倾向于"有疑问就降级"。AI系统能做到更细微的区分——有些板子虽然有几个小活节,但位置都在切边范围内,可以按A级使用。
从板材进入检测区域到喷码完成,整个过程约15秒。人工分等一片平均要45秒(翻面、检查两面、思考分级、记录)。
也有几个没能解决的问题:
- 木材湿度的影响:梅雨季木材含水率高了3-5个百分点,颜色变深,模型检出率下降约5%。需要补充高湿度样本重新训练。
- 新品种适应:工厂第三个月进了一批樱桃木,模型从来没训练过,误报率飙升。临时让师傅手动分级,同步采集样本,花了约一周补充训练才稳定。
- 切边预测精度:我们尝试让模型在分等的同时预测"最佳切边方案"(即怎么切掉缺陷区域后留下的板材面积最大)。这个功能准确率只有约60%,离实用还有距离。
五、踩坑汇总
整个项目跑下来,踩了这些坑,记录一下:
- 打光方案不要一次定型,必须到现场试——不同木材品种、不同厚度、不同含水率,光照方案都要微调
- 负样本比正样本重要——"看起来像缺陷的正常纹理"是最大的误报来源,要花精力收集
- 输送线精度比相机精度更重要——编码器是必须的,不要省
- 分级规则要跟业务跑几周才能定——我们改了三版规则,每次都是跟厂长、质检主管、三个师傅一起讨论后才定下来
- 新品种需要快速适应机制——工厂不可能只用固定几种木材,要预留快速标注+增量训练的流程
- 现场环境光要考虑——车间顶灯、窗户进来的阳光、甚至不同季节的日照角度,都会影响检测一致性
- 不要低估标注难度——木材缺陷的标注非常主观,三个师傅自己都吵过几次"这个是活节还是死节"
六、我的思考
这个项目让我对"AI+传统制造"这事儿有了新的认识。
AI不是取代人,是帮人提升判断一致性。在这个项目里,三个师傅仍然在岗——AI会标记"有疑问"的板子让师傅复核,师傅的经验用来优化规则引擎。人机协作比纯自动更靠谱。
家具行业做AI视觉的难点不在模型,在工艺。打光方案、输送线同步、品种切换、湿度补偿——这些环节花的精力是模型训练的3倍以上。但如果这些环节不做扎实,模型再先进也白搭。
木材可能是视觉检测里比较难的材料之一。不像金属、塑料、陶瓷这些人工材料有固定的表面特征,木材每块都不一样——同一种树、同一批板材,纹理、颜色、缺陷分布天差地别。模型需要很强的泛化能力,数据采集阶段就要尽量覆盖各种变体。
最让我意外的是:厂长说最有价值的功能不是分等,而是追溯。"以前客户回来投诉,我只能说不好意思退钱。现在我可以调出当时那张板子的检测图像,跟客户解释——这块板子出库时是A级,但客户在加工过程中把表面磨薄了,露出了内部的活节。这不是我们的问题。"这一点完全在我做方案设计时预料之外。
更多案例和实际项目经验分享,可以在 www.bycims5g.cn/cases/ 上找到。
七、经验总结
如果你也在考虑做木材或类似自然材料的AI视觉检测,给几个实在的建议:
- 先做打光测试再做模型——打光不好,模型怎么学都没用。花2-3天在现场试不同角度和亮度的光源
- 负样本库持续维护——上线后前两个月,定期检查模型的误报,把新的"看起来像缺陷但其实是正常纹理"的样本加入训练集
- 分级规则跟业务部门一起迭代——不要让算法工程师独自定规则,质检主管和厂长必须参与
- 留好手动接管的通路——模型不确定的板子要能一键转人工复核,别搞"自动驾驶"式的全自动
- 追溯功能可能是意外的高价值点——很多客户投诉不是因为板子真的有问题,而是无法证明"出厂时没问题"
整个项目的完整代码、模型训练脚本、标注规范和部署文档,我整理在项目文档里了,留给厂里后续维护使用。遇到类似问题也欢迎交流。