我正在开发的一个开发人员正在开发一个程序来分析路面图像,以找到路面裂缝。对于他的程序找到的每个裂缝,它会在一个文件中生成一个条目,告诉我哪些像素组成了特定的裂缝。他的软件有两个问题:
1)它产生几个误报
2)如果他发现裂缝,他只能找到它的一小部分,并将这些部分表示为单独的裂缝。
我的工作是编写软件来读取这些数据,进行分析,并分析误报和实际裂缝之间的区别。我还需要确定如何将裂缝的所有小部分组合在一起。
我已经尝试了各种方法来过滤数据以消除误报,并且已经使用神经网络在有限的成功程度上将裂缝组合在一起。我知道会有错误,但截至目前,存在太多错误。有没有人对非AI专家有任何见解,以了解完成任务或了解更多信息的最佳方法?我应该阅读什么类型的书籍,或者我应该选择什么样的课程?
编辑我的问题更多的是关于如何注意我的同事数据中的模式并将这些模式识别为实际裂缝。这是我所关注的更高级逻辑,而不是低级逻辑。
编辑实际上,至少需要20个样本图像来准确表示我正在使用的数据。它变化很大。但我确实有一个样本here,here和here。这些图像已经由我的同事处理。红色,蓝色和绿色数据是我必须分类的(红色代表暗裂纹,蓝色代表轻微裂纹,绿色代表宽/密封裂纹)。
除了有关图像处理的有用评论之外,它听起来也像是在处理clustering problem。
聚类算法来自machine learning文献,特别是unsupervised learning。顾名思义,基本思想是尝试在一些大型数据集中识别自然数据点集群。
例如,下图显示了聚类算法如何将一堆点分组为7个聚类(由圆圈和颜色表示):
(来源:natekohl.net)
在您的情况下,聚类算法将尝试重复合并小裂缝以形成更大的裂缝,直到满足一些停止标准。最终结果是一组较小的连接裂缝。当然,裂缝与二维点略有不同 - 在这里使聚类算法工作的一部分技巧将是定义两个裂缝之间的有用距离度量。
流行的聚类算法包括k-means clustering(demo)和hierarchical clustering。第二个链接也有一个很好的逐步解释k-means如何工作。
编辑:菲利普斯的一些工程师的这篇论文看起来与你想要做的事情相关:
他们正在对硅晶片上的缺陷进行目视检查,并在使用最近邻聚类算法检测缺陷之前使用median filter去除噪声。
以下是他们引用的一些相关论文/书籍可能有用:
你得到了一些非常好的答案,尤其是@ Nate,以及建议的所有链接和书籍都是值得的。然而,我很惊讶没有人建议这本书本来是我的首选 - O'Reilly的Programming Collective Intelligence。标题可能与你的问题似乎没有密切关系,但是,相信我,内容是:我见过的最实用,面向程序员的数据挖掘和“机器学习”的报道之一。给它一个旋转! - )
这听起来有点像岩石力学中存在的问题,岩体中存在关节,这些关节必须按方向,长度和其他属性分组为“组”。在这种情况下,一种运行良好的方法是聚类,尽管经典的K-means似乎确实存在一些我过去使用遗传算法运行交互式解决方案的问题。
在这种情况下,我怀疑它可能不会以相同的方式工作。在这种情况下,我怀疑你需要创建你的组,即纵向,横向等,并准确定义每个组的行为是什么,即单个纵向裂缝分支沿着它的长度方向,如果它做了什么做那就是它的分类。
一旦你有了每个裂缝,我会根据你创建的分类产生随机裂缝或裂缝模式。然后,您可以使用类似最小二乘法的方法来查看您检查的裂缝与您产生的随机裂缝/裂缝的紧密程度。您可以通过蒙特卡罗分析的方式多次重复此分析,以确定哪个随机生成的裂缝/裂缝最适合您正在检查的那个。
然后,为了处理误报,您需要为每种不同类型的误报创建一个模式,即路缘的边缘是一条直线。然后,您将能够运行分析,挑选出您分析的每个裂缝最可能的组。
最后,您需要“调整”不同裂缝类型的定义,以尝试获得更好的结果。我想这可以使用自动方法或手动方法,具体取决于您如何定义不同的裂缝类型。
当我遇到这样的问题时,另外一个有时会有帮助的修改就是有一个随机组。通过调整随机组的灵敏度,即随机组中包含裂缝的可能性或多或少,您有时可以将模型的灵敏度调整为不适合任何地方的复杂模式。
祝你好运,看起来像你有一个真正的挑战。
你应该读一下data mining,特别是pattern mining。
数据挖掘是从数据中提取模式的过程。随着收集的数据越来越多,数据量每三年翻一番,数据挖掘正成为将这些数据转化为信息的一种越来越重要的工具。它通常用于广泛的分析实践,例如营销,监视,欺诈检测和科学发现。
关于这个主题的好书是Data Mining: Practical Machine Learning Tools and Techniques
(来源:waikato.ac.nz)](http://www.amazon.com/Data-Mining-Ian-H-Witten/dp/3446215336“ISBN 0-12-088407-0”)
基本上,您需要将统计工具和方法应用于数据集。最常用的比较方法是学生t检验和卡方检验,以查看两个不相关的变量是否与某些置信度相关。
您的问题属于图像分类的广泛领域。这些类型的问题可能是众所周知的困难,并且在一天结束时,解决它们是一门艺术。您必须利用有关问题域的每一项知识,使其易于处理。
一个基本问题是正常化。您希望在数据表示中使类似的分类对象尽可能相似。例如,如果您有裂缝图像,是否所有图像都具有相同的方向?如果没有,那么旋转图像可能有助于您的分类。同样,缩放和翻译(参考this)
您还希望从训练集中删除尽可能多的无关数据。可能你可以使用edge extraction(例如Canny边缘检测),而不是直接处理图像。这将消除图像中的所有“噪音”,只留下边缘。然后减少练习以确定哪些边缘是裂缝,哪些是自然路面。
如果你想快速找到解决方案,那么我建议你先用Convolutional Neural Net试试你的运气,它可以用最少的预处理和noramlization执行相当不错的图像分类。它在手写识别方面非常有名,可能适合您正在做的事情。
你选择打破这个问题的方式我有点困惑。如果你的同事没有发现完整的裂缝,那就是规格,那么这就是你的问题所在。但是,如果你设法将所有的裂缝缝合在一起,并避免他的误报,那么你还没有完成他的工作吗?
除此之外,我认为这是一个edge detection问题而不是分类问题。如果边缘检测器是好的,那么你的问题就会消失。
如果您仍然处于分类状态,那么您将需要一个具有已知答案的训练集,因为您需要一种方法来量化误报与真实裂缝的区别。但是我仍然认为你的分类器不太可能连接裂缝,因为这些裂缝特定于每个单独的铺路板。
我必须同意ire_and_curses,一旦你深入到边缘检测的领域来修补你的共同开发人员的裂缝检测,并消除他的误报,看起来好像你会做他的工作。如果你可以修补他的软件没有发现的东西,并删除他给你的东西的误报。看起来你可以为完整的图像做到这一点。
如果规范是让他检测裂缝,并对你进行分类,那么他的工作是进行边缘检测并消除误报。而你的工作就是拿走他给你的东西并分类它是什么类型的裂缝。如果你必须进行边缘检测来做到这一点,那么听起来你不会让你的合作开发者失业。
这里有一些非常好的答案。但如果你无法解决问题,你可以考虑机械土耳其人。在某些情况下,对于顽固的问题来说,这可能是非常划算的。我知道有人将它用于各种类似的事情(验证人类可以轻松做到但很难编码)。
无论如何我不是专家,但试着看看Haar Cascades。您可能还希望尝试使用OpenCV工具包。这两件事共同面对检测和其他物体检测任务。
您可能需要进行“训练”以开发Haar Cascade以解决路面裂缝问题。
识别数据模式的最佳方法是什么,以及了解该主题的最佳方法是什么?
最好的方法是研究模式识别和机器学习。我将从Duda的Pattern Classification开始,并使用Bishop的Pattern Recognition and Machine Learning作为参考。材料沉入需要一段时间,但是获得模式识别的基本意义和分类问题的主要方法应该给你方向。我可以坐在这里对你的数据做一些假设,但老实说,你可能对数据集有最好的了解,因为你比任何人都更多地处理它。例如,一些有用的技术可能是support vector machine和boosting。
编辑:增强的一个有趣的应用是实时人脸检测。见Viola / Jones的Rapid Object Detection using a Boosted Cascade of Simple Features(pdf)。另外,看一下样本图像,我会说你应该尝试改进边缘检测。也许用高斯平滑图像并运行更积极的边缘检测可以增加对较小裂缝的检测。
我建议你拿起任何图像处理教科书并阅读这个主题。特别是,您可能对Morphological Operations like Dilation和Erosion感兴趣,它补充了edge detector的工作。网上有很多材料......
这是图像处理问题。有很多关于这个主题的书籍,这些书中的大部分内容都超出了这样的线检测问题。以下是一种可以解决问题的技术概述。
似乎无论算法如何,一些参数调整对于良好的性能都是必要的。写它,这样很容易在强度阈值,最小和最大厚度等方面做一些小改动。
根据使用环境,您可能希望允许用户判断确定可疑案例,和/或允许用户查看所有裂缝并单击以组合,拆分或删除检测到的裂缝。