我正在与之合作的开发人员正在开发一个程序,用于分析路面图像以找出路面裂缝。对于他的程序找到的每个裂缝,它会在一个文件中生成一个条目,告诉我哪些像素组成了特定的裂缝。他的软件有两个问题:
1)它会产生几个误报
2)如果他发现裂缝,他只能找到它的一小部分,并将这些部分表示为单独的裂缝。
我的工作是编写软件来读取这些数据,进行分析,然后分析误报和实际裂缝之间的区别。我还需要确定如何将裂缝的所有小部分组合在一起。
我已经尝试了各种方法来过滤数据以消除误报,并且已经使用神经网络在一定程度上成功地将裂缝组合在一起。我知道会有错误,但截至目前,存在太多错误。有没有人对非AI专家有任何见解,以了解完成任务或了解更多信息的最佳方法?我应该阅读什么类型的书,或者我应该选择哪种课程?
编辑我的问题更多的是关于如何注意同事数据中的模式并将这些模式识别为实际裂缝。这是我所关注的更高级逻辑,而不是低级逻辑。
编辑实际上,至少需要20个样本图像来准确表示我正在使用的数据。它变化很大。但我确实有一个示例here,here和here。这些图像已经由我的同事处理。红色,蓝色和绿色数据是我必须分类的(红色代表暗裂纹,蓝色代表轻质裂纹,绿色代表宽/密封裂纹)。
答案 0 :(得分:16)
除了有关图像处理的有用评论之外,听起来您还在处理clustering problem。
聚类算法来自machine learning文献,特别是unsupervised learning。顾名思义,基本思想是尝试在一些大型数据集中识别自然聚类数据点。
例如,下图显示了聚类算法如何将一堆点分组为7个聚类(用圆圈和颜色表示):
(来源:natekohl.net)
在您的情况下,聚类算法会尝试重复合并小裂缝以形成更大的裂缝,直到满足某些停止标准。最终结果是一组较小的连接裂缝。当然,裂缝与二维点略有不同 - 在此处使聚类算法工作的一部分技巧将是在两个裂缝之间定义有用的距离度量。
常用的群集算法包括k-means clustering(demo)和hierarchical clustering。第二个链接也有一个很好的逐步解释k-means如何工作。
编辑:Phillips的一些工程师的论文看起来与你想要做的事情相关:
他们正在对硅晶圆上的缺陷进行目视检查,并在使用最近邻聚类算法检测缺陷之前使用median filter去除噪声。
以下是他们引用的一些相关论文/书籍可能有用:
答案 1 :(得分:3)
您的问题属于图像分类的广泛领域。这些类型的问题可能是众所周知的困难,并且在一天结束时,解决它们是一门艺术。您必须利用有关问题域的每一条知识,使其易于处理。
一个基本问题是正常化。您希望在数据表示中使类似的分类对象尽可能相似。例如,如果您有裂缝图像,是否所有图像都具有相同的方向?如果没有,那么旋转图像可能有助于您的分类。同样,缩放和翻译(参考this)
您还希望从训练集中删除尽可能多的无关数据。您可以使用edge extraction(例如Canny边缘检测),而不是直接处理图像。这将消除图像中的所有“噪音”,只留下边缘。然后减少练习以确定哪些边缘是裂缝,哪些是自然路面。
如果你想快速找到一个解决方案,那么我建议你先用Convolutional Neural Net试试你的运气,它可以用最少的预处理和noramlization执行相当不错的图像分类。它在手写识别方面非常有名,可能适合您正在做的事情。
答案 2 :(得分:2)
我对你选择解决问题的方式感到有点困惑。如果你的同事没有发现完整的裂缝,那就是规格,那么这就是你的问题所在。但如果你设法将所有的裂缝缝合在一起,并避免他的误报,那么你还没有完成他的工作吗?
除此之外,我认为这是edge detection问题,而不是分类问题。如果边缘检测器是好的,那么你的问题就会消失。
如果您仍处于分类阶段,那么您将需要一个具有已知答案的训练集,因为您需要一种方法来量化误报与真实裂缝的区别。但是我仍然认为你的分类器不太可能连接裂缝,因为这些裂缝特定于每个单独的铺路板。
答案 3 :(得分:2)
我必须同意ire_and_curses,一旦你深入到边缘检测的领域来修补你的共同开发人员的裂缝检测,并消除他的误报,看起来好像你会做他的工作。如果你可以修补他的软件没有发现的东西,并删除他给你的东西的误报。看起来你可以为完整的图像做到这一点。
如果规范是让他检测裂缝,并对它们进行分类,那么他的工作就是进行边缘检测并消除误报。而你的工作就是拿走他给你的东西并分类它是什么类型的裂缝。如果你必须进行边缘检测,那么听起来你不会让你的共同开发人员失业。
答案 4 :(得分:2)
这里有一些非常好的答案。但如果你无法解决问题,你可以考虑机械土耳其人。在某些情况下,对于顽固的问题来说,这可能是非常划算的。我知道有人将它用于各种类似的事情(验证人类可以轻松做到但很难编码)。
答案 5 :(得分:1)
我无论如何都不是专家,但试着看Haar Cascades。您可能还希望尝试使用OpenCV工具包。这两件事共同面对检测和其他物体检测任务。
你可能需要做“训练”来开发一个Haar级联,用于路面裂缝。
答案 6 :(得分:1)
我建议您选择任何图像处理教科书并阅读相关主题。 特别是,您可能会对Morphological Operations like Dilation和Erosion感兴趣,它们可以补充edge detector的工作。网上有很多材料......
答案 7 :(得分:1)
识别数据模式的最佳方法是什么,以及了解该主题的最佳方法是什么?
最好的方法是学习模式识别和机器学习。我将从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)。另外,看一下样本图像,我会说你应该尝试改进边缘检测。也许用高斯平滑图像并运行更积极的边缘检测可以增加对较小裂缝的检测。
答案 8 :(得分:0)
这是图像处理问题。有很多关于这个主题的书籍,这些书中的大部分内容都超出了这样的线检测问题。以下是一种可以解决问题的技术概要。
当您发现裂缝时,您会发现构成裂缝的一些像素。边缘检测滤波器或其他边缘检测方法可用于此。
从裂缝中的一个(任意)像素开始,然后“跟随”它以从裂缝中制作多点线 - 保存构成线的点。如果它们靠近直线,您可以删除一些中间点。用所有裂缝像素做到这一点。如果你有星形裂缝,不要担心。只需按照一个(或两个)方向上的像素组成一条线,然后从这组裂缝像素中移除这些像素。星星的其他腿将被识别为单独的线(暂时)。
您可以在步骤1之前对裂缝像素执行一些细化。换句话说,检查像素的邻居,如果有太多,则忽略该像素。 (这是一个简化 - 你可以找到几个算法。)另一个预处理步骤可能是删除所有太薄或两个微弱的行。这可能有助于误报。
现在你有很多短线,多点线。对于每条线的端点,找到最近的线。如果线条在公差范围内,则“连接”线条 - 链接它们或将它们添加到相同的结构或阵列。通过这种方式,您可以连接紧密的裂缝,这可能与混凝土中的裂缝相同。
似乎无论算法如何,都需要进行一些参数调整才能获得良好的性能。写它,这样就可以很容易地对强度阈值,最小和最大厚度等进行微小的改动。
根据使用环境的不同,您可能希望允许用户判断确定可疑案例,和/或允许用户查看所有裂缝并单击以组合,拆分或删除检测到的裂缝。
答案 9 :(得分:0)
您应该阅读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-test 和 Chi平方测试,以查看两个不相关的变量是否与某些置信度相关。
答案 10 :(得分:0)
你得到了一些非常好的答案,尤其是@ Nate,以及建议的所有链接和书籍都是值得的。但是,我很惊讶没有人建议这本书本来是我的首选 - O'Reilly的Programming Collective Intelligence。标题似乎与您的问题没有密切关系,但是,相信我,内容 :我见过的最实用,面向程序员的数据挖掘和“机器学习”的覆盖范围之一。给它一个旋转! - )
答案 11 :(得分:0)
这听起来有点像岩石力学中存在的问题,岩体中存在关节,这些关节必须按方向,长度和其他属性分组为“组”。在这种情况下,一种效果很好的方法是聚类,尽管经典的K-means似乎确实存在一些我过去使用遗传算法运行迭代解决方案的问题。
在这种情况下,我怀疑它可能不会以完全相同的方式工作。在这种情况下,我怀疑你需要创建你的组,即纵向,横向等,并准确定义每个组的行为是什么,即单个纵向裂缝分支沿着它的长度方向,如果它做了什么做那就是它的分类。
一旦你有了每个裂缝,我会根据你创建的分类产生随机裂缝或裂缝模式。然后,您可以使用类似最小二乘法的方法来查看您检查的裂缝与您产生的随机裂缝/裂缝的紧密程度。您可以通过蒙特卡罗分析的方式多次重复此分析,以确定哪个随机生成的裂缝/裂缝最适合您正在检查的那个。
然后处理误报,你需要为每种不同类型的误报创建一个模式,即路边的边缘是一条直线。然后,您将能够运行分析,挑选出您分析的每个裂缝最可能的组。
最后,您需要'调整'不同裂缝类型的定义,以尝试获得更好的结果。我想这可以使用自动方法或手动方法,具体取决于您如何定义不同的裂缝类型。
当我遇到这样的问题时,有时会有一些其他修改就是有一个随机组。通过调整随机组的灵敏度,即随机组中包含裂缝的可能性或多或少,您有时可以将模型的灵敏度调整为不适合任何地方的复杂模式。
祝你好运,看起来像你有一个真正的挑战。