如何为视觉检测训练对象检测模型,使用合成数据
本文讨论了训练用于工业视觉检测的精确物体检测模型所面临的挑战,并提出了使用合成数据来解决数据集限制。
人工智能正在迅速改变工业视觉检测。在工厂环境中,视觉检测用于许多问题,包括在组装过程中检测缺陷、缺失或不正确的零件。计算机视觉可以帮助及早发现产品问题,从而降低产品交付给客户的可能性。
然而,开发精确和多功能的物体检测模型对于边缘人工智能开发者来说仍然是一个挑战。强大的物体检测模型需要访问全面且具有代表性的数据集。在许多制造场景中,真实世界的数据集未能捕捉到实际场景的复杂性和多样性。狭窄的环境和有限的变化的限制给训练模型有效适应各种情况带来了挑战。
团队可以利用合成数据来训练模型,这些数据多样化、随机化,与真实世界场景高度相似,并弥补数据集的不足。结果是更准确、适应性更强的人工智能模型,可以部署到工业自动化、医疗保健和制造等广泛的边缘人工智能应用中。
从合成数据生成到人工智能训练
Edge Impulse 是一个集成开发平台,使开发者能够为边缘设备创建和部署人工智能模型。它支持数据收集、预处理、模型训练和部署,帮助用户有效地将人工智能能力集成到他们的应用中。
通过 NVIDIA Omniverse Replicator(NVIDIA Omniverse 的核心扩展),用户可以生成物理精确、逼真的、带有注释的合成图像,格式为通用场景描述,即 OpenUSD。然后,这些图像可以用于在 Edge Impulse 平台上训练物体检测模型。
NVIDIA Omniverse™ 是一个计算平台,使个人和团队能够开发基于通用场景描述 (OpenUSD) 的 3D 工作流程和应用程序。
OpenUSD 是一种高度通用且可互操作的 3D 交换和格式,由于其可扩展性、性能、版本控制和资产管理功能,在合成数据生成方面表现出色,是创建复杂和逼真数据集的理想选择。有一个庞大的 3D 内容工具生态系统连接到 OpenUSD 和 基于 USD 的 SimReady 资产,这使得将基于物理的对象轻松集成到场景中并加速我们的合成数据生成工作流程成为可能。
Omniverse Replicator 可以在多个领域对 USD 数据进行随机化,以表示物体检测模型可能遇到的真实世界场景。
使用新的 Edge Impulse Omniverse 扩展,只需点击几下即可将 USD 中生成的合成图像用于在 Edge Impulse 中训练模型。
该扩展是使用 Omniverse Kit Python 扩展模板开发的,用户可以通过它连接到 Edge Impulse API,并选择要上传合成数据集的数据集。Kit Python 扩展模板是一个简单且易于理解的资源,用于代码片段选项和快速开发扩展。
为物体检测模型生成合成数据
要了解使用 Omniverse Replicator 生成合成数据并在 Edge Impulse 中训练模型的工作流程,请遵循我们检测汽水罐模型的示例。
该过程的第一步是构建一个虚拟副本或数字孪生环境,以代表真实场景。用于生成合成图像的场景由可移动和不可移动物体组成。不可移动的物体包括灯光、传送带和两个摄像头,而可移动的物体则包括汽水罐。通过采用域随机化,您可以改变许多属性,包括选定的不可移动和可移动物体的位置、照明、颜色、纹理、背景和前景。
这些资产在 Omniverse Replicator 中通过 OpenUSD 表示。3D 模型文件可以转换为 USD,并使用 Omniverse CAD Importer 扩展导入到 Omniverse Replicator 中。
灯光在逼真的图像生成中起着关键作用。矩形灯可以模拟面板发出的光,而穹顶灯则照亮整个场景。您可以随机化灯光的各种参数,例如温度、强度、比例、位置和旋转。
以下脚本显示通过正态分布采样随机化温度和强度,并通过均匀分布随机化比例。灯光的位置和旋转固定不变。
# Lightning setup for Rectangular light and Dome light
def rect_lights(num=1):
lights = rep.create.light(
light_type="rect",
temperature=rep.distribution.normal(6500, 500),
intensity=rep.distribution.normal(0, 5000),
position=(45, 110, 0),
rotation=(-90, 0, 0),
scale=rep.distribution.uniform(50, 100),
count=num
)
return lights.node
rep.randomizer.register(rect_lights)
def dome_lights(num=3):
lights = rep.create.light(
light_type="dome",
temperature=rep.distribution.normal(6500, 500),
intensity=rep.distribution.normal(0, 1000),
position=(45, 120, 18),
rotation=(225, 0, 0),
count=num
)
return lights.node
rep.randomizer.register(dome_lights)
大多数场景都有对环境很重要的固定物体,比如桌子,或者在本例中,传送带。这些物体的位置可以固定,而物体的材质可以随机化以反映现实世界的可能性。
以下脚本在 USD 中生成了一个传送带,罐子将被放置在上面。它还固定了其位置和旋转。在这个例子中,我们没有随机化传送带的材质。
# Import and position the conveyor belt
conveyor = rep.create.from_usd(CONVEYOR_USD, semantics=[('class', 'conveyor')])
with conveyor:
rep.modify.pose(
position=(0, 0, 0),
rotation=(0, -90, -90),
)
为了保证高质量的数据集,最好使用多个不同分辨率的摄像头,并将其策略性地放置在场景中。摄像头的位置也可以随机化。该脚本设置了两个不同分辨率的摄像头,并策略性地放置在场景中的不同位置。
# Multiple setup cameras and attach to render products
camera = rep.create.camera(focus_distance=focus_distance, focal_length=focal_length,
position=cam_position, rotation=cam_rotation, f_stop=f_stop)
camera2 = rep.create.camera(focus_distance=focus_distance2, focal_length=focal_length2,
position=cam_position2, rotation=cam_rotation, f_stop=f_stop)
# Render images
render_product = rep.create.render_product(camera, (1024, 1024))
render_product2 = rep.create.render_product(camera2, (1024, 1024))
最后一步是随机化可移动物体的位置,同时将它们保持在相关区域内。在此脚本中,我们初始化了五个 3D 罐头模型实例,这些实例是从可用罐头资产集合中随机选择的。
cans = list()
for i in range(TOTAL_CANS):
random_can = random.choice(cans_list)
random_can_name = random_can.split(".")[0].split("/")[-1]
this_can = rep.create.from_usd(random_can, semantics=[('class', 'can')])
with this_can:
rep.modify.pose(
position=(0, 0, 0),
rotation=(0, -90, -90)
)
cans.append(this_can)
然后,对罐子的姿态进行随机化,并将它们分散到两个平面上,使罐子保持在传送带上,同时避免碰撞。
with rep.trigger.on_frame(num_frames=50, rt_subframes=55):
planesList=[('class','plane1'),('class','plane2')]
with rep.create.group(cans):
planes=rep.get.prims(semantics=planesList)
rep.modify.pose(
rotation=rep.distribution.uniform(
(-90, -180, 0), (-90, 180, 0)
)
)
rep.randomizer.scatter_2d(planes, check_for_collisions=True)
数据标注、模型构建和真实物体测试
生成图像后,可以使用 Edge Impulse Omniverse 扩展,通过几次点击将其上传到 Edge Impulse Studio。在 Edge Impulse Studio 中,可以使用 Yolov5 物体检测模型等模型对数据集进行标注和训练。版本控制系统可以跟踪不同数据集版本和超参数的模型性能,以优化精度。
要测试模型在真实世界物体上的准确性,您可以使用 Edge Impulse CLI 工具流式传输实时视频并在本地运行模型。
如果模型无法准确检测物体,则必须在额外的数据集上训练模型。这种迭代过程是人工智能模型训练的常态。合成数据的另一个好处是,后续迭代中所需的变化可以通过编程方式完成。
在此示例中,生成并使用了一个额外的合成数据集来训练模型以提高性能。该额外数据集使用了距离传送带更远的摄像机距离。可以修改摄像机角度和材料等其他参数,以在额外的数据集中提高性能。
采取以数据为中心的方法,即针对模型的故障点创建更多数据,对于解决机器学习问题至关重要。额外的训练和参数微调可以使模型在不同的方向、材料和其他相关条件下具有良好的泛化能力。
开始使用合成数据训练和部署边缘人工智能
生成物理精确的合成数据非常简单。只需免费下载 Omniverse,然后按照Omniverse Code 中 Replicator 入门的说明进行操作。您可以在此会话中获取概述。
订阅新闻稿,并在 Instagram、Medium 和 Twitter 上关注我们,以获取 NVIDIA Omniverse 的最新资讯。如需更多资源,请查看我们的论坛、Discord 服务器、Twitch 和 YouTube 频道。