编程生成计算机视觉训练数据集

训练计算机视觉模型的两个最大挑战是稀疏数据集或所需的标注工作。对于稀疏数据集,训练图像很难获得训练所需的数量。相反,你可能有丰富的训练图像,但标注数万个图像需要巨大的工作量。

编程生成计算机视觉训练数据集
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

训练计算机视觉模型的两个最大挑战是稀疏数据集或所需的标注工作。对于稀疏数据集,训练图像很难获得训练所需的数量。相反,你可能有丰富的训练图像,但标注数万个图像需要巨大的工作量。

通过使用合成生成的图像或引导模型来辅助标注,可以克服这些问题。

1、使用Blender合成生成和标注图像

Blender是一个3D图像渲染工具,可以通过Python进行编程控制。3D模型可以加载到场景中,进行操作、贴图、调整光照并渲染图像。

光线投射让我们能够找到渲染对象在图像中的确切位置,因此可以自动生成标注。摄像机向场景投射虚拟光线,并检测哪些光线与对象相交,这给出了对象在帧中的轮廓。

因此,我们现在能够非常快速地生成数万张自动标注的多样化图像。

2、从卫星图像中检测飞机

在公共卫星图像中找到足够的飞机图像几乎是不可能的,这使得渲染的Blender图像成为训练的唯一可行选择。

第一步是收集固定高度的空跑道图像。每个跑道都被应用到一个平坦的多边形上以创建场景。

然后需要检查每个跑道以确定潜在的锚点;这些是飞机可能随机出现的位置。这些是在3D空间中定义的x,y,z坐标点。这确保我们不会将飞机放在草地上或机库顶部。锚点被标记为轻型用于普通喷气机,重型用于大型飞机。

加载每架飞机的模型并进行比例归一化。制造商的高度、宽度和长度规格用于确保如果每张图像中指定了多架飞机,它们看起来是按比例的。

最好的训练集具有多样化的图像集。我们可以通过改变一些环境变量来增加多样性。我们可以做的第一件事是为飞机应用不同的纹理,以便模型通过轮廓而不是颜色来识别飞机。其次,我们可以改变太阳的位置以改变飞机投射的阴影。最后,我们可以使用透明的png云图像在后期处理中添加云层覆盖。

所有这些只有通过Blender的编程控制才可能实现。Python脚本可以直接修改场景,加载和定位模型,应用纹理,修改光照,渲染场景并保存图像的光线投射边界。

管道流程按顺序运行如下:

  1. 选择并加载地形
  2. 从库中加载N架飞机并为每架应用纹理
  3. 随机将飞机放置在锚点上,方向随机
  4. 改变太阳的位置和强度
  5. 循环并以随机仰角和方向拍摄每架飞机
  6. 定义图像中任何飞机的边界并在JSON中记录标签

通过这种方式,可以在相对较短的时间内生成数千张飞机训练图像。Blender效率极高,即使在内存有限的普通笔记本电脑上也能表现良好。

3、循环式燃气表表盘

从循环式燃气表表盘读取数字看起来是一个基本的OCR可以完成的简单操作。然而,OCR只有在表盘数字对齐时才有效。当数字在两个数字之间旋转一半时,识别失败经常发生。

仪表在户外读取,有时在直射阳光或昏暗条件下,以及各种角度。这个问题可以通过使用循环式表盘模型来理想地解决,该模型可以在不同的光照条件和多个角度下渲染。

生成一个随机数,一个函数将返回读数中每个表盘的旋转角度。因此,当右边的数字是5时,左边的数字将向下一个数字过渡一半。这提供了看起来真实的读数。

由于我们知道表盘在图像中的位置以及它们应该表示的数字,我们可以自动标注每个生成的图像,并生成数千个预标注的数据集图像。

4、使用合成图像的训练数据集

一个更难的问题是读取指针表盘,这是人类有时也会出错的地方。这里我们不是读取打印的数字,而是计算指针指向的数字。

我首先尝试了一系列图像分析技术:在照片中找到指针,测量其角度,推断读数。这大多是无效的,而且当仪表以倾斜表盘的角度拍摄时,它肯定会失败。所以,我改变了方法,与其分析一张困难的图像,不如生成数千张具有精确已知指针位置的图像,让模型从这些图像中学习。

一个典型的仪表有四到六个表盘,表盘方向交替;顺时针,然后逆时针,依此类推。反直觉的是,读数是从右到左取的。当指针正好位于边界上时,其左侧表盘是读5还是6取决于其右侧表盘的值,这些轮子是耦合的,因此每个表盘的确切位置受其前一个表盘的影响。

仪表分解为三个部分,可以在代码中分离然后重新组装:仪表单元、圆形表盘和指针。

要生成训练集,Python脚本运行以下序列:

  1. 生成一个四到六位数长的随机数
  2. 随机选择一种仪表样式并加载到内存中
  3. 将匹配数量的空白表盘粘贴到仪表上,交替顺时针和逆时针
  4. 从右到左将指针粘贴到表盘上,每个指针的角度取决于其前一个
  5. 添加阴影和划痕以引入噪声
  6. 应用随机模糊以模拟失焦相机
  7. 用指针指示的值标注每个表盘

从右到左读取表盘时,精度至关重要。读数为5告诉你比5.2、5.5或5.8更少;小数部分告诉你表盘向下一个数字进展了多远,这反过来决定了你如何读取其左侧的表盘。

虽然3D渲染场景制作复杂,但合成图像速度极快,可以在几分钟内生成数千张图像。

在数万张这种低成本生产的图像上训练后,该模型能够可靠地分类每个表盘的方向以及指针向下一个整数移动的距离。它在区分5.9和6,或6和6.1方面表现出色。

5、引导标注数据集

有时问题会反转。图像不是太少,而是有数千张,瓶颈是快速标注它们以使其有用。

训练检测太阳能电池板、屋顶安装的冷却装置和游泳池的模型就是一个很好的例子:来自Google Maps的卫星图像提供了几乎无限量的示例。图像是免费的;标注是昂贵的部分。

诀窍是让模型分担工作。我首先手动标注了200张图像——足以训练一个粗糙但可用的YOLO模型,该模型已经可以在卫星图像中检测目标对象。

这个基础模型然后用于自动标注另外200张图像,这些图像可以快速检查和调整。现在我有400张图像来训练模型;200张我手动标注的,以及基础模型帮助标注的额外200张。

这个基础模型然后用于自动标注另外200张图像,这些图像可以快速检查和调整。现在我有400张图像来训练:200张我手动标注的,以及基础模型为我标注的200张。

从那里开始,它变成了一个循环:

  1. 手动标注一个小种子集并训练初始模型
  2. 在新一批图像上运行模型以生成草稿标签
  3. 审查和纠正草稿——比从头开始标注快得多
  4. 将纠正后的批次添加到训练集中并重新训练
  5. 重复,每轮标注都比上一轮更快

在每次迭代中,模型做得更多,你做得更少。一旦它能够可靠地标注每批新图像而无需干预,训练就可以被认为是完成的。

6、选择正确的方法

根据计算机视觉项目的性质,有多种方法可以克服稀疏数据集或标注工作问题。哪种方法适合取决于一个问题:稀缺资源是图像还是标签?

当真实图像几乎不存在时,例如从正上方看到的停在跑道上的飞机;你需要生成图像。Blender中的3D场景让你放置你控制的对象,因此标注可以免费从渲染中获得。同样的想法读取旋转的循环计数器,其中数字只是转动到已知角度的轮子。

当对象太小或难以在3D中建模,但容易分解成部分时,你可以改为合成。扁平的仪表表面、空白表盘和指针在Python中重新组装,以完整3D管道成本的一小部分产生数万张精确标注的指针表盘图像。

而当图像丰富但未标注时,例如无尽卫星图像中的太阳能电池板和游泳池,你将问题反转,让一个粗糙的模型为你标注下一批,边做边纠正,直到它不再需要纠正。

共同点在每种情况下都是相同的:让人远离繁琐的循环,但永远不要远离准确的循环。无论你渲染数据、合成它还是引导标签,目标都是以足够低的成本生产大型、多样化、精确标注的训练集,以使原本不可能的模型成为可能。


原文链接: Programmatically Generating Datasets for Computer Vision Training...

汇智网翻译整理,转载请标明出处。