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

关于作者
我接触视觉整整10年。
工业视觉、烟草、煤矿等行业都有深度开发经验。从硬件选型、算法开发、模型训练,到上位机开发及部署,都在一线磨过。
之前是多家公司人工智能团队的技术负责人。现在自己创业了,还在继续做视觉落地这件事。
作者说
这可能是踩坑实录系列里时间跨度最长的一篇。
里面讲的方案,有些是很多年前做的。那时候深度学习还没普及,工业视觉的主流武器是传统机器视觉——形状匹配、模板匹配、边缘检测、形态学操作、分水岭分割。
这套东西现在看起来"古老",但当时就是最先进的方法论。
我决定写下来,不是因为这些技术现在还值得学,而是因为——亲身经历从传统视觉到深度学习的完整切换,这种视角正在变得越来越稀缺。
现在入行的年轻人,上来就是YOLO、注意力机制、大模型,对传统视觉的理解可能停留在课本上。但很多在产线上跑了十年八年的老系统,底层就是这些"老古董"。你要维护它、改造它,甚至替它升级,就得理解它当初为什么这么做。
这是第十一篇。
需求:数螺栓
需求很简单——一张图里有一堆螺栓,数出来有多少个。
听起来像入门级的CV任务对吧?
当年可一点都不简单。
螺栓这种东西,做计数有几个天然的难点:
- 排列密集,螺栓之间挨得很近,边缘会粘连
- 表面反光,金属材质打光不均匀,亮暗差异大
- 有遮挡,有时候螺栓被其他零件挡住一部分
- 背景复杂,螺栓所在的基板、螺母、垫片都是干扰项
现在你肯定想——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毫秒左右——在当时的硬件条件下,勉强能跟上产线节拍。
客户满意了。项目交付了。
但我自己心里清楚:这套方案太脆弱了。
换个打光角度,阈值要重新调。换一批螺栓(表面处理不同),形态学参数要改。换一个摄像头(分辨率变了),距离变换的参数又要微调。
每次客户说「我们换了一种螺栓」,我就头皮发麻。不是技术难度的问题,而是这种参数调优的工作量根本没有尽头。
时代变了
后来深度学习起来了。
同样是螺栓计数,用目标检测算法来做,流程变成了:
- 标注几百张螺栓图片
- 训练一个检测模型
- 推理,输出数量
完了。
不用调阈值,不用做距离变换,不用操心打光变化。反光?模型见过。遮挡?模型见过。轻微旋转?模型见过。不同型号的螺栓?多标几张,重新训练就行。
甚至不用自己做标注——用预标注工具半自动化处理,几百张图的标注工作半天就搞定了。
精度?99%以上,轻松超过传统方案。
速度?30毫秒以内,比传统方案快了二十多倍。
我第一次用深度学习跑通螺栓计数的时候,坐在电脑前愣了好一会儿。
不是因为效果有多好——我已经习惯了深度学习很强。
而是因为我突然意识到,当年我花三个月做的那个分水岭方案——图像反转、二值化、距离变换、粒子分析,那八步流程——现在只需要三步就替代了。
三个月的工作,变成了三天的配置。
说真的,当时心里五味杂陈。一方面觉得技术进步太快了,另一方面又觉得——那三个月也算没白花。没有那些踩坑的经历,我也不会理解为什么深度学习这么重要。

传统视觉还有用吗
说这个问题之前,先讲一个后来的真实案例。
去年有个客户找到我,说他们产线上有一套10年前部署的视觉检测系统,要升级。
我去看了一眼代码——全是传统机器视觉的东西:边缘检测、模板匹配、形态学操作,跟当年我做的螺栓计数方案几乎一模一样。
这套系统跑了10年,精度还行,但维护成本越来越高——每次换产品就要改参数,每次改打光就要调阈值,原开发者早就离职了,没人知道那些参数是怎么来的。
客户问:「能不能用深度学习改造一下?」
改造了。精度从95%提升到99.5%,维护工作量降低了80%,换产品只需要重新标注训练,不用再调那些莫名其妙的参数。
所以传统视觉还有用吗?
我的回答是:在理解原理和改造老系统的时候有用。在新项目里,基本可以不碰了。
但这不代表传统视觉的知识白学了。分水岭算法的思路(把粘连目标分开),现在在深度学习的后处理里还在用。形态学操作(膨胀、腐蚀、开运算、闭运算),在图像预处理阶段依然是标准操作。距离变换?语义分割的后处理里经常出现。
这些概念没有过时。过时的是把它们当成主力方案的做法。
我从螺栓计数项目学到的三件事
-
参数调优没有尽头。传统视觉方案最大的坑不是算法本身,而是对场景的极度依赖。换一个条件就崩。深度学习的泛化能力是质的飞跃。
-
选型比算法更重要。当年如果有人告诉我深度学习能做到这个精度和速度,我绝对不会花三个月去调分水岭。但当时没有这个选项。选型的前提是知道有哪些选项——这跟今天选开源项目一样,你得多看、多试、多比较。
-
老系统的维护成本会被严重低估。交付的时候精度够用,客户满意。但三年后、五年后呢?原开发者走了,参数没人懂了,硬件换了驱动不兼容了。深度学习方案虽然前期标注成本高,但后期维护成本远低于传统方案。
作者:头帕王子
系列专栏:工业视觉踩坑实录
如果觉得有用,点赞关注不迷路 👋
如果你也在做类似的工业视觉项目,希望这篇文章能帮你少走些弯路。有问题欢迎留言或加我好友讨论。
📎 相关专栏
更多推荐


所有评论(0)