19

我正在与之合作的一位开发人员正在开发一个程序,该程序可以分析路面图像以发现路面裂缝。对于他的程序发现的每一个裂缝,它都会在一个文件中生成一个条目,告诉我哪些像素构成了那个特定的裂缝。他的软件有两个问题:

1)它产生了几个误报

2) 如果他找到裂缝,他只找到它的一小部分,并将这些部分表示为单独的裂缝。

我的工作是编写软件来读取这些数据,对其进行分析,并区分误报和实际裂缝之间的区别。我还需要确定如何将裂缝的所有小部分组合在一起。

我尝试了各种过滤数据以消除误报的方法,并且一直在有限程度上成功地使用神经网络将裂缝组合在一起。我知道会有错误,但到目前为止,错误太多了。对于非 AI 专家,是否有人对完成我的任务或了解更多信息的最佳方式有任何见解?我应该读什么样的书,或者我应该参加什么样的课程?

编辑我的问题更多是关于如何注意到我同事数据中的模式并将这些模式识别为实际裂缝。我关心的是高级逻辑,而不是低级逻辑。

编辑实际上,至少需要 20 张样本图像才能准确表示我正在使用的数据。它变化很大。但我这里这里这里都有一个样本。这些图像已由我同事的流程处理。红色、蓝色和绿色数据是我必须分类的(红色代表暗裂缝,蓝色代表浅裂缝,绿色代表宽/密封裂缝)。

4

12 回答 12

16

除了关于图像处理的有用评论外,听起来您正在处理一个聚类问题

聚类算法来自机器学习文献,特别是无监督学习。顾名思义,基本思想是尝试在一些大型数据集中识别数据点的自然集群。

例如,下图显示了聚类算法如何将一堆点分成 7 个聚类(用圆圈和颜色表示):

k-均值
(来源:natekohl.net

在您的情况下,聚类算法将尝试重复合并小裂缝以形成更大的裂缝,直到满足某些停止标准。最终结果将是一组较小的连接裂缝。当然,裂缝与二维点略有不同——让聚类算法在这里工作的部分技巧将是定义两个裂缝之间的有用距离度量。

流行的聚类算法包括k-means 聚类演示)和层次聚类。第二个链接也有一个很好的逐步解释 k-means 是如何工作的。

编辑:菲利普斯的一些工程师的这篇论文看起来与你想做的事情有关:

  • Chenn-Jung Huang, Chua-Chin Wang, Chi-Feng Wu,“用于晶片缺陷簇识别的图像处理技术”,IEEE 计算机设计与测试,卷。19,没有。2,第 44-48 页,2002 年 3 月/4 月。

他们正在对硅晶片上的缺陷进行目视检查,并在使用最近邻聚类算法检测缺陷之前使用中值滤波器去除噪声。

以下是他们引用的一些可能有用的相关论文/书籍:

  • M. Taubenlatt 和 J. Batchelder,“<strong>在集群环境中使用空间过滤的图案化晶圆检测”,应用光学,第一卷。31,没有。17,1992 年 6 月,第 3354-3362 页。
  • F.-L。陈和 S.-F。刘,“<strong>一种识别半导体制造中缺陷空间模式的神经网络方法。” IEEE Trans。半导体制造,第一卷。13,没有。3,2000 年 8 月,第 366-373 页。
  • G. Earl、R. Johnsonbaugh 和 S. Jost,模式识别和图像分析Prentice Hall,上马鞍河,新泽西州,1996 年。
于 2009-09-23T18:25:25.643 回答
3

您的问题属于非常广泛的图像分类领域。这些类型的问题可能非常困难,归根结底,解决它们是一门艺术。您必须利用您对问题域的所有知识使其易于处理。

一个基本问题是标准化。您希望具有相似分类的对象在其数据表示中尽可能相似。例如,如果您有裂缝的图像,所有图像是否都具有相同的方向?如果没有,那么旋转图像可能有助于您的分类。同样,缩放和平移(参考this

您还希望从训练集中尽可能多地删除不相关的数据。而不是直接处理图像,也许您可​​以使用边缘提取(例如 Canny 边缘检测)。这将从图像中删除所有“噪声”,只留下边缘。然后将练习简化为识别哪些边缘是裂缝,哪些是天然路面。

如果您想快速找到解决方案,那么我建议您首先尝试使用卷积神经网络来试试运气,它可以通过最少的预处理和标准化来执行非常好的图像分类。它在手写识别方面非常有名,可能正好适合您正在做的事情。

于 2009-09-17T21:34:01.770 回答
2

我对您选择解决问题的方式有点困惑。如果您的同事没有识别出完整的裂缝,这就是规范,那么这就是您的问题。但是,如果您设法将所有裂缝缝合在一起,并避免他的误报,那么您不是刚刚完成了他的工作吗?

除此之外,我认为这是一个边缘检测问题而不是分类问题。如果边缘检测器很好,那么您的问题就会消失。

如果您仍然在分类,那么您将需要一个具有已知答案的训练集,因为您需要一种方法来量化区分误报和真正裂缝的因素。但是,我仍然认为您的分类器不太可能连接裂缝,因为这些裂缝特定于每个单独的铺路板。

于 2009-09-17T21:22:40.250 回答
2

我必须同意 ire_and_curses,一旦你深入到边缘检测领域来修补你的共同开发者的裂缝检测,并消除他的误报,你似乎会做他的工作。如果你能修补他的软件没有检测到的东西,并消除他对他给你的东西的误报。似乎您可以为完整图像执行此操作。

如果规范是让他检测裂缝,然后你对它们进行分类,那么他的工作就是进行边缘检测并消除误报。而你的工作就是接受他给你的东西并分类它是什么类型的裂缝。如果您必须进行边缘检测才能做到这一点,那么听起来您离让您的共同开发人员失业不远了。

于 2009-09-17T21:49:55.153 回答
2

这里有一些非常好的答案。但是如果你无法解决问题,你可以考虑 Mechanical Turk。在某些情况下,它对于顽固的问题可能非常划算。我知道有人将它用于各种类似的事情(验证人类可以轻松完成但证明很难编码)。

https://www.mturk.com/mturk/welcome

于 2009-09-23T18:30:36.640 回答
1

无论如何,我都不是专家,但请尝试查看Haar Cascades。您可能还希望尝试使用 OpenCV 工具包。这两件事一起完成人脸检测和其他物体检测任务。

您可能需要进行“培训”以开发 Haar Cascade 以应对路面裂缝。

于 2009-09-17T21:14:13.307 回答
1

我建议您拿起任何图像处理教科书并阅读该主题。特别是,您可能对Dilation和Erosion </a>形态学 运算感兴趣 ,它补充了边缘检测器的工作。网上资料很多。。。

于 2009-09-17T21:28:46.070 回答
1

识别数据模式的最佳方法是什么,以及了解有关该主题的更多信息的最佳方法是什么?

最好的方法是学习模式识别和机器学习。我将从 Duda 的模式分类开始,并使用 Bishop 的模式识别和机器学习作为参考。材料需要很长时间才能深入,但对模式识别和分类问题的主要方法有基本的了解应该会给你指明方向。我可以坐在这里对你的数据做一些假设,但老实说,你可能对数据集有最好的了解,因为你处理它的次数比任何人都多。例如,一些有用的技术可能是支持向量机提升

编辑:增强的一个有趣的应用是实时人脸检测。请参阅 Viola/Jones 的使用 Boosted Cascade of Simple Features 的快速对象检测(pdf)。此外,查看示例图像,我会说您应该尝试稍微改进边缘检测。也许使用高斯平滑图像并运行更积极的边缘检测可以增加对较小裂缝的检测。

于 2009-09-28T05:23:31.497 回答
0

这是一个图像处理问题。有很多关于这个主题的书籍,这些书籍中的大部分材料都将超出这样的线路检测问题。以下是可以解决该问题的一种技术的概述。

  1. 当你找到裂缝时,你会发现一些构成裂缝的像素。为此可以使用边缘检测过滤器或其他边缘检测方法。

  2. 从裂缝中的一个(任何)像素开始,然后“跟随”它从裂缝中形成一条多点线——保存构成该线的点。如果它们靠近直线,您可以删除一些中间点。对所有裂纹像素执行此操作。如果您有星形裂缝,请不要担心。只需沿着一个(或两个)方向的像素组成一条线,然后将这些像素从裂纹像素集中移除。星的其他腿将被识别为单独的线(现在)。

  3. 您可以在步骤 1 之前对裂纹像素进行一些细化。换句话说,检查像素的邻居,如果有太多则忽略该像素。(这是一种简化——您可以找到几种算法。)另一个预处理步骤可能是删除所有太细或两条模糊的线。这可能有助于误报。

  4. 现在你有很多短的多点线。对于每条线的端点,找到最近的线。如果线条在公差范围内,则“连接”这些线条——链接它们或将它们添加到相同的结构或数组中。这样,您可以连接紧密的裂缝,这可能是混凝土中的相同裂缝。

似乎无论算法如何,为了获得良好的性能,都需要进行一些参数调整。编写它以便于对强度阈值、最小和最大厚度等内容进行细微更改。

根据使用环境,您可能希望允许用户判断确定有问题的情况,和/或允许用户查看所有裂缝并单击以合并、拆分或删除检测到的裂缝。

于 2009-09-23T05:01:41.800 回答
0

您应该阅读数据挖掘,特别是模式挖掘

数据挖掘是从数据中提取模式的过程。随着越来越多的数据被收集,数据量每三年翻一番,数据挖掘正成为将这些数据转化为信息的越来越重要的工具。它通常用于广泛的分析实践,例如营销、监视、欺诈检测和科学发现。

关于该主题的一本好书是《数据挖掘:实用机器学习工具和技术》

数据挖掘可以在亚马逊购买。
(来源:waikato.ac.nz ](http://www.amazon.com/Data-Mining-Ian-H-Witten/dp/3446215336 “ISBN 0-12-088407-0”)

基本上,您要做的就是将统计工具和方法应用于您的数据集。最常用的比较方法是学生t 检验卡方检验,以查看两个不相关的变量是否具有一定的置信度。

于 2009-09-23T17:43:38.077 回答
0

你得到了一些很好的答案,尤其是。@Nate's,以及所有建议的链接和书籍都是值得的。然而,我很惊讶没有人推荐我最喜欢的一本书——O'ReillyProgramming Collective Intelligence。标题似乎与您的问题无关,但是,相信我,内容:我见过的最实用、面向程序员的数据挖掘和“机器学习”的覆盖范围之一。试一试!-)

于 2009-09-27T05:37:42.987 回答
0

这听起来有点像岩石力学中的一个问题,岩体中有节理,这些节理必须按方向、长度和其他属性分组为“组”。在这种情况下,一种效果很好的方法是聚类,尽管经典的 K-means 似乎确实存在一些问题,我过去使用遗传算法来运行交互解决方案已经解决了这些问题。

在这种情况下,我怀疑它可能不会以完全相同的方式工作。在这种情况下,我怀疑您需要从纵向、横向等开始创建您的组,并准确定义每个组的行为,即单个纵向裂纹分支是否可以沿着其长度的一部分进行,如果它做了什么这对它的分类。

一旦你有了它,那么对于每个裂缝,我会根据你创建的分类生成一个随机裂缝或裂缝模式。然后,您可以使用最小二乘法之类的方法来查看您正在检查的裂缝与您生成的随机裂缝的匹配程度。您可以以蒙特卡罗分析的方式多次重复此分析,以确定随机生成的裂缝中的哪一个最适合您正在检查的裂缝。

然后为了处理误报,您需要为每种不同类型的误报创建一个模式,即路缘的边缘是一条直线。然后,您将能够运行分析,为您分析的每个裂缝挑选出最有可能的组。

最后,您需要“调整”不同裂纹类型的定义,以尝试获得更好的结果。我想这可以使用自动方法或手动方法,具体取决于您如何定义不同的裂缝类型。

当我遇到这样的问题时,另一种有时会有所帮助的修改是有一个随机组。通过调整随机组的敏感度,即随机组中包含裂纹的可能性有多大,有时可以调整模型对不适合任何地方的复杂模式的敏感度。

祝你好运,在我看来你遇到了真正的挑战。

于 2009-09-28T15:01:15.763 回答