用合成数据训练托盘检测模型【机器学习】
想象一下,你是一名机器人或机器学习 (ML) 工程师,负责开发一个模型来检测托盘,以便叉车可以操纵它们。 你熟悉传统的深度学习流程,已经整理了手动标注的数据集,并且已经训练了成功的模型。
推荐:用 NSDT设计器 快速搭建可编程3D场景。
你已准备好迎接下一个挑战,即大堆密集堆放的托盘。 你可能想知道,应该从哪里开始? 2D 边界框检测或实例分割对于此任务最有用吗? 应该进行 3D 边界框检测吗?如果是的话,我将如何对其进行标注? 是否最好使用单目相机、立体相机或激光雷达进行检测? 考虑到自然仓库场景中出现的托盘数量巨大,手动标注并不是一件容易的事。 如果我弄错了,代价可能会很高。
这是我在遇到类似情况时所想的。 幸运的是,我有一种简单的方法可以以相对较低的投入开始:合成数据。
1、合成数据概述
合成数据生成 (SDG:Synthetic Data Generation) 是一种使用渲染图像而不是真实图像生成数据来训练神经网络的技术。 使用综合渲染数据的优点是,你隐式地知道场景中对象的完整形状和位置,并且可以生成标注,例如 2D 边界框、关键点、3D 边界框、分割蒙版等。
合成数据是引导深度学习项目的好方法,因为它使你能够在进行大量手动数据标注工作之前或在数据有限、受限或根本不存在的情况下快速迭代想法。 对于这种情况,你可能会发现具有域随机化的合成数据非常适合你的应用程序开箱即用的第一次尝试,而且还可以节省时间。
或者,你可能会发现需要重新定义任务或使用不同的传感器模式。 使用合成数据,可以尝试这些决策,而无需进行昂贵的标注工作。
在许多情况下,你仍然可以从使用一些真实世界的数据中受益。 好的部分是,通过尝试合成数据,你将更加熟悉问题,并且可以将标注工作投入到最重要的地方。 每个机器学习任务都有自己的挑战,因此很难准确确定合成数据如何适应,是否需要使用真实数据,或者合成数据和真实数据的混合。
2、使用合成数据训练托盘分割模型
在考虑如何使用合成数据来训练托盘检测模型时,我们的团队从小规模开始。 在我们考虑 3D 框检测或任何复杂的东西之前,我们首先想看看是否可以使用用合成数据训练的模型来检测任何东西。 为此,我们渲染了一个简单的场景数据集,其中仅包含一个或两个托盘,顶部有一个盒子。 我们使用这些数据来训练语义分割模型。
我们选择训练语义分割模型,因为任务定义明确并且模型架构相对简单。 还可以直观地识别模型失败的位置(错误分割的像素)。
为了训练分割模型,团队首先渲染粗略的合成场景(图 1)。
图 1. 两个托盘的粗略合成渲染,顶部有一个盒子
团队怀疑仅这些渲染图像缺乏训练有意义的托盘检测模型的多样性。 我们还决定尝试使用生成式AI增强合成渲染,以生成更真实的图像。在训练之前,我们将生成式人工智能应用于这些图像以添加变化,我们相信这将提高模型推广到现实世界的能力。
这是使用深度条件生成模型完成的,该模型大致保留了渲染场景中对象的姿势。 请注意,使用 SDG 时不需要使用生成式 AI。 你也可以尝试使用传统的域随机化,例如改变托盘的合成纹理、颜色、位置和方向。 你可能会发现通过改变渲染纹理进行的传统域随机化对于应用程序来说已经足够了。
图 2. 使用生成式 AI 增强的合成渲染
在渲染大约 2,000 张合成图像后,我们使用 PyTorch 训练了基于 resnet18 的 Unet 分割模型。 很快,结果就在现实世界的图像上显示出了巨大的希望(图 3)。
图 3. 使用分割模型测试的真实托盘图像
该模型可以准确地分割托盘。 基于这一结果,我们对工作流程更有信心,但挑战还远未结束。 到目前为止,该团队的方法没有区分托盘的实例,也没有检测到未放置在地板上的托盘。 对于如图 4 所示的图像,结果几乎无法使用。 这可能意味着我们需要调整我们的训练分布。
图 4. 语义分割模型无法检测堆叠的托盘
3、迭代增加数据多样性以提高准确性
为了提高分割模型的准确性,团队添加了更多以不同随机配置堆叠的各种托盘的图像。 我们向数据集添加了大约 2,000 张图像,使图像总数达到大约 4,000 张。 我们使用 USD Scene Construction Utilities 开源项目创建了堆叠托盘场景。
USD Scene Construction Utilities 用于在反映现实世界中可能看到的分布的配置中相对于彼此定位托盘。 我们使用了通用场景描述(OpenUSD)SimReady Assets,它提供了多种托盘模型可供选择。
图 5. 使用 USD Python API 和 USD 场景构建实用程序创建结构化场景,并使用 Omniverse Replicator 进一步随机化和渲染
通过使用堆叠托盘和更广泛的视角进行训练,我们能够提高模型在这些情况下的准确性。
如果添加这些数据对模型有帮助,那么为什么在不增加标注成本的情况下只生成 2,000 张图像呢? 我们没有从很多图像开始,因为我们是从相同的合成分布中采样的。 添加更多图像并不一定会给我们的数据集增加太多多样性。 相反,我们可能只是添加许多相似的图像,而没有提高模型在现实世界中的准确性。
从小规模开始,团队能够快速训练模型,查看失败的地方,并调整 SDG 管道并添加更多数据。 例如,在注意到模型对托盘的特定颜色和形状有偏见后,我们添加了更多的合成数据来解决这些失败案例。
图 6. 各种颜色塑料托盘的渲染图
这些数据变化提高了模型处理遇到的故障场景(塑料和彩色托盘)的能力。
如果数据变化很好,为什么不全力以赴并立即添加大量变化呢? 在我们的团队开始测试真实数据之前,很难判断可能需要什么差异。 我们可能错过了使模型良好运行所需的重要因素。 或者,我们可能高估了其他因素的重要性,不必要地耗尽了我们的努力。 通过迭代,我们更好地了解了任务需要哪些数据。
4、托盘侧面中心检测
一旦我们在分割方面取得了一些有希望的结果,下一步就是将任务从语义分割调整为更实用的任务。 我们决定,下一个最简单的评估任务是检测托盘侧面的中心。
图 7. 托盘侧面中心检测任务的示例数据
托盘侧面中心点是叉车在操纵托盘时将自身居中的位置。 虽然在实践中可能需要更多信息来操纵托盘(例如此时的距离和角度),但我们认为这一点是此过程中的一个简单的下一步,使团队能够评估我们的数据对于任何下游应用程序有多大用处 。
检测这些点可以通过热力图回归来完成,与分割一样,热力图回归是在图像域中完成的,易于实现,并且易于直观解释。 通过为此任务训练模型,我们可以快速评估我们的合成数据集在训练模型以检测重要的操作关键点方面的有用性。
训练后的结果很有希望,如图 8 所示。
图 8. 托盘侧面检测模型的真实检测结果
团队确认了使用合成数据检测托盘侧面的能力,即使是紧密堆叠的托盘也是如此。 我们继续迭代数据、模型和训练管道,以改进此任务的模型。
5、角点检测
当我们对侧面中心检测模型达到满意的程度时,我们探索将任务提升到一个新的水平:检测盒子的角点。 最初的方法是对每个角使用热力图,类似于托盘侧面中心的方法。
图 9. 使用热力图的托盘角点检测模型
然而,这种方法很快就带来了挑战。 由于检测对象的尺寸未知,如果托盘的角不是直接可见的,则模型很难精确推断托盘的角应该在哪里。 使用热力图,如果峰值不一致,则很难可靠地解析它们。
因此,我们没有使用热力图,而是选择在检测到面中心峰值后对角位置进行回归。 我们训练了一个模型来推断一个向量场,该向量场包含角点相对于给定托盘面中心的偏移量。 这种方法很快就显示出了完成这项任务的希望,即使有很大的遮挡,我们也可以提供对角位置的有意义的估计。
图 10. 使用面中心热力图和基于矢量场的角点回归的托盘检测结果
现在团队拥有了一个有前途的工作流程,我们迭代并扩展了这个流程,以解决出现的不同失败案例。 总的来说,我们的最终模型接受了大约 25,000 张渲染图像的训练。 我们的模型以相对较低的分辨率(256 x 256 像素)进行训练,能够通过以更高分辨率运行推理来检测小托盘。 最终,我们能够以相对较高的准确度检测到具有挑战性的场景,如上面的场景。
这是我们可以使用的东西——所有这些都是用合成数据创建的。 这就是我们今天的托盘检测模型的立场。
图 11.最终托盘模型检测结果,为了便于可视化,仅显示检测的正面
图 12. 实时运行的托盘检测模型
6、用合成数据构建你自己的模型
通过使用合成数据进行迭代开发,我们的团队开发了一种适用于真实图像的托盘检测模型。 通过更多的迭代,可能会取得进一步的进展。 除此之外,我们的任务可能会受益于添加真实世界的数据。 然而,如果没有合成数据生成,我们就无法快速迭代,因为我们所做的每个更改都需要新的标注工作。
如果你有兴趣尝试此模型,或者正在开发可以使用托盘检测模型的应用程序,可以通过访问 GitHub 上的 SDG 托盘模型来找到模型和推理代码。 该存储库包括预训练的 ONNX 模型以及使用 TensorRT 优化模型并在图像上运行推理的说明。 该模型可以在 NVIDIA Jetson AGX Orin 上实时运行,因此你将能够在边缘设备上运行它。
你还可以查看最近的开源项目 USD Scene Construction Utilities,其中包含使用 USD Python API 构建 USD 场景的示例和实用程序。
我们希望我们的经验能够启发你探索如何使用合成数据来引导你的人工智能应用程序。 如果想开始生成合成数据,NVIDIA 提供了一套工具来简化该过程。 这些包括:
- 通用场景描述(OpenUSD):USD被描述为metaverse的HTML,是一个完整描述3D世界的框架。 USD 不仅包含 3D 对象网格等基元,而且还具有描述材质、照明、相机、物理等的能力。
- NVIDIA Omniverse Replicator:Replicator 是 NVIDIA Omniverse 平台的核心扩展,使开发人员能够生成大量且多样化的合成训练数据,以引导感知模型训练。 凭借易于使用的 API、域随机化和多传感器模拟等功能,Replicator 可以解决数据缺乏的挑战并加速模型训练过程。
- SimReady 资产:模拟就绪资产是物理上精确的 3D 对象,包含精确的物理属性、行为和连接的数据流,以代表模拟数字世界中的现实世界。 NVIDIA 提供了一系列真实资产和材质,可开箱即用地用于构建 3D 场景。 这包括与仓库物流相关的各种资产,例如托盘、手推车和纸板箱。 要在将 SimReady 资产添加到活动阶段之前搜索、显示、检查和配置它们,你可以使用 SimReady Explorer 扩展。 每个 SimReady 资产都有自己的预定义语义标签,可以更轻松地生成用于分割或对象检测模型的标注数据。
如果你对托盘模型、NVIDIA Omniverse 合成数据生成或 NVIDIA Jetson 推理有疑问,请访问 GitHub 或访问 NVIDIA Omniverse 合成数据生成开发者论坛和 NVIDIA Jetson Orin Nano 开发者论坛。
原文链接:基于合成数据的托盘检测 — BimAnt
相关文章:

用合成数据训练托盘检测模型【机器学习】
想象一下,你是一名机器人或机器学习 (ML) 工程师,负责开发一个模型来检测托盘,以便叉车可以操纵它们。 你熟悉传统的深度学习流程,已经整理了手动标注的数据集,并且已经训练了成功的模型。 推荐:用 NSDT设…...

人性-基本归因错误
定义 基本归因谬误指出,你评价别人的一个行为时,你会高估他的内部因素——比如性格的影响,低估外在的情景之类各种复杂因素的影响。 具体表现是对自己,我们很愿意分析复杂的原因;对别人,如果他一句话说的…...

游戏引擎:打造梦幻游戏世界的秘密武器
介绍 游戏引擎是游戏开发中不可或缺的工具,它为开发者提供了构建游戏世界所需的各种功能和工具。本文将介绍游戏引擎的概念、使用方法以及一个完整的游戏项目示例。 游戏引擎的概念 游戏引擎是一种软件框架,它提供了游戏开发所需的各种功能和工具&…...

ClickHouse(六):Clickhouse数据类型-1
进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…...

【Linux】网络基础
🍎作者:阿润菜菜 📖专栏:Linux系统网络编程 文章目录 一、协议初识和网络协议分层(TCP/IP四层模型)认识协议TCP/IP五层(或四层)模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…...

小程序-接口概率性接收不到参数
在小程序上调用一个接口,传入筛选条件,但返回结果却没有进行筛选,概率性出现这种情况,频率较低。 然后在postman调用该接口,调用很多很多次,发现也出现这种问题,看了代码,接口的传参…...

合作客户销售数据可视化分析
以一个案例进行实际分析: 数据来源:【地区数据分析】 以此数据来制作报表。 技巧一:词云图 以城市名称来显示合同金额的分布,合同金额越大,则城市文字显示越大。 技巧二:饼图 下面制定一个,合…...

git仓库迁移场景
1.git仓库迁移 代码仓库从公网迁移内网,内外网网络不通,而且必须保证代码完整,包括分支以及提交记录。具体步骤如下 1.1 拉取所有分支镜像 1.2 现在本地电脑新建文件夹 mkdir newdir1.3 进入新建文件 newdir 执行下面命令拉取所有镜像代码…...

【RabbitMQ】之持久化机制
目录 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述2、队列持久化3、消息持久化4、交换器持久化 二、RabbitMQ 知识扩展 1、内存告警与内存换页2、磁盘告警与配置3、数据写入磁盘时机4、磁盘消息格式5、磁盘文件删除机制 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述…...

【项目6 UI Demo】前端代码记录
前端代码记录 1.GridListItem中的布局 在这个Item中的布局采用的是VBox和HBox相结合的方式。相关的代码如下: <VBox class"sapUiTinyMargin"><HBox justifyContent"SpaceBetween"><Titletext"{ToolNumber}"wrapping…...

【计算机网络】应用层协议 -- HTTP协议
文章目录 1. 认识HTTP协议2. 认识URL3. HTTP协议格式3.1 HTTP请求协议格式3.2 HTTP响应协议格式 4. HTTP的方法5. HTTP的状态码6. HTTP的Header7. Cookie和Session 1. 认识HTTP协议 协议。网络协议的简称,网络协议是通信计算机双方必须共同遵守的一组约定࿰…...

了解Unity编辑器之组件篇Layout(八)
Layout:用于管理和控制UI元素的排列和自动调整一、Aspect Ratio Fitter:用于根据宽高比自动调整UI元素的大小 Aspect Mode:用于定义纵横比适配的行为方式。Aspect Mode属性有以下几种选项: (1)None…...

如何使用Flask-Mail来发送电子邮件
你知道如何使用Flask-Mail来发送电子邮件吗 Flask-Mail是一个用于Flask框架的扩展,它简化了在Flask应用程序中发送电子邮件的过程。通过使用Flask-Mail,你可以轻松地创建邮件消息对象,设置发件人、收件人、主题和正文,并使用SMTP服…...

【笔记】Java并发编程
为什么不建议使用Executors创建线程池分析 不建议使用Executors来创建线程池,主要是有两大原因第一个是问题回溯的问题,使用Executors都可以使用默认的情况,无法用户自定义线程名称不利于排查问题,第二个原因也是最主要原因就是线…...

Hive内部表和外部表
表类型详解 表分类 在Hive中,表类型主要分为两种 第一种:内部表 也叫管理表表目录会创建在集群上的{hive.metastore.warehouse.dir}下的相应的库对应的目录中。默认创建的表就是内部表 第二种:外部表 外部表需要使用关键字"external"ÿ…...

【面试题】与通义千问的芯片前端设计模拟面试归纳
这里是尼德兰的喵芯片设计相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏! 让我们一起为芯片前端全栈工程师而努力! 前言 两个小时,与chatGPT进行了一场数字IC前端设计岗的面试_尼德兰的喵的博客-CSDN博客 和GPT-3.5的回答可以对比品尝,味道更好。 模…...

无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。npm.ps1 cannot be loaded
目录 原因 解决方法 提示 查看当前的执行策略命令 改回默认值 "Restricted"命令 这个错误提示是因为您的系统禁止执行 PowerShell 脚本。 原因 现用执行策略是 Restricted(默认设置) 解决方法 以管理员身份运行 PowerShell:右键…...

Flowable-服务-Http任务
目录 定义图形标记XML内容界面操作 定义 Http 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Http 任务是作为一种特殊的服务 任务来实现的,主要调用Http服务使用。 图形标记 由于 Http 任务不是 BPMN 2.0 规范的“官方”任务&…...

Hexo+GithubPages免费搭建个人博客网站
HexoGithubPages免费搭建个人博客网站 目录 一、前言二、Github配置 新建同名仓库配置Pages 三、安装Hexo四、配置hexo-deployer-git五、访问六、发布文章七、安装主题 一、前言 我之前开了好几年的云服务器了,实际上使用场景并不是很多,感觉有点浪费…...

应用无线鼠标中的2.4GHz无线收发芯片
无线键盘和无线鼠标作为现代办公环境中常见的工具,为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的,其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…...

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前
Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前 一、概述 在项目开发中,遇到一个类似于 超时关闭的订单(超过1分钟后关闭订单) 的需求,在数据的时间写入时&#x…...

自动驾驶之轨迹规划8——Apollo参考线和轨迹
1. abstract 本文主要讲解routing和planning模块中的reference line,我之前一直搞不明白这个reference line是如何生成的,有什么作用,和routing以及planning的关系。现在有了一些心得打算梳理一下: 决策规划模块负责生成车辆的行…...

ES6 - promise.all和race方法的用法详解
文章目录 一、前言二、Promise.all()1,第一句:Promise.all()方法接受一个数组作为参数,且每一个都是 Promise 实例2,第二句:如果不是,就会先调Promise.resolve方法,将参数转为 Promise 实例再进…...

CAD .NET 15.0 企业版 Crack
CAD .NET 15.0 企业版 企业版 企业版 企业版 企业版 Updated: June 14, 2023 | Version 15.0 NEW CAD .NET is a library for developing solutions in .NET environment. It supports AutoCAD DWG/ DXF, PLT and other CAD formats. The library can be used in a wide rang…...

苍穹外卖day07——缓存菜品套餐+购物车功能实现
缓存菜品——需求设计与分析 问题说明 用户访问量过大带来的一个直接效果就是响应速度慢,使用体验下降。 实现思路 使用redis缓存菜品数据,减少数据库查询操作。 页面展示上基本就是同一个分类在同一页,所以key-value结构可以使用不同的分…...

学习笔记|大模型优质Prompt开发与应用课(二)|第四节:大模型帮你写代码,小白也能做程序
文章目录 01软件开发产业趋势与技术革新软件开发产业趋势与技术革新技术性人才很受欢迎软件开发产业趋势与技术革新技术门槛越来越低 02 大模型驱动的软件开发需求分析prompt 产品设计开发和测试prompt输出回复promptpromptprompt回复 发布和部署promptprompt 维护和更新prompt…...

建造者设计模式 + 高阶函数 => DSL
该设计模式适用于创建复杂对象,该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成,针对每个子对象内部算法和步骤通常是稳定的,但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象…...

重学C++系列之智能指针简单介绍
一、什么是智能指针 在使用堆内存时,就像使用栈内存空间一样,可以实现自释放的功能,智能指针在C库中也是类模板之一。 二、智能指针有几种 有四种。auto_ptr, unique_ptr, shared_ptr, weak_ptr 其中后三个是C11支持,第一个已经被…...

LabVIEW开发航天器动力学与控制仿真系统
LabVIEW开发航天器动力学与控制仿真系统 计算机仿真是工程设计和验证的非常有用的工具。它节省了大量的时间、金钱和精力。航天器动力学与控制仿真系统由LabVIEW程序开发,它是模拟航天器等动态系统的有用工具。还可轻松与硬件连接并输出真实信号。 项目采用系统工…...

享元模式——实现对象的复用
1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如,在一个文本字符串中存在很多重复的字符,如果每个字符都用一个单独的对象来表示,将会占用较多的内存…...