草庐IT

【YOLO3D】:端到端3D点云输入的实时检测

城市黎明的烟火 2023-05-26 原文

YOLO3D:端到端3D点云输入的实时检测

前言

YOLO3D将YOLO应用于3D点云的目标检测,与Complex-YOLO(Complex-YOLO的解读从这进入)类似,不同的是将yolo v2的损失函数扩展到包括偏航角、笛卡尔坐标下的三维box以及直接回归box的高度。

论文: https://arxiv.org/abs/1808.02350

算法分析

模型输入

论文中将3D点云投影为鸟瞰图网格,创建两个网格映射如图。

第一个包含最大高度,其中每个网格单元(像素)值表示与该单元关联的最高点的高度。 第二个网格图表示点的密度,密度的计算参考MV3D(论文解读从此进入)。

网络结构

论文的结构参考YOLO-v2架构,做了一些修改。

  1. 修改了一个最大池化层,将下采样从 32 改为 16,有了一个更大的网格,这有助于检测行人和骑自行车的人等小物体。
  2. 从模型中删除了skip connection,因为它会导致结果不太准确。

回归损失

3D box 回归

论文在原始YOLO v2中添加了两个回归项以生成 3D 边界框:中心的 z 坐标和框的高度。z 坐标的回归以类似于 x 和 y的回归的方式,通过 sigmoid 激活函数进行坐标。

值得注意的是,虽然 x 和 y 通过在每个网格单元中预测 0 到 1 之间的值进行回归,定位该点位于该单元内的位置,但 z 的值仅映射到位于一个垂直网格单元内,如下图所示 . 选择将 z 值仅映射到一个网格而将 x 和 y 映射到多个网格单元的原因是 z 维度中值的可变性远小于 x 和 y 的可变性(大多数对象具有非常相似的框高程 )。

偏航角回归

论文中定义边界框的方向范围从 -π 到 π。 将该范围归一化为 -1 到 1,并调整我们的模型以通过单个回归数直接预测边界框的方向。 在损失函数中,计算地面实况和我们预测的角度之间的均方误差:

边界框损失函数

3D box的损失是2Dbox原始 YOLO 损失的扩展。偏航项的损失按照 上述计算。高度的损失是中宽度和长度损失的延伸。类似地,z 坐标的损失是 x 和 y 坐标损失的扩展。

λ c o o r λcoor λcoor :分配给坐标损失的权重,
λ c o n f λconf λconf :分配给预测置信度损失的权重,
λ y a w λyaw λyaw:分配给方向角损失的权重,
λ c l a s s e s λclasses λclasses :分配给损失的权重 类概率,
L i j o b j L^{obj}_{ ij} Lijobj :一个变量,它根据第 i 个和第 j 个位置中是否存在真实值框取 0 和 1 的值。如果有一个盒子,则为 1,否则为 0,
L i j n o o b j L^{noobj}_{ ij} Lijnoobj :与前一个变量相反。如果没有物体,则取值为 0,否则取值为 1,
x i , y i , z i x_i , y_i , z_i xi,yi,zi:地面实况坐标,
x i ^ , y i ^ , z i ^ \hat{x_i}, \hat{y_i}, \hat{z_i} xi^,yi^,zi^ :地面实况和预测方向角,
φ i , φ i ^ φ_i, \hat{φ_i} φi,φi^ :地面实况和预测方向角 …等,
C i , C i ^ C_i, \hat{C_i} Ci,Ci^ : 真实情况和预测置信度,
w i , l i , h i w_i , l_i , h_i wi,li,hi : 真实情况宽度、高度和盒子的长度,
w i , l i , h i w^i, l^i, h^i wi,li,hi : 预测宽度、高度和长度框
p i ( c ) 、 p i ^ ( c ) p_i( c)、\hat{p_i}( c) pi(c)pi^(c) 真实情况和预测的类别概率。

数据集处理

论文使用了 KITTI 基准数据集。 点云以每像素 0.1m 的分辨率在 2D 空间中投影为鸟瞰网格图,与MV3D使用相同的分辨率。

网格图表示的 LiDAR 空间范围为向右 30.4 米,向左 30.4 米,向前 60.8 米。 在上述分辨率为 0.1 的情况下使用此范围会导致每个通道的输入形状为 608x608。

LiDAR 空间中的高度剪裁在 +2m 和 -2m 之间,并缩放到 0 到 255 以表示为最大高度通道中的像素值。

训练

该网络以端到端的方式进行训练。 使用了动量为 0.9、权重衰减为 0.0005 的随机梯度下降。 将网络训练了 150 个 epoch,批量大小为 4。
对于前几个 epoch,将学习率从 0.00001 慢慢提高到 0.0001。 如果以高学习率开始,我们的模型通常会因梯度不稳定而发散。 再继续用 0.0001 训练 90 次,然后用 0.0005 训练 30 个时期,最后用 0.00005 训练最后​​ 20 次。

结果

参考:
论文阅读《YOLO3D: End-to-end real-time 3D Oriented Object Bounding Box Detection from LiDAR Point Cloud》

YOLO3D端到端的3d物体检测论文笔记

YOLO3D 论文翻译及笔记

有关【YOLO3D】:端到端3D点云输入的实时检测的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  6. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  7. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  8. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  9. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  10. ruby-on-rails - 为什么用户必须输入 7 位数的 Twitter PIN 才能授予我的应用程序访问权限? - 2

    我正在为我的用户实现一些ruby​​onrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需

随机推荐