用合成数据训练车辆姿态估计神经网络

news2024/10/7 14:27:10

我们的客户希望开发一款应用程序,引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中,用户被引导站在与汽车一定的角度和距离,以标准化的方式捕捉最好的照片。 当用户处于正确位置时,会自动拍摄高分辨率照片。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

我们需要一种方法来大致了解用户在 3D 空间中相对于他们正在拍摄的汽车的站立位置。 由于这是一个原型应用程序,我们只有几周的时间来提出可行的解决方案。 我们还限制了对特定车型的识别,以缩短开发时间。

项目的目标和限制如下:

  • 构建可行解决方案的时间很短
  • 大致实时的汽车姿态估计(< 150 ms)
  • 将范围限制为具有不同颜色/选项的特定车型
  • 应用程序应拍摄高质量的照片

1、在构建之前的尝试

希望为 3D 物体姿态估计找到一个快速的现成解决方案,我们测试了几种方法。

1.1 Apple ARKit 3d 物体识别

在这里插入图片描述

ARKit 物体识别 — 物体扫描应用

ARKit 包含用于扫描和识别 ARKit 中的刚性 3D 对象的 API。 这对我们来说似乎很理想; 实时且内置于 ARKit 中,这将使该功能的开发时间缩短为零。 我们这里主要关心的是识别不同的汽车颜色。 为了测试 ARKit 对此的处理效果,我们购买了一辆具有几种不同颜色的小型模型车。
在这里插入图片描述

测试用模型车

我们扫描一种颜色,然后在类似的颜色上进行测试(即扫描白色,在浅蓝色上进行测试。)在某些情况下,识别确实有效。 它并不完美,但也许如果我们扫描一些基色,这将提供足够的不变性来识别我们可能期望看到的汽车的任何颜色。

下一步是在真车上进行尝试。 事实证明,真正的汽车的行为有点不同。 即使在同一辆车上进行扫描和测试也是不可靠的。 有时,识别出的汽车会以某种方式稍微旋转/平移。 我们的猜测是,汽车上的高反光油漆工作使得基于特征的扫描和识别很难发挥作用(Apple 在其文档中特别提到反光物体不适合 3D 识别。)

1.2 第三方 SDK

我们测试了其他一些 SDK,并得到了与 ARKit 类似的结果。 一些库需要特定的“初始化模板”或用户需要匹配的位置才能启动 3D 对象跟踪。 这并不理想,因为我们想要引导用户到某些位置,因此识别需要从各种角度/位置进行。

1.3 照片质量

ARKit 和我们尝试的 SDK 的另一个缺点是使用它们时拍摄的照片的质量和分辨率。 使用 ARKit 时可捕获的最高分辨率为 1920x1440。 使用 ARKit 时,对焦点和曝光的控制也非常有限。 由于该应用程序主要用于拍摄高质量的汽车照片,因此除了大图像分辨率之外,我们还希望对焦点和曝光进行精细控制。

2、构建基于神经网络的姿态估计器

在这里插入图片描述

人体姿态估计

鉴于我们使用第三方解决方案不成功,再加上照片质量限制,我们决定考虑构建自己的解决方案,与 Apple 的 AVFoundation 相机 API 一起使用。 我们选择神经网络解决方案,因为它们是姿势估计的最先进技术,并且有很多开源项目和研究可供利用。

2.1 姿态估计方法

给定图像,我们如何预测图像中物体的 3D 姿态? 一种常见的方法涉及预测对象规范模型上一组已知点的图像位置。 例如,给定一张汽车照片,图像中的左侧前灯在哪里? 有了足够的这些预测,我们就可以估计原始汽车模型相对于拍照相机的 3D 姿态。

2.2 网络架构

如今,神经网络在各种任务上都表现出了令人印象深刻的准确性,而且由于网络架构的改进和更快的设备,神经网络也能够在移动设备上实时运行。

最近我们研究了一些基于 CPM 和堆叠沙漏架构的实时移动身体姿势估计项目。

  • PoseEstimationForMobile:github
  • PoseEstimation-CoreML:github

这些项目包含许多有用的信息,可用于在移动平台上训练和运行你自己的姿势估计器。

他们使用的 CPM 网络有一个 MobileNetV2 基础,并为 14 个身体部位(左肘、右膝等)输出一个 2d 热图:
在这里插入图片描述

不同身体部位的热图

从这里,我们基本上可以获取每个关键点层的最大激活位置,然后使用 OpenCV 的 SolvePnP 方法估计 3d 汽车姿势。 这是我们在真实汽车照片上运行的最终神经网络的可视化,以及估计的 3D 姿势。 由于输出热图的分辨率有限,这并不是一个完美的选择。 我们的模型输出分辨率为 192x192 的热图,因此单次传递的准确度是有限的。

在这里插入图片描述

模型的最终输出

3、其他方法和资源

我们采用 CPM 来快速启动和运行,但还有其他方法可以解决这个问题。 另一种基于关键点的方法是直接将 2d 关键点输出为 x,y 坐标列表。 这确实限制了我们对单一汽车的估计,但对于我们的用例来说这是可以的。

灵感来自Hart Woolery 的关于手部姿势估计的帖子中,我们测试了简单地在 MobileNet 之上添加一些密集层,最终输出一组 1x28 的 x,y 关键点位置。 令人惊讶的是,这个开箱即用的效果非常好。 如果有更多时间,我们可能会进一步探索该网络,因为它比我们选择的 CPM 模型稍快。

如果您只是在寻找人体姿势估计,请查看Jameson Toole最近的关于 fritz.ai 人体姿势估计器的文章 。

另一种方法是网络直接输出汽车的位姿参数,而不是通过中间的 2d 关键点(参见 BoxCars 、 MultiBin )。 由于时间紧迫,我们没有严格评估我们可以采取的每一个方向——但这些其他方法似乎完全有效。

4、查找汽车数据集

选择网络架构后,下一步是找到可用于训练它的数据集。

用于身体姿势估计的数据集并不缺乏(COCO、DensePose、MPII、身体姿势数据集概述),但带注释的汽车数据不太常见。 存在一些数据集(Apollo、PASCAL 3d+),但每个数据集似乎都有其自己的局限性。 大多数数据集都是针对自动驾驶汽车的,因此来自街道上行驶的汽车视角的图像存在很大的偏差——这与我们期望网络处理的图像有很大不同。

PASCAL 3D 具有 3D 汽车模型标注,但这些汽车通常是从互联网照片中收集的更旧的模型。 由于我们提前知道了汽车模型,因此没有必要对数千个其他模型进行训练(尽管我们希望有更多时间扩展我们的网络以识别更多汽车模型。)最后,一些数据集具有非商业许可限制 。 鉴于这些缺点,我们探索了合成数据,将其作为直接根据我们预期的测试环境定制数据的方法。

5、创建合成汽车数据集

在这里插入图片描述

Unity 编辑器截图

当生成许多机器学习方法所需的大量训练数据不可能或不切实际时,合成数据就会派上用场。 感谢视频游戏行业,我们可以利用 Unity 或 Unreal 等图形引擎进行渲染,并使用最初为游戏开发的 3D 资源。 虽然我们还无法获得光线追踪方法的渲染质量,但示例代码的速度和数量以及免费/廉价的资源使其非常有吸引力。 Unity 是我们的选择,因为我们有更多的经验,而且时间也是一个因素。

在这里插入图片描述

使用 Unity 合成数据的示例

Unity 甚至发布了一个方便的演示项目,其中包含一些有关合成数据的常见需求。 我们最近还就使用 SceneKit 为 AR 足球比赛训练脚部分割网络进行了简短的演讲。

6、查找车辆模型

幸运的是,有很多高质量的 3D 汽车模型。 对于非常高质量的模型,您可能需要支付几百美元(请参阅 squir ),但是可以直接从 Unity 资产商店获得许多便宜或免费的模型:

在这里插入图片描述

https://assetstore.unity.com/categories/3d/vehicles/land

我们收集了大约 10 个形状与我们的目标模型相似的汽车模型,以及我们正在测试的确切汽车的两个变体。

如果你手头有目标对象的3D模型,但是需要转换成3D游戏引擎需要的格式,那么可以直接使用 NSDT 3DConvert 这个强大的在线3D格式转换工具,无需本地安装任何软件:

在这里插入图片描述

https://3dconvert.nsdt.cloud

7、数据标注

模型准备好后,下一步就是标注我们正在训练网络识别的关键点。 由于身体姿势网络有 14 个关键点,这似乎是一个合理的起点,因为它将减少对现有训练流程的任何修改。 此步骤需要创建 14 个空游戏对象并为每个车辆模型定位它们:

在这里插入图片描述

车辆的14个关键点

通过命名每个关键点游戏对象(例如 left_back_wheel ),在渲染过程中,我们可以在保存标注数据时简单地在汽车游戏对象中搜索每个关键点。 我们还选择使用深度测试来存储该视点的关键点是否被遮挡,但这最终并没有在训练中使用。

8、在数据集中创建变体

对合成数据进行训练时的一个大问题是模型是否能够推广到现实世界的图像。 这是一个活跃且不断发展的研究领域,有许多有趣的方法。 Apple 的机器学习团队发布了一篇有趣的文章,介绍如何使用 GAN 提高合成眼睛图像的真实感。 我们选择的方法称为域随机化。 通过在训练数据分布中创建大量变化,模型应该概括为目标(现实世界)分布,而无需任何微调。

为了实现这一目标,我们尝试在渲染图像之前尽可能多地随机化场景的各个方面。 前面的一个主要问题是网络将学会拾取 3D 汽车模型上的一些小细节,而这些细节不能推广到真实汽车的照片。 有一个经常被提及(可能不真实)的轶事是关于研究人员训练坦克探测器,该探测器只是了解训练集中的坦克在一天中的什么时间被拍照。 无论这个例子是否正确,当你的训练和测试集来自不同的分布时,需要注意确保转移到新数据。

8.1 车辆变体

对于每种汽车模型,我们花了一些时间在车身上创建可编写脚本的小细节变化。 例如油漆反射率、车牌位置和编号、车窗色调、汽车轮辋样式和位置以及其他一些内容。 我们还沿着汽车的局部轴稍微缩放了汽车本身。

在这里插入图片描述

仅车身变体的渲染图
在这里插入图片描述

不同的轮胎选择

8.2 环境/背景变化

最初,我们开始构建和购买一些包含建筑物和真实 3D 结构的场景。 事实证明,寻找高质量的逼真场景非常困难,而且成本高昂且耗时。 幸运的是,我们发现了一个很棒的网站,hdrihaven.com,它提供了非常高分辨率的免费环境地图。 这些本质上是 360 HDR 全景图,在几何体后面进行渲染,并可以为场景中的对象提供照明和反射。 我们还通过渲染脚本以参数方式改变反射和曝光强度。

在这里插入图片描述

来自 HDRI Haven 的环境贴图

除了天空盒之外,我们还创建了一个简单的平面作为汽车下方的地板。 在地板上应用不同的材料并偶尔将它们隐藏在一起可以提供很多视觉多样性:

在这里插入图片描述

场景和灯光变化

8.3 后期处理效果

Unity 有一个名为“后期处理栈”的功能,它基本上是 3D 场景的 Instagram 滤镜。 这些效果可能包括模糊、颜色分级等。你可以通过包管理器或资源商店将其添加到场景中,具体取决于Unity 版本。

除了内置的后期处理栈之外,我们还从资产商店下载了另一组名为 SC Post Effects Pack 的滤镜,价格为 25 美元。 以下是一些仅改变后处理滤镜组合的渲染:
在这里插入图片描述

后期处理滤波器的变化

影响是微妙的,可能很难发现。 这里看到的一些是景深、噪点、云阴影、环境光遮挡、边缘高光、色调偏移和黑条。 对于每一个,我们还随机调整参数以获得更多变化。

8.4 把它们整合在一起

应用所有的变化,我们最终得到像这样的图像:

在这里插入图片描述

启用所有变体的渲染

尽管这些看起来不像真实的街道场景,但背景和照明的多种变化应该迫使网络捕捉到所有照片中保持不变的汽车特征。 如果我们只使用街道场景,我们的检测器可能会将街道场景的各个方面纳入其特征中; 期望某些阴影和照明特征始终伴随着汽车本身。

9、创建小型验证数据集

在这里插入图片描述

用Python编写的标注工具

我们对数据集偏差的担忧导致我们使用 3D 关键点手动标注一些汽车的实际图像。 手动逐一标注 14 个关键点相当耗时 - 特别是对于被遮挡的关键点。

为了加快速度,我们构建了一个非常基本的 wxPython 应用程序,只需要为每个图像标记几个关键点。 为此,我们使用 OpenCV 的 SolvePnP 来拟合给定这些初始关键点的 3D 汽车模型,然后将其他关键点投影到图像中。

标注完成后,我们使用 imgaug 库应用随机图像增强。 值得庆幸的是,imgaug 支持将 2d 关键点与图像一起变换,因此你不必手动变换点位置。 增强后,我们有大约 1500 张图像来验证我们的网络。

10、合成数据有效吗?

对于我们的一小部分已知汽车模型的用例,我们对第一轮的结果非常满意。 我们的假设是我们需要将更多真实图像纳入训练中,或者更多地依赖迁移学习,但我们最终不需要这样做。 即使在相当广泛的汽车上进行测试,仍然可以得到合理的结果

正如你在这个视频中看到的那样。 3D 模型拟合不适用于其他汽车形状,因为我们将刚性 3D 对象拟合到另一辆不同尺寸的汽车上。 有关于在给定关键点上拟合灵活的参数化汽车模型的文献,因此我们可能会研究更通用的汽车检测器。

11、实现代码

我们的计划是,如果我们有时间清理管线并在更多车型上进行徐连,则将发布管线的某些方面。

现在,我们已经提供了一个演示 iOS 应用程序的代码,该应用程序使用 ARKit 显示估计的汽车姿势。请记住,该模型是在固定视点范围和汽车模型上进行训练的。


原文链接:合成数据训练车辆姿态估计 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1600*C. Good Subarrays(找规律前缀和)

Problem - 1398C - Codeforces 解析&#xff1a; 可以写出 sum[ j ] - sum[ i ] j - i 1&#xff0c;对其移项得 sum[ j ] - j sum[ i ] - &#xff08;i - 1&#xff09;&#xff0c;问题转换为有多少个前缀和相等&#xff0c;则用map遍历统计一遍即可。 注意&#xff0c;当…

QMC5883L-磁力计椭球拟合校准

1.概述 磁力计椭球拟合校准是一种将磁力计测量数据校准到真实磁场的技术。这种技术通常使用椭球模型来拟合磁力计的测量结果&#xff0c;然后通过最小二乘法来找到拟合参数的最优解。 2.总体思想 磁力计椭球拟合校准的思想包括以下几个步骤&#xff1a; 1.数据预处理&#x…

Java 21 新功能展示(含示例)

Java 21 于 2023 年 9 月 19 日发布&#xff0c;是 Oracle 标准 Java 实现的下一个长期支持&#xff08;LTS&#xff09;版本。Java 21 具有以下 15 项功能。 字符串模板&#xff08;预览版&#xff09; [JEP-430] 序列集合 [JEP-431] 代 ZGC [JEP-439&#xff3d; 记录模式…

Helm部署EMQX集群

端口说明&#xff1a; 端口说明集群内端口Nodeport备注mqtt188331274Port for MQTTmqttssl888331170Port for MQTT(SSL)mgmt8081无ws808330099Port for WebSocket/HTTPwss808432580Port for WSS/HTTPSdashboard1808331303Port for dashboard 一、Helm在线部署EMQX集群 1、安…

Compose输入框

TextField label设置提示内容&#xff0c;TextFieldDefaults.textFieldColors设置输入框背景颜色 TextField(modifier Modifier.fillMaxWidth().padding(5.dp),value text.value,onValueChange { text.value it },label { Text(text "请输入内容") },colors …

算法题:买卖股票的最佳时机 II

这道题是贪心算法的中级难度练习题&#xff0c;由于题目设定&#xff0c;整个价格都是透明的&#xff0c;这里并不涉及需要预测股票涨势的问题。解决思路不难&#xff0c;就是一旦股票价格开始下降了就买入&#xff0c;一旦上升了&#xff0c;就赶紧卖出。&#xff08;完整题目…

led护眼台灯对眼睛有伤害吗?推荐好用的led护眼台灯

其实led护眼台灯对眼睛伤害是不大的&#xff0c;而且和白炽灯、卤素灯等老式台灯相对比&#xff0c;反而更加护眼。因为白炽灯、卤素灯等光线都不太稳定&#xff0c;而且光线不是很均匀可以明显感觉有明暗差&#xff0c;最主要的是频闪现象会比较严重&#xff0c;长时间使用的话…

Apache Tomcat安装、运行

介绍 Apache Tomcat是下面多个规范的一个开源实现&#xff1a;Jakarta Servlet、Jakarta Server Pages、Jakarta Expression Language、Jakarta WebSocket、Jakarta Annotations 和 Jakarta Authentication。这些规范是 Jakarta EE 平台的一部分。 Jakarta EE 平台是Java EE平…

Vue Router的使用

使用 项目中注入路由器 在项目中 src 目录下新建 router 目录&#xff0c;其中包含 index.js 路由主文件。 // src/router/index.jsimport Vue from vue import Router from vue-router import { routes } from ./routes.jsVue.use(Router) const router new Router({route…

EPDB 08、EPDBS 10、PDRV、EPDZA06插装式比例减压阀放大器

比例方向阀W42E-5PS03、W43E-5PS05、W42E-1AS06、W43E-1AS06、插装式S22E-1V08放大器。 该放大器既可用于工业及移动设备应用&#xff0c;也可用于固定安装。因此&#xff0c;电压范围非常宽&#xff0c;在8至35VDC之间变化。这些放大器对欠压和电压尖峰非常不敏感&#xff0c…

浅谈时间流管理体系

不想聊技术&#xff0c;但又想分享一些东西&#xff0c;这篇文章分享下如何构造自己的时间流管理体系以及如何完整的把控一个事件安排统筹&#xff0c;这里对一个大型事件或大型知识体系如何分解为不同问题的小点不做点出&#xff0c;这里只提时间管理体系化。 好处的话也不做阐…

Nginx+Keepalived实现服务高可用

Nginx 和 Keepalived 是常用于构建高可用性&#xff08;High Availability&#xff09;架构的工具。Nginx 是一款高性能的Web服务器和反向代理服务器&#xff0c;而Keepalived则提供了对Nginx服务的健康状态监测和故障切换功能。 下载Nginx 在服务器1和服务器2分别下载nginx …

深入理解 python 虚拟机:原来虚拟机是这么实现闭包的

深入理解 python 虚拟机&#xff1a;原来虚拟机是这么实现闭包的 在本篇文章当中主要从虚拟机层面讨论函数闭包是如何实现的&#xff0c;当能够从设计者的层面去理解闭包就再也不用死记硬背一些闭包的概念了&#xff0c;因为如果你理解闭包的设计原理之后&#xff0c;这些都是…

嵌入式学习笔记(48)什么是I2C通信

10.1.1物理接口&#xff1a;SCL SDA (1)SCL&#xff1a;时钟线&#xff0c;传输CLK&#xff0c;一般是I2C主设备向从设备提供时钟的通道。 (2)SDA&#xff1a;数据线&#xff0c;通信数据都通过SDA线传输。 10.1.2通信特征&#xff1a;串行、同步、非差分、低速 (1)I2C属于…

Python中的多态

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 当我们谈到多态时&#xff0c;可以将其比喻为一个人具有多种身份的能力。在不同的情境下&#xff0c;这个人可以表现出不同的行为和特征。在 Python 中&#xff0c;多态是面向对象编程中的一个重要概念&#xff0c;它允许我们使用相…

PHP 伪协议:使用 php://filter 为数据流应用过滤器

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议&#xff1f; php://filter概念格式 基本使用普通读写file_get_contents 与 file_put_contentsinclude 过滤器的基本使用base64 的编码与解码rot13 加解密rot13 算法string.rot13 过滤器列表多个过滤器的使用注意事项 处理…

【软件测试】功能测试/接口测试/自动化测试/性能测试/验收测试

软件测试的主要流程 一、测试主要的四个阶段 1.测试计划设计阶段&#xff1a;产品立项之后&#xff0c;进行需求分析&#xff0c;需求评审&#xff0c;业务需求评级&#xff0c;绘制业务流程图。确定测试负责人&#xff0c;开始制定测试计划&#xff1b; 2.测试准备阶段&…

【每日一题】股票价格跨度

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;暴力枚举方法二&#xff1a;单调栈 写在最后 Tag 【单调栈】【设计类】【数组】【2023-10-07】 题目来源 901. 股票价格跨度 题目解读 找出小于等于今天股票价格的最大连续天数&#xff08;从今天往回数&#xff0c;…

AI颠覆法律行业,律师要失业了?

如果要说一个 AI 真正起飞&#xff0c;并且对行业从业者带来的更多是正面影响的垂直行业&#xff0c;小编觉得在目前阶段&#xff0c;法律可以算一个。这个行业有几个特点&#xff1a;对人的依赖很大&#xff0c;专业性很强&#xff0c;大量繁复的文字工作。因此&#xff0c;在…