草庐IT

【三维目标检测】FCAF3D(一)

Coding的叶子 2024-01-05 原文

        FCAF3D是一种anchor-free的全卷积室内三维目标检测算法,由三星公司发表在ECCV 2022 《FCAF3D: Fully Convolutional Anchor-Free 3D Object Detection》,论文地址为“https://arxiv.org/abs/2112.00322”。现有的 3D 物体检测方法使得对物体几何形状的先验假设,作者认为它限制了模型的泛化能力。FCAF3D采用anchor-free的方式避免这种提前假设,是一种纯粹数据驱动的方法。目前,该方法发布时在ScanNet V2 (+4.5)、SUN RGB-D (+3.5)和S3DIS (+20.5) 数据集上均取得了最好的结果。下图所示排名数据和图片来源于paperwithcode官网(2022.12.12),目前FCAF3D仍然排名比较靠前,地址为“https://paperswithcode.com/sota/3d-object-detection-on-sun-rgbd-val”。

1 源码与数据输入

        FCAF3D官方源码地址为“https://github.com/samsunglabs/fcaf3d”。这里主要介绍mmdetection3d中实现的版本。mmdetection3d安装和调试验证可参考本专栏之前的博客:【mmdetection3d】mmdetection3d安装详细步骤_Coding的叶子的博客-CSDN博客_mmdetection3d,里面有详细介绍。

        Mmdetection3d FCAF3D支持ScanNet V2、SUN RGB-D和S3DIS三种室内数据集,这里重点介绍S3DIS数据集。S3DIS数据集详细介绍请参考:mmdetection3d S3DIS (持续更新)_Coding的叶子的博客-CSDN博客

2 mmdetection3d 上s3dis数据处理与模型训练

        Mmdetection3d s3dis数据集处理过程请参考:mmdetection3d S3DIS (持续更新)_Coding的叶子的博客-CSDN博客

        数据集处理命令为:

cd data/s3dis
python collect_indoor3d_data.py
cd ../..
python tools/create_data.py s3dis --root-path ./data/s3dis --out-dir ./data/s3dis --extra-tag s3dis

3 源码运行调试

        mmdetection3d s3dis数据集预处理完成之后,运行下述命令即可开始FCAF3D训练。

python tools/train.py configs/ssn/hv_ssn_secfpn_sbn-all_2x16_2x_nus-3d.py

3.1 MinkowskiEngine

        程序运行依赖于MinkowskiEngine库,如果未安装该库则会报错误提示“NameError: MinkSingleStage3DDetector: MinkResNet: name 'ME' is not defined”。MinkowskiEngine是一个用于稀疏张量的自动微分库,支持所有标准神经网络层,例如卷积、池化等操作。FCAF3D主要用其来进行三维稀疏卷积操作。

        直接使用“pip install MinkowskiEngine”进行安装时,可能会报错误提示“BLAS not found from numpy.distutils.system_info.get_info.”。可通过下面步骤成功安装:

apt-get update
apt install build-essential  libopenblas-dev
git clone https://gitee.com/mirrors_NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
python setup.py install --blas_include_dirs=${CONDA_PREFIX}/include --blas=openblas

4 FCAF3D简介

        FCAF3D模型的整体结构如下图所示。该模型属于anchor-free目标检测算法。FCAF3D主干网络采用的是典型的ResNet34 FPN结构。该结构采用了三维稀疏卷积进行计算,计算过程中得到的非稀疏点作为Head预测的种子点。FPN层实现了四种不同特征尺度下的预测,各种尺度下的特征维度分别为64、128、256和512。

 4.1 bbox编码

        模型直接预测结果通常是目标和种子点之间的偏差。例如:

d1 = x + w/2 - px
d2 = px - x + w/2
d3 = y + l/2 - py
d4 = py - y + l/2
d5 = z + h/2 - pz
d6 = pz - z + h/2

        其中,x、y、z、w、l、h分别为目标中心点坐标和尺寸,px、py、pz为种子点坐标,d1~d6为预测偏差。那么,我们可以得到:

w = d1 + d2
h = d3 + d4
z = d5 + d6

        因而,由种子点及其预测偏差即可得到预测目标的三维坐标和尺寸,从而实现对模型直接预测结果的解码。

        三维目标中的另一个关键位置参数时偏转角度θ,而这个角度选择通常与物体的正面相关。但是,对于类似于圆形或方形目标一般难以选取正面,或者说前后左右四个面都可以作为正面。这给损失函数计算时带来了难度。因此,针对这种情况,作者希望设计一种偏移,使得物体尺寸固定时任意一面作为正面时取值是相同的。

        假设偏移角度为θ,宽高比w/l为q,尺寸s为宽高之和(w+l),在x、y、z、w+l、h保持不变时,作者利用莫比乌斯带原理证明了四种朝向下ln(q)sin(2θ)、ln(q)cos(2θ)、sin(4θ)和lsin(4θ)是相同的,并使用前两个结果作为近似,进而得到角度偏差如下:

d7 = ln(w/l)sin(2θ)
d8 = ln(w/l)cons(2θ)

        预测结果与目标尺寸、方向之间的位置关系如下:

4.2 损失函数

        模型预测结果主要包含三部分:目标类别、中心度、位置。输入数据包含5个类别,且目标类别的损失函数为FocalLoss。目标中心度和bbox位置的损失函数分别为CrossEntropyLoss和AxisAlignedIoULoss。

5 模型结构与代码详解

        模型详细结构及推理过程请参考下一篇博客:预计本周内更新。

【python三维深度学习】python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_python 数学形态 点云从三维点云基础知识到深度学习,将按照以下目录持续进行更新。更新完成的部分可以在三维点云专栏中查看。含数据与python源码。https://blog.csdn.net/suiyingy/article/details/124017716

有关【三维目标检测】FCAF3D(一)的更多相关文章

  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 - 检测由 RSpec、Ruby 运行的代码 - 2

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

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

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

  8. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  9. ruby - Ruby 脚本如何检测到它正在 irb 中运行? - 2

    我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_

  10. Ruby 无法检测字符串中的换行符 - 2

    我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h

随机推荐