为什么要使用卷积神经网络进行视觉检查任务而不是经典的 CV 模板匹配?

数据挖掘 机器学习 图像分类 卷积神经网络
2021-09-15 08:30:47

基于我们正在进行的一个项目,我提出了一个有趣的讨论:为什么要使用 CNN 视觉检测系统而不是模板匹配算法?

背景:我展示了一个简单的 CNN 视觉系统(网络摄像头 + 笔记本电脑)的演示,该系统检测特定类型的物体是否“损坏”/有缺陷 - 在本例中是 PCB 电路板。我的 CNN 模型在静态背景上展示了正确和损坏的电路板的示例(每个大约 100 张图像)。我们的模型使用了预训练的 VGG16 的前几个 conv/maxpool 层(在 imagenet 上),然后我们添加了更多可训练的 convs/pools,其中有一些密集,导致 dim-3 one 热编码矢量输出用于分类: (is_empty, has_good_product, has_defective_product)。

该模型很容易训练并达到 99% 的验证,没有问题;因为我们知道我们的数据集很小,所以我们还进行了各种数据增强训练。在实践中,它在 10 次中大约工作了 9 次,但是同一电路板的一些随机平移/旋转偶尔会将其置于相反的类别中。也许更积极的数据增强会有所帮助。无论如何,对于原型概念项目,我们很高兴。

现在我们正在向另一位工程师和他的同事展示,他提出了这样的论点,即 NN 在这方面太过分了,应该只使用模板匹配,为什么要使用 CNN?

对于为什么我们的方法在某些应用程序(例如要检查的其他部件)中更好的原因,我们没有很好的答案。我们提出的一些观点:

1)对不变性更鲁棒(例如通过数据增强)

2)可以进行在线学习以改进系统(例如,人类可以告诉软件哪些示例出错了)

3) 无需像经典计算机视觉算法那样设置阈值 你们认为,对于此类检查任务,CNN 系统是否有更多优势?在什么情况下会比模板匹配更好?

关于深度神经网络何时可以成为这项工作的技术的一些随机想法:对于需要 3D 深度感应作为输入的一部分的系统,或者任何可以变形/拉伸/挤压但仍然“好”的对象类型无缺陷(例如毛绒玩具、电线等)。很想听听你的想法:)

3个回答

答案取决于任务。模板匹配适用于某些任务,但并非适用于所有任务。CNN 可能具有泛化到与您的任何模板都不匹配的看不见的输入的能力,因此可以更好地泛化。

但是 CNN 是否会击败模板匹配将取决于具体的任务以及你想要实现的具体目标。这是一门经验科学;最终,您发现哪种方法效果更好的方法是同时尝试它们——或者向尝试过它们的其他人学习(例如,通过阅读文献)。我认为您不会找到某种理论或分类法来替代对现实世界数据的经验评估。

使用 NN(和其他分类方法)可能会遇到的一个问题是,由于您只向它展示了某些缺陷,它可能不知道如何对未来可能出现的全新/尚未发现的缺陷做出反应。

您希望 NN 学习“任何看起来不像无缺陷的 PCB 的东西都是有缺陷的 PCB”。但是,如果它知道“任何看起来不像有缺陷的 PCB 都是无缺陷的 PCB”怎么办?

您可以尝试通过在随机位置添加一个小白点(或另一个小扰动)来修改一些无缺陷 PCB 的图像,并让神经网络对这些修改后的图像进行分类。它绝对应该将它们归类为有缺陷的,对吧?但它可能会错过一些(或相当多),因为它以前从未见过这样的缺陷。

为了检测全新的缺陷,异常检测方法/一类分类器可能更......值得信赖,因为它们应该拾取以前从未见过的任何东西。

正如 DW 所说,您只需要尝试两种方法并找出哪种方法效果更好。只要确保有一个非常好的测试集,它还包含全新的缺陷!

为您的应用程序提出传统 CV 方法的工程师只是出于习惯这样做。使用模板匹配是非常过时的,并且已经被证明表现很差。但是,我确实认为 CNN 过于矫枉过正,具体取决于数据集的大小。

模板匹配如何工作?

模板匹配会在您的图像上滑动一个窗口,该窗口将提供与模板的匹配百分比。如果匹配百分比高于某个预定义阈值,则假定它是匹配的。例如,如果您有一张狗的图像,并且您想确定图像中是否有狗,您可以在整个图像区域周围滑动狗模板并查看是否存在足够大的匹配百分比。这可能会导致性能非常差,因为它要求模板以相同的方式重叠图像在实践中发生这种情况的可能性有多大?不是很高。

唯一一次模板匹配是一种足够的技术是,如果您确切地知道您在寻找什么,并且您确信它在给定类的每个示例中几乎都会出现相同的情况。

为什么要改用机器学习?

机器学习技术并不死板。与 stmax 所说的不同,CNN 能够很好地泛化数据集这就是他们如此强大的原因。使用狗的例子,CNN 不需要查看存在的每只狗的照片来理解什么是狗。你可以从谷歌搜索中显示 1000 张图片,然后算法将能够检测到你的狗,实际上是一只狗。机器学习算法的泛化能力非常好,这是它们取代了所有古老的 CV 技术的原因。现在的问题是训练 CNN 所需的数据量。它们是数据密集型的。

我认为 100 个数据点不足以训练一个健壮的 CNN。由于模型的深度复杂性,为了限制偏差,您需要增加示例数量。我通常为深度模型的每个特征建议 100 个示例,为浅层模型的每个特征建议 10 个示例。这真的完全取决于你的特征空间。

我的建议。

你真正在做的是异常检测您将展示许多其他情况良好的 PCB 示例。您想检测那些损坏的。因此,我会尝试一些异常检测方法。它们实现起来要简单得多,并且您可以使用浅层模型获得良好的结果,尤其是在倾斜数据集中(1 类被过度表示)。