NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

你是否曾经需要组合来自两个不同来源(例如图像和文本)的对象数据? 我们在工作的过程中经常面临这样的挑战。 在这里,我们展示了技术绘图领域的一个示例。 此类图纸用于许多领域,供专家共享信息。 它们由遵循非常具体的指导原则的图纸组成,以便每个专家都能理解其中描绘的内容。 通常,技术图纸以允许索引的格式给出,例如 svg、html、dwg、dwf 等。但许多,尤其是较旧的图纸,仅以图像格式(jpeg、png、bmp 等)存在,例如来自 书籍扫描件。 此类图纸很难自动访问,这使得其使用困难且耗时。 在这方面,可以使用自动检测工具来方便搜索。

在这篇博文中,我们将演示如何应用传统的和基于深度学习的计算机视觉技术从爆炸图中提取信息。 我们假设这样的绘图与绘图上每个对象的一些文本信息一起给出。 这些物体可以通过与其相连的数字来识别。 这是此类绘图的一个相当简单的示例:电钻机。

每张图都包含三个关键组成部分:数字、对象和辅助线。 辅助线用于将对象与数字连接起来。

当前的任务是在大量图纸中找到某种类型/类别的所有对象,例如 上图中编号为 653 的插座出现在多张图纸中,甚至出现在其他制造商的图纸中。 这是一个典型的分类任务,但有一个警告:由于每个对象都可以通过数字访问附加信息,因此我们需要首先将图像上的每个数字分配给相应的对象。 接下来我们描述这个辅助任务可以通过使用传统的计算机视觉技术来解决。

2、经典计算机视觉技术

我们主要使用传统的计算机视觉技术来寻找这些组件及其关系。 可能有一些相当复杂的机器学习架构可以做到这一点,但我们发现启发式方法已经起作用了。 这样,我们也不需要手动创建边界框来学习。 下面介绍的算法会遍历所有图纸,标记每个对象的边界并找到附加到该对象的编号。

在考虑技术图纸时,一些预期的挑战是:

  • 图像拥挤 - 技术图纸通常有多个可能重叠的对象。
  • 对象可变性 - 图像上存在的对象在大小和形状上具有很大的可变性。
  • 细节少——绘图主要由轮廓组成,没有纹理、颜色等。
  • 噪声/伪影 - 有些线不属于任何对象,例如辅助线。

鉴于当前的挑战,我们将我们的方法分为三个部分。

2.1 数字检测

在技术图纸上,数字通常以非常可预测的方式出现:相同的字体、相似的大小和方向。 因此,人们可以使用模板匹配——至少在同一家公司的图纸中。 使用像 Tesseract 这样的 OCR 工具也是可能的,并且可以更好地概括来自不同公司的绘图。

2.2 图像预处理

此步骤旨在转换图像,以便消除或减少可能的伪影,从而提高最终数字到对象分配的性能。 简而言之,我们首先从图像中删除数字(参见步骤 1)。 接下来,我们执行图像二值化,然后将轮廓转换为“实体”对象。 我们使用膨胀等形态学操作来缩小轮廓中的“间隙”。 此外,我们将每个对象的内部像素标记为前景。 我们通过去除辅助线来完成预处理。 这为我们提供了连接的组件,如下图所示。

2.3 数物匹配

到目前为止,将数字与物体匹配的最有力提示是距离。 通过查看每个数字的邻域,我们找到最接近的对象,这可以被视为匹配。 如果我们之前没有正确地将前景分割成连接的组件,那么两个数字可能会接近同一个组件。 然后,我们取出两个数字中的每一个,沿着它们的辅助线并分割组件,以便每个数字都分配给连接组件的自己的部分。

经过这些步骤后,我们可以知道图像上的每个数字对应的对象在哪里。 对于人类来说很容易,但对于计算机来说却具有挑战性。 是时候使用这些信息将每个对象的图像输入分类器了。 我们有一组图像,其中我们知道该对象的每个数字属于什么类别。 是时候进行一些机器学习了。

3、对象分类的深度学习

我们从图中取出连接的组件,并在每个组件周围绘制一个边界框,这给了我们几个想要分类的新的较小图像 - 还可以包含文本信息并让文本分类器和图像分类器进行投票,但是文本 分类器超出了本博客文章的范围。

3.1 方法

我们将每个图像的分类分解为以下两个步骤,这使我们可以自由地为每个步骤尝试不同的方法:

  • 图像编码器:获取对象的图像并将其转换为低维向量(例如 512 个数字),其中包含有意义的分类信息。
  • 向量分类器:从图像编码器生成的向量中查找对象的类型。

编码器是一个函数E,其输入提取自图像 Im,输出发送到向量分类C,我们将这两个函数的组合称为模型M,即 M(Im) = C(E(Im)) 。因此M是算法输出的类。 当然,这两个函数都有参数/权重,并且可以使用训练数据找到这些参数/权重。 毫不奇怪,我们使用的神经网络对于图像分类非常有用。

3.2 图像编码器

对于所有方法,我们选择的模型M(Im) = C(E(Im)) 是一个 ResNet18,一个具有数百万个参数的函数,其中E是一个卷积神经网络(CNN),C是全连接层。

首先,我们加载在 ImageNet 分类任务上预训练的参数值。 但我们需要扔掉C并将其替换为适合我们需要的一个,因为C最初用于不同的分类任务(动物、你在街上看到的物体等)。 很容易使用 PyTorch、TensorFlow 或类似的深度学习库加载C。

3.3 分类器

可以使用以下两种方法之一:

  • 迁移学习:使用加载的编码器E并使用特定数据来训练我们的特定任务分类器C的参数。
  • 度量学习:训练距离函数,当且仅当图像上的属于同一类型的对象相似时,确保E(Im1)和E(Im2)接近。

3.4 使用迁移学习直接分类

这里我们简单的替换一下原始 ResNet18 模型的组件C为一个新的线性函数对进行改造,输出维度为对象类的数量。 然后通过检查输出向量中的哪个值最高来决定分配的类型。 我们有两个选择:

  • 只需训练C的参数:使用E的预训练权重,这个方法有效,即使编码器E是使用过照片训练的。
  • 训练C和E的参数:仅当每个对象类的训练样本数量较多时,这才可行。

为了生成更多的训练图像,我们还应用图像增强。 这是从旧图像创建新图像的标准技术:我们使用剪切(可以从稍微不同的角度观察对象)、裁剪(无论如何,边界框并不总是完美的)、不同的亮度/对比度和水平翻转。

3.5 度量学习

如果每个对象类型的训练示例数量非常低(例如,如果我们有很多对象类,但每个对象类型只有三到五个图像),则此方法非常有用。 对于每对图像Im1和Im2,我们分别应用编码器E,然后学习距离函数d,这应该得到 d(E(Im1), E(Im2))=0 ,如果两个图像属于同一类, 否则得到 d(E(Im1), E(Im2))=1

对于Im的图像分类,我们寻找与Im距离d最接近的图像Imtrain,并将Imtrain的类别分配给Im。


3.6 距离函数的参数

距离函数d是使用训练数据学习的。 通过这种方式,距离函数可以学习提取哪些特征对于区分对象类别很重要。

添加新对象类时,度量学习有好处:首先,仅对象类的子集需要大量标签。 在理想情况下,在类子集上训练的模型可以很好地推广到语义相似的类。 这允许在不重新训练模型的情况下增加类的数量。 其次,可以进行一次性学习,即基于单个参考样本进行分类。

4、结束语

我们为解释技术图纸的问题绘制了一条流程。 这表明,我们的项目通常不能通过简单地训练教科书上的一个猫狗分类器来完成。 如果图中的数字并不重要,可以尝试更标准的物体检测,例如 YOLO。 我们在这里提出的问题有所不同,因为我们使用了更少的图像,但图像更加标准化并且富含数字。

还有大量的技术图纸需要自动处理。 当然,简单地使用结构化 CAD 数据而不是图像会更方便 - 但这也需要制造公司之间就数字标准达成某种协议。


原文链接:Extracting information from technical drawings

BimAnt翻译整理,转载请标明出处