工业视觉踩坑实录(十一):数了三个月的螺栓,我经历了传统视觉到深度学习的完整技术周期

摘要:本文分享一个工业螺栓计数的真实项目,从传统机器视觉(形状匹配→模板匹配→分水岭分割)到深度学习检测的完整技术演进。作者详细拆解了图像反转、二值化、距离变换、分水岭算法、粒子分析等传统方案的全流程,对比了深度学习方法在精度和开发效率上的巨大优势。对理解传统视觉与深度学习的技术代差有直接参考价值。

在这里插入图片描述

关于作者

我接触视觉整整10年。

工业视觉、烟草、煤矿等行业都有深度开发经验。从硬件选型、算法开发、模型训练,到上位机开发及部署,都在一线磨过。

之前是多家公司人工智能团队的技术负责人。现在自己创业了,还在继续做视觉落地这件事。


作者说

这可能是踩坑实录系列里时间跨度最长的一篇。

里面讲的方案,有些是很多年前做的。那时候深度学习还没普及,工业视觉的主流武器是传统机器视觉——形状匹配、模板匹配、边缘检测、形态学操作、分水岭分割。

这套东西现在看起来"古老",但当时就是最先进的方法论。

我决定写下来,不是因为这些技术现在还值得学,而是因为——亲身经历从传统视觉到深度学习的完整切换,这种视角正在变得越来越稀缺。

现在入行的年轻人,上来就是YOLO、注意力机制、大模型,对传统视觉的理解可能停留在课本上。但很多在产线上跑了十年八年的老系统,底层就是这些"老古董"。你要维护它、改造它,甚至替它升级,就得理解它当初为什么这么做。

这是第十一篇。


需求:数螺栓

需求很简单——一张图里有一堆螺栓,数出来有多少个。

听起来像入门级的CV任务对吧?

当年可一点都不简单。

螺栓这种东西,做计数有几个天然的难点:

  1. 排列密集,螺栓之间挨得很近,边缘会粘连
  2. 表面反光,金属材质打光不均匀,亮暗差异大
  3. 有遮挡,有时候螺栓被其他零件挡住一部分
  4. 背景复杂,螺栓所在的基板、螺母、垫片都是干扰项

现在你肯定想——YOLO跑一下不就完了吗?

对,现在确实是这样。但在那个年代,我们手头没有这些工具。


第一次尝试:形状匹配

最先想到的方案是形状匹配。

原理很直观:画一个螺栓的模板轮廓,然后在整张图里滑动匹配,找到所有跟模板长得像的区域。

代码写起来也不复杂。选一个标准螺栓的图像裁出来当模板,设置相似度阈值,跑一遍就出结果了。

结果呢?

能用,但不好用。

在这里插入图片描述

问题出在几个地方:

  • 反光一变,相似度就掉。上午跑得挺好,下午光照一变就漏检一大片
  • 螺栓如果有轻微旋转角度,匹配精度直接崩
  • 最要命的是粘连区域——两个螺栓挨在一起的时候,形状匹配会把它们识别成一个大的异物,而不是两个独立的螺栓

调了一个月的参数,效果始终不稳定。客户那边的质检员说:「你这个数不对啊,明明12个你数出10个。」

算了,换方案。


第二次尝试:模板匹配

形状匹配不行,那就换精度更高的模板匹配(NCC匹配)。

模板匹配比形状匹配多了一步归一化操作,对亮度变化更鲁棒。理论上应该更好用。

实际效果呢?

单张图确实准了。但速度跟不上。

在这里插入图片描述

我们的产线节拍是每8秒来一张图,模板匹配在整张图上滑动计算相似度,单张处理时间要3-4秒。加上预处理、后处理、结果输出,留给算法的时间窗口很紧。

而且,模板匹配跟形状匹配一样,解决不了粘连问题

两颗螺栓靠在一起,NCC算出来就是一个大匹配区域。你没法告诉算法"这里其实是两个目标"。

这是我们面临的核心难题:不是一个"检测准不准"的问题,而是一个"怎么把粘连的目标分开"的问题。

这个问题,形状匹配解决不了,模板匹配也解决不了。

最终把目光投向了一个当时觉得"很高级"的方案。


最终方案:分水岭分割

分水岭算法这个名字很有意思——把图像想象成地形图,灰度值就是海拔,高灰度是山峰,低灰度是山谷。你要找的就是山峰之间的分界线。
在这里插入图片描述

我们的思路是这样的:

Step 1:图像反转
把原图做一次颜色反转。螺栓本身是亮的(金属反光),反转之后螺栓变成了暗区域,背景变成了亮区域。

为什么要反转?因为螺栓中心往往是亮点(反光最强),直接做二值化的话,每个螺栓中间会有一个亮点被当成"山峰"。反转之后,螺栓中间变成了暗点(山谷),周围是边界(山峰),这样分水岭才能在螺栓之间找到正确的分界线。

这一步当时想了好久。一开始直接做二值化,分割出来的区域要么太碎要么混在一起,搞了几天才发现是反转没做。
在这里插入图片描述

Step 2:二值化
把反转后的图转成黑白二值图。阈值调了很多次——太低了会把背景噪点也包含进来,太高了螺栓的边缘信息会丢失。

当时的经验是:先看直方图,找双峰之间的谷底作为初始阈值,然后再手动微调。没有自适应二值化那么方便,但效果更可控。
在这里插入图片描述

Step 3:填充
二值化之后,螺栓内部可能有一些空洞(反光不均匀导致的)。用形态学闭运算把这些空洞填上,让每个螺栓变成一个完整的连通区域。

这个步骤很关键。不填充的话,后面距离变换会出现多个局部极小值,一个螺栓被分成好几个区域,分水岭就会在螺栓内部画分割线——这就搞反了。
在这里插入图片描述

Step 4:灰度距离映射(距离变换)
这是整个方案最核心的一步。

对二值图做距离变换:每个白色像素的值等于它到最近的黑色像素(背景)的距离。螺栓中心的像素离边界最远,所以值最大;越靠近边缘值越小。

做完之后,每个螺栓就变成了一个"山丘"——中间高,四周低。
在这里插入图片描述

Step 5:分水岭
在距离变换的结果上运行分水岭算法。

算法会从"山丘"的山顶开始"注水",水往低处流,不同螺栓之间的水最终会在山谷(边界处)相遇。相遇的地方就是分割线。

这样,即使两个螺栓紧挨着甚至有轻微粘连,分水岭也能找到它们之间的边界,把一个区域正确地分成两个。
在这里插入图片描述

Step 6:提取分割线
分水岭算法的输出是一张标记图,不同区域用不同的灰度值标记。提取分割线就是找到相邻标记之间的边界像素。
在这里插入图片描述

Step 7:分割线与原图做乘运算
把分割线覆盖回原图,每条分割线把粘连的区域切开。得到的就是每个螺栓独立分开的图像。
在这里插入图片描述

Step 8:粒子分析
最后一步,对分割后的图像做粒子分析——统计连通区域的数量,每个连通区域就是一个螺栓。

统计的时候加上面积过滤(太大或太小的区域排除)和圆形度过滤(螺栓截面接近圆形),把误检的干扰项过滤掉。
在这里插入图片描述


效果

一整套流程跑下来,计数准确率从形状匹配的85%左右提升到了96%

处理时间也从模板匹配的3-4秒优化到了800毫秒左右——在当时的硬件条件下,勉强能跟上产线节拍。

客户满意了。项目交付了。

但我自己心里清楚:这套方案太脆弱了。

换个打光角度,阈值要重新调。换一批螺栓(表面处理不同),形态学参数要改。换一个摄像头(分辨率变了),距离变换的参数又要微调。

每次客户说「我们换了一种螺栓」,我就头皮发麻。不是技术难度的问题,而是这种参数调优的工作量根本没有尽头


时代变了

后来深度学习起来了。

同样是螺栓计数,用目标检测算法来做,流程变成了:

  1. 标注几百张螺栓图片
  2. 训练一个检测模型
  3. 推理,输出数量

完了。

不用调阈值,不用做距离变换,不用操心打光变化。反光?模型见过。遮挡?模型见过。轻微旋转?模型见过。不同型号的螺栓?多标几张,重新训练就行。

甚至不用自己做标注——用预标注工具半自动化处理,几百张图的标注工作半天就搞定了。

精度?99%以上,轻松超过传统方案。

速度?30毫秒以内,比传统方案快了二十多倍。

我第一次用深度学习跑通螺栓计数的时候,坐在电脑前愣了好一会儿。

不是因为效果有多好——我已经习惯了深度学习很强。

而是因为我突然意识到,当年我花三个月做的那个分水岭方案——图像反转、二值化、距离变换、粒子分析,那八步流程——现在只需要三步就替代了。

三个月的工作,变成了三天的配置。

说真的,当时心里五味杂陈。一方面觉得技术进步太快了,另一方面又觉得——那三个月也算没白花。没有那些踩坑的经历,我也不会理解为什么深度学习这么重要。
在这里插入图片描述
在这里插入图片描述


传统视觉还有用吗

说这个问题之前,先讲一个后来的真实案例。

去年有个客户找到我,说他们产线上有一套10年前部署的视觉检测系统,要升级。

我去看了一眼代码——全是传统机器视觉的东西:边缘检测、模板匹配、形态学操作,跟当年我做的螺栓计数方案几乎一模一样。

这套系统跑了10年,精度还行,但维护成本越来越高——每次换产品就要改参数,每次改打光就要调阈值,原开发者早就离职了,没人知道那些参数是怎么来的。

客户问:「能不能用深度学习改造一下?」

改造了。精度从95%提升到99.5%,维护工作量降低了80%,换产品只需要重新标注训练,不用再调那些莫名其妙的参数。

所以传统视觉还有用吗?

我的回答是:在理解原理和改造老系统的时候有用。在新项目里,基本可以不碰了。

但这不代表传统视觉的知识白学了。分水岭算法的思路(把粘连目标分开),现在在深度学习的后处理里还在用。形态学操作(膨胀、腐蚀、开运算、闭运算),在图像预处理阶段依然是标准操作。距离变换?语义分割的后处理里经常出现。

这些概念没有过时。过时的是把它们当成主力方案的做法。


我从螺栓计数项目学到的三件事

  1. 参数调优没有尽头。传统视觉方案最大的坑不是算法本身,而是对场景的极度依赖。换一个条件就崩。深度学习的泛化能力是质的飞跃。

  2. 选型比算法更重要。当年如果有人告诉我深度学习能做到这个精度和速度,我绝对不会花三个月去调分水岭。但当时没有这个选项。选型的前提是知道有哪些选项——这跟今天选开源项目一样,你得多看、多试、多比较。

  3. 老系统的维护成本会被严重低估。交付的时候精度够用,客户满意。但三年后、五年后呢?原开发者走了,参数没人懂了,硬件换了驱动不兼容了。深度学习方案虽然前期标注成本高,但后期维护成本远低于传统方案。


作者:头帕王子
系列专栏:工业视觉踩坑实录
如果觉得有用,点赞关注不迷路 👋

如果你也在做类似的工业视觉项目,希望这篇文章能帮你少走些弯路。有问题欢迎留言或加我好友讨论。


📎 相关专栏

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐