×

用于对象检测的合成数据生成

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-25

刘满贵

分享资料个

描述

 

 

深度学习极大地提高了计算机视觉的性能,使其能够达到人类甚至在某些情况下甚至超人类水平的能力。在过去的几年里,用于训练深度神经网络的框架一直在提高其用户友好性,以至于具有一些 Python 编程技能的普通用户可以训练和使用神经网络来完成广泛的计算机视觉任务,包括图像分类、对象检测和语义分割。

不过有一个警告——众所周知,如果你想获得好的结果,深度神经网络需要大量数据进行训练。在某些情况下,您可以使用开放数据集 - 然后问题就解决了。

在图像分类的情况下,可以通过抓取网络获得中小型数据集。对于对象检测,情况更加困难,因为训练对象检测网络不仅需要图像,还需要注释文件,其中包含边界框坐标。因此,如果有问题的对象没有可用的良好开源检测数据集,您唯一的选择是手动创建数据集,这可能是一项乏味的任务。

除非...

您可以使用合成数据自动执行数据集创建过程。有几种方法可以生成用于对象检测的合成数据:

1)只需将对象粘贴到背景上并随机化它们的方向/比例/位置

2)使用逼真的3D渲染引擎,如Unreal Engine

3) 使用 GAN 生成数据?当然,在这种情况下,您已经拥有一个能够识别/检测相关对象的网络(GAN 中的鉴别器),所以这有点像鸡与蛋的问题

2022 年 4 月 4 日更新我尽我所能定期更新我的文章,并根据您在 YouTube/Hackster 评论部分的反馈。如果您想表达对这些努力的支持和赞赏,请考虑给我买杯咖啡(或披萨):)。

在本文中,我们将重点介绍最简单和最容易剖析的方法 - 剪切粘贴。不要被脚本生成的图像看似简单和不切实际的外观所迷惑。卷积神经网络没有逻辑或常识——因此对于我们的对象检测网络,即使是看似荒谬的图像也是一个很好的学习材料。

poYBAGNYhJSABk25AAEDYNuTw3w632.png
在这些照片中,重力似乎消失了。嗯,YOLO 不知道重力
 

我的任务是MARK 机器人平台的乐高检测模型我在 Kaggle 上找到了一个很好的乐高分类数据集,但没有现成的检测数据集。所以我决定重新设计用于为论文Cut, Paste and Learn: Surprisingly Easy Synthesis for Instance Detection生成合成场景的代码

下载并准备对象实例

从这里下载乐高图像数据集它实际上也是使用 Autodesk Maya 2020 从 3D 模型程序生成的。

对于合成数据生成,我们将需要对象实例及其二进制掩码——在我们的例子中,由于乐高积木都在黑色背景上,我们可以简单地使用以下阈值脚本来生成这些掩码。我们还随机给乐高积木上色,因为我们希望模型检测不同颜色的乐高积木。

# Standard imports
import cv2
import numpy as np;
import os
import time
import random
import sys

colors = ([1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [0, 1, 1], [1, 0, 1])
input_folder = sys.argv[1]
output_folder = sys.argv[2]
try:
    os.mkdir(os.path.join(os.path.join(output_folder, "imgs")))
    os.mkdir(os.path.join(os.path.join(output_folder, "masks")))
except Exception:
    pass
for folder in os.listdir(input_folder):
    for file in os.listdir(os.path.join(input_folder, folder)):
        print(file)
        img = cv2.imread(os.path.join(input_folder, folder, file))
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        ret, thresh = cv2.threshold(gray, 1,255, cv2.THRESH_BINARY_INV)
        
        #coloring
        RGB = random.randint(0, len(colors)-1)  
        img[thresh == 0] *= np.array(colors[RGB], dtype='uint8')
        
        #writing to files
        cv2.imwrite(os.path.join(os.path.join(output_folder, "imgs", file)), img)
        cv2.imwrite(os.path.join(os.path.join(output_folder, "masks", file)), thresh)
        
        cv2.imshow('final', img)
        cv2.waitKey(50)
cv2.destroyAllWindows()

使用输入文件夹的名称运行上述脚本(其中包含具有不同对象图像的文件夹,每种类型的对象一个)和输出文件夹,其中将保存图像和蒙版,例如

python helper.py objects output
pYYBAGNYhJaABgpOAAA3Svr9VfQ811.png
 

您将看到正在处理和保存的图像。

poYBAGNYhJmAE_GyAACRAxyCywA710.png
 

接下来,克隆我的剪切、粘贴和学习论文代码的分支——我将其更改为使用 Python 3 并接受.png 图像作为掩码。

git clone https://github.com/AIWintermuteAI/syndata-generation.git

安装所有必需的依赖项(我建议您安装依赖项并在 Python 的虚拟环境中执行脚本,例如 conda 或 virtualenv)。

pip install -r requirements.txt

将带有图像和蒙版的文件夹放入 data_dir/objects_dir 并在 data_dir/backgrounds 中添加或更改背景图片。干扰物是我们试图检测的其他不是物体的物体——我在做这个项目时没有使用它们。然后使用以下命令运行生成脚本:

python dataset_generator.py data_dir/objects_dir/lego/imgs output_dir/ --num 3 --scale --dontocclude

和...

这就是我在几秒钟内生成数千个数据样本时的想法
 

获得数据后,我们需要对其进行适当的结构化。需要有 4 个文件夹——训练图像、训练注释、验证图像和验证注释。只需从刚刚生成的数据中剪切一些图片和注释,然后将它们粘贴到验证图像和注释文件夹中。确保剪切而不是复制图像/注释。

训练模型

您可以使用任何框架/脚本来训练模型 - 但是我建议使用aXeleRate,这是一个基于 Keras 的边缘 AI 框架它将自动训练模型并将训练会话的最佳模型转换为边缘推理所需的格式 - 目前它支持将训练模型转换为:.kmodel(K210)、.tflite 格式(提供完整的整数和动态范围量化支持),OpenVINO IR 模型格式。实验性支持:Google Edge TPU、TensorRT。

pYYBAGNYhJuAGwZaAAAQfLNBZgw732.png
 

在本地机器上安装 aXeleRate

pip install git+https://github.com/AIWintermuteAI/aXeleRate

要下载示例,请运行:

git clone https://github.com/AIWintermuteAI/aXeleRate.git

您可以使用aXeleRate文件夹中的 tests_training_and_inference.py运行快速测试它将为每种模型类型运行训练和推理,保存和转换训练好的模型。由于它只训练 5 个 epoch 并且数据集非常小,您将无法获得有用的模型,但此脚本仅用于检查是否存在错误。

对于实际训练,您需要运行以下命令:

python axelerate/train.py -c config/lego_detector.json

您可以从此处下载 example.json 配置文件和预训练模型确保更改图像/注释训练和验证文件夹路径以匹配它们在系统上的位置。有关配置文件中附加参数的进一步说明,请查看本文

推理

训练完成后,您可以使用以下命令在您的计算机上进行快速健全性检查并执行推理:

python axelerate/infer.py -c config/lego_detector.json --weights path-to-h5-weights

以下步骤将取决于您要运行训练模型的硬件。例如,对于 Raspberry Pi,使用 generated.tflite 模型和这个示例脚本

在本文中,我们将使用基于 K210 的机器人平台进行 AI 教育,MARK(代表 Make A Robot Kit)将项目文件夹中的.kmodel 文件复制到SD 卡中,并将SD 卡插入cyberEye 主板——cyberEye 是Maixduino 的定制版本首先,让我们使用来自 TinkerGen 的图形编程环境 Codecraft 快速测试我们的机器人乐高检测功能。

打开 Codecraft ,选择 MARK(cyberEye) 作为设备,添加自定义模型扩展并定义具有以下属性的对象检测模型:

poYBAGNYhJ2AYNXLAAB_dh42_XE383.png
 

然后使用新出现的块创建以下代码:

poYBAGNYhJ-ACKy-AACY5Li9eUA672.png
 

如果您觉得卡住了,可以从本文的附件中下载 Codecraft 的 .cdc 文件。

 

它适用于较大的乐高积木,但也可以检测较小的积木。在找到四月标签后,机器人会接近四月标签,直到达到设定的距离。然后它放下乐高积木,转身并从循环的开头继续。

如果您使用相同型号和相同打印的 April Tag(A3 纸,tag36h11_1),您可以简单地在 MaixPy IDE 中执行代码并观看您的机器人收集乐高积木!

如果您有任何问题,请在LinkedIn上添加我,并订阅我的 YouTube 频道,以获得有关机器学习和机器人技术的更多有趣项目的通知。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !