目录
这是一篇21年的综述,介绍了3D目标检测背景、传感器以及基于传感器的算法分类及其特点。
3D目标检测的地位:是无人驾驶中感知模块的核心基础
3D目标检测的主要问题:目标检测的核心是定位+分类,分类的问题其实不大,限制算法性能的最主要因素还是定位误差。
3D目标检测中的传感器:3D目标检测中使用的传感器主要可以分为两类,一类是无源传感器(passive sensors )另一类是有源传感器(active sensors)。这两类中用的最多的就是单目相机和激光雷达了。
单目相机:优点:便宜且适用于很多场景,丰富的颜色和纹理特征;缺点:没有深度信息并且视野有限,容易受到光照条件(夜间)或天气条件(阴雨)的影响
激光雷达:优点:有深度信息,360度视野,受光照影响小,收温度影响大(雪、雾天);缺点:产生的点云数据存在天生的问题,没有颜色和纹理信息,部署昂贵(估计是75000美元)。
其他传感器:使用的相对偏少,具体特点见下图。

3D目标检测中的数据:主要是两类,一类是单目相机中得到的RGB图像,另一类是激光雷达中得到的点云。
3D目标检测中的算法分类:按照模态可以分为:基于RGB图像的、基于点云的以及基于RGB图像与点云模态融合的。
bbox的参数表示:主要的表示方法有以下的四种,用的最多的是最后一种,即使用中心点的坐标以及框的尺寸+一个偏航角这种7个参数的表示法。

整体的分类结果如下:




上面介绍了很多数据集,但是最常用的是三个:KITTI、nuScenes、Waymo Open。
数据量:KITTI<nuScenes<Waymo Open;
多样性:KITTI中有8个类别50个场景,但是只使用3个类别(汽车、行人、自行车)做评估,并根据2D 边界框的高度、遮挡和截断情况分为三个级别(Easy, Moderate, and Hard);nuScenes中有23个类别1000个场景,使用10个类别做评估;Waymo Open中有4个类别1150个场景,同样使用3个类别做评估。值得一提的是,后两者都有多样的气候和光照,而前者只有晴天白天。
评价指标:KITTI的下载与评价指标见这里,nuscenes 的评价指标见这里,最后一个数据集我觉得我肯定用不到,就算了吧
评价指标之AP:之前一直没有怎么搞明白AP,现在有点理解了,首先我们规定一个IOU的阈值,根据这个阈值我们就可以导出混淆矩阵,有了混淆矩阵我们就可以计算
P
r
e
c
i
s
i
o
n
和
R
e
c
a
l
l
Precision和Recall
Precision和Recall,有个这两个值我们就可以绘制PR曲线,AP就是PR曲线下方的面积,但是直接算精确面积计算量会比较大,因此就需要做一个平滑操作,做完之后可以选择计算平滑后的精确面积,也可以将横轴做等分,取
P
r
e
c
i
s
i
o
n
Precision
Precision的平均值作为最终的结果。参考:目标检测中的AP,mAP
学位论文基 于 伪 雷 达 点 云 的 单 目 3 D 目 标 检测 方 法 研 宄对于这一点也有介绍:

KITTI的评价指标:分别是3D AP,BEV AP以及Average Orientation Similarity (AOS)(3D AP计算3DIOU,而BEV AP计算图像平面上的IOU,最后这个用于偏航角的评价)

效果:准确度相对较低(三种算法中最实惠)
主要的问题:缺少深度信息
研究方向1-结果提升方法:将3D目标检测任务分解为2D目标检测和深度估计,最后通过几何属性和约束将估计结果提升到3D空间。这个方法的基本假设是:可以根据视觉外观凭经验推断相关对象的空间位置。依赖于领域专业知识来设计 3D 表示,并借助先验知识进行模板匹配 或几何约束进行恢复
研究方向2-特征提升方法:将2D图像特征转换到3D空间,通过伪激光雷达或学习潜在深度分布

效果:相对更高的准确性和更低的延迟(三种算法中最优秀)
主要问题:缺少点云特征学习的方法,因为点云是无序的(输入点云中点的任意顺序都应该对应相同的结果)、非结构化的(无法直接用CNN处理)、稀疏的(虽然是近密远疏,但是总体稀疏。比如用体素方法处理,但是非空体素在Waymo Open中只有1%,在KITTI中只有3%)
研究方向1-基于体素:将不规则的点云转换成规则的体素(2D或者3D规则网格),然后将其折叠为2D鸟瞰图,接着使用CNN显式特征提取。此时体素的尺寸选择狠重要,放大体素尺寸会损失分辨率降低定位精度,缩小体素尺寸会随着输入分辨率的增加以3次方的速率增加复杂度与内存占用。
研究方向2-基于点:采用pointNet类似的结构或者GNN直接学习点云特征,没有量化操作,保留了点云的原始几何信息。前者一般都会采用ball-query操作,但是这个过程中,检索点的时间占据了运行时间的80%,因为点云的局部性特别差。
研究方向3-基于点体素:融合体素和点的特征提取方法的优势
注:基于体素的方法占据了主流,因为基于体素的硬件很容易实现高效的硬件实现,具有出色的准确性和相对较低的延迟。而基于点的方法很容易保留点云的空间局部结构,但代价是比基于体素的方法花费更长的前馈时间。基于点体素的方法最具有潜力。

效果:准确性和延迟比不上纯点云的算法,但是比纯图像好(三种算法中最有前景,更适用与现实场景,因为发生故障的时候可以提供备份,不至于系统奔溃。)
主要问题:融合什么(RGB图像和点云)、怎么融合(就是要进行语义对齐,可以在不同的阶段不同的尺度做融合)、什么时候融合(早融合、深度融合、晚融合)
研究方向1-顺序融合:数据流只有一条路径,不同模态的数据只有一个路径依次通过网络。
研究方向2-并行融合:数据流只有多条路径,不同模态数据同时通过网络。这边的话,如果设计得当,一个分支被切断,网络仍可继续工作。根据单一模态数据的融合时机,可以继续分为早融合、深度融合以及晚融合。
早融合:在数据预处理的时候融合,但是由于在低级语义特征的情况下做对齐,会有很大的噪声,故不常使用
深度融合:在中间进行特征融合
晚融合:在每个模态数据处理完毕之后,得到最终结果之前融合
注:效果比不上纯点云的原因:主要还是语义对齐问题。1、点云是3D视图而RGB图像是2D视图;2、图像是密集的网格点而点云是不规则的稀疏点;3、目前的融合方法主要是裁剪和特征图大小变换,这或许不是最佳的。
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h