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

news2024/11/27 22:41:35

        FCAF3D数据和源码配置调试过程请参考上一篇博文:【三维目标检测】FCAF3D(一)_Coding的叶子的博客-CSDN博客。本文主要详细介绍FCAF3D网络结构及其运行中间状态。

1 模型总体过程

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

deffa1bd00232eeae23fdc7f3645f9b4.png

2 主要模块解析

2.1 输入数据

        输入数据维度为Nx6,这6个维度分别为坐标x、y、z和色彩r、g、b,且N=100000。输入数据经MinkowskiEngine引擎转为稀疏表达,体素尺寸为0.01m。经过稀疏表达之后,体素坐标coordinates构成维度为batch_id、x、y、z,体素特征features构成维度为r、g、b。由于涉及到体素化操作,点的数量会发生变化,假设由N变到M。

#points Nx6 N=100000 xyzrgb
x = self.extract_feat(points)
coordinates, features = ME.utils.batch_sparse_collate([(p[:, :3] / self.voxel_size, p[:, 3:]) for p in points], device=points[0].device)
#coordinates为体素坐标,体素大小为0.01m ,Mx4,[batch_id x y z]
#features为rgb取值
x = ME.SparseTensor(coordinates=coordinates, features=features) #稀疏表达

2.2 主干网络backbone        

        主干网络采用的是典型的残差网络ResNet34,共34层卷积或池化操作。和普通二维ResNet相比,所用结构最大区别在于使用了三维稀疏卷积,并通过MinkowskiEngine引擎实现,因而模型中定义其名称分别为MinkResNet、MinkowskiConvolution和MinkowskiMaxPooling。

        主干网络输出4种不同尺度特征,分别为M3x64、M4x128、M5x256和M6x512模型主要过程如下:

self.backbone(x)、Mx3、Resnet34、MinkResNet
MinkowskiConvolution(in=3, out=64, kernel_size=[3, 3, 3], stride=[2, 2, 2], dilation=[1, 1, 1]) M1X64
MinkowskiMaxPooling(kernel_size=[2, 2, 2], stride=[2, 2, 2], dilation=[1, 1, 1]) M2X64
Layer1 [(64, 3), (64, 3)] *3 stride 2 -> M3 x 64,x1
Layer2 [(128 , 3), (128, 3)] *4 stride 2 -> M4 x128,x2
Layer3  [(256 , 3), (256, 3)] *6 stride 2 -> M5 x256,x3
Layer4  [(256 , 3), (256, 3)] *3 stride 2 -> M6 x512,x4

2.3 特征金字塔FPN

        特征金字塔FPN一方面为Head提供不同尺度的特征图,另一方面实现了浅层和深层之间的特征融合。特征融合主要包括上采样和融合两个步骤。上采样是为了使深层特征和浅层特征具备相同的特征维度以便后续进行融合,其可通过插值或反卷积实现。

        以深层特征x4为例,其特征维度为M6 x 512,经过反卷积MinkowskiGenerativeConvolutionTranspose(512, 256)和卷积MinkowskiConvolution(256, 256)得到上采样后特征(M7x256)。上采样后特征与前一层特征x3直接叠加得到新的融合特征(M7x256)。FCAF3D对融合后的特征还做了一次prune裁剪操作。假设经过裁剪后的点云特征维度仍为M7x256,该特征作为第3层的输出特征。

        通过特征金字塔操作,FCAF3D得到了四种不同尺度特征,即M6x512、M7x256、N8x128、M9x64,这里统一用MxF来表示。融合后特征经过卷积MinkowskiConvolution(F, 128)再次进行一次特征提取并得到FPN最终输出M6x128、M7x128、M8x128、M9x128。

        关键程序如下。

x4 MinkowskiConvolution(in=512, out=128, kernel_size=[3, 3, 3], stride=[1, 1, 1], dilation=[1, 1, 1]) x5 M6x128
scores = self.conv_cls(x) M6x5 分类分数,共5个类别
prune_scores = ME.SparseTensor(scores.features.max(dim=1, keepdim=True).values)
MinkowskiGenerativeConvolutionTranspose(in=512, out=256, kernel_size=[2, 2, 2], stride=[2, 2, 2], dilation=[1, 1, 1]) 上采样
MinkowskiConvolution(in=256, out=256, kernel_size=[3, 3, 3], stride=[1, 1, 1], dilation=[1, 1, 1])
M7 x 256
x = inputs[i] + x#特征融合
x = self._prune(x, prune_score)#点云裁剪
MinkowskiGenerativeConvolutionTranspose(in=256, out=128, kernel_size=[2, 2, 2], stride=[2, 2, 2], dilation=[1, 1, 1]) M7x128 特征提取

2.4 FCAF3D Head

        FCAF3D Head分别对FPN层输出的4种不同尺度特征经过卷积操作得到目标中心度、分类得分和位置预测。Head结果输出如下,每个都对应了4种不同尺度,其中points是稀疏卷积操作后得到的非稀疏点坐标,也作为预测的种子点。

center_preds [M9x1、M8x1、M7x1、M6x1]
bbox_preds [M9x6、M8x6、M7x6、M6x6]
cls_preds [M9x5、M8x5、M7x5、M6x5]
points [M9x3、M8x3、M7x3、M6x3]

        关键程序如下

中心度Head:
center_pred = self.conv_center(x).features Mx1
MinkowskiConvolution(in=128, out=1, kernel_size=[1, 1, 1], stride=[1, 1, 1], dilation=[1, 1, 1])
分类Head:
scores = self.conv_cls(x)
MinkowskiConvolution(in=128, out=5, kernel_size=[1, 1, 1], stride=[1, 1, 1], dilation=[1, 1, 1]) M6x5
位置Head:
reg_final = self.conv_reg(x).features Mx6
MinkowskiConvolution(in=128, out=6, kernel_size=[1, 1, 1], stride=[1, 1, 1], dilation=[1, 1, 1])

2.5 损失函数

2.5.1 标签计算

        标签计算过程中需要为上述不同尺度下的各个点points赋予真实标签。有效的预测点(种子点),即存在真实标签与之对应,必须满足如下条件:

  1. 点所在特征尺度下,某一真实标注框在该尺度下必须有pts_assign_threshold(27)个点在框内。
  2. 每个真实框可能存在多个尺度满足(1)中要求,采用特征尺度最大的作为best_level。
  3. 点需要要在某一真实目标框内。
  4. 计算满足上述条件中各个点的中心度,每个真实框最多选择18个中心度较大的种子点。
  5. 针对中心度满足要求的种子点,如果种子点同时满足多个真实框要求,那么仅预测体积最小的真实框。

        计算步骤如下:

  1. 计算点是否在目标框内。
  2. 计算在各个尺度下属于某一真实目标框中的点个数,选择点数满足阈值要求的点。
  3. 保留最佳尺度best_level下对应的点。
  4. 针对每个真实目标框最多选择18个中心度较大的种子点。
  5. 针对上述满足要求的种子点,选择最小真实目标框体积的目标标签。
  6. 根据(5)中的标签得到中心度标签center_targets(不满足要求的点设置为-1), 候选框标签bbox_targets(6个维度,不含方向),类别标签cls_targets(不满足要求的点设置为-1)。

2.5.2 损失计算

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

        关键程序如下:

正样本:类别标签cls_targets≥0的种子点,数量n_pos
cls_loss = self.cls_loss(cls_preds, cls_targets, avg_factor=n_pos) FocalLoss()
仅对正样本进行中心度和位置回归损失计算
pos_center_preds = center_preds[pos_inds]
pos_bbox_preds = bbox_preds[pos_inds]
pos_center_targets = center_targets[pos_inds].unsqueeze(1)
pos_bbox_targets = bbox_targets[pos_inds]
center_denorm = max(reduce_mean(pos_center_targets.sum().detach()), 1e-6)
center_loss = self.center_loss(pos_center_preds, pos_center_targets, avg_factor=n_pos) CrossEntropyLoss
bbox_loss = self.bbox_loss(self._bbox_to_loss(self._bbox_pred_to_bbox(pos_points, pos_bbox_preds)), self._bbox_to_loss(pos_bbox_targets), weight=pos_center_targets.squeeze(1), avg_factor=center_denorm) AxisAlignedIoULoss()

2.6 顶层结构

        顶层结构主要包含以下三部分:

  1. 特征提取:采用ResNet34 FPN模型结构提取4种不同尺度的特征尺寸,输出结果见2.3节。
  2. FCAF3D Head:结果预测,见2.4节。
  3. 损失函数:见2.5节。
def forward_train(self, points, gt_bboxes_3d, gt_labels_3d, img_metas):
    x = self.extract_feat(points)
    losses = self.head.forward_train(x, gt_bboxes_3d, gt_labels_3d, img_metas)
    return losses

3 训练命令

python tools/train.py configs/fcaf3d/fcaf3d_8x2_s3dis-3d-5class.py

4 运行结果

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

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

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

相关文章

SIoU Loss 原理与代码解析

paper:SIoU Loss: More Powerful Learning for Bounding Box Regression code:https://github.com/meituan/YOLOv6/blob/main/yolov6/utils/figure_iou.py#L75 存在的问题 之前的目标检测模型的回归损失考虑到了预测的bounding box和gt box之间的dis…

【头歌C语言程序与设计】选择结构程序设计进阶

目录 写在前面 正文 第1关:快递费用计算 第2关:计算一元二次方程的根 第3关:产品信息格式化 写在最后 写在前面 本文代码是我自己所作,本人水平有限,可能部分代码看着不够简练,运行效率不高,但都能运…

cmake笔记 编译与链接

文章目录概述编译最简单的hello world编译工程化的helloWorld更工程化的Hello World: 构建静态库与动态库如何使用外部共享库和头文件其他有用的cmake命令include_directoriesfind_package file(GLOB variable [RELATIVE path] [globbing expressions]...)windows 下…

【Maven基础】IDEA环境使用

第一节 创建父工程 1、创建 Project 2、开启自动导入 创建 Project 后,IDEA 会自动弹出下面提示,我们选择**『Enable Auto-Import』**,意思是启用自动导入。 这个自动导入一定要开启,因为 Project、Module 新创建或 pom.xml 每次…

微服务的相关概念及知识

微服务概念 微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HT…

6-zookeeper-hadoop-ha原理简述-fail

6-zookeeper-hadoop-ha故障转移机制,原理简述: HA概述(2.X版本架构)。 1)、HA(High available),即高可用(7*24小时不间断服务。) 1、zookeeper协调服务,通…

jsp+ssm计算机毕业设计毕业设计管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

Qt扫盲-QScrollBar理论总结

QScrollBar理论总结1. 简述2. 滚动条组成3. 常用设置5. 信号6. 键盘功能1. 简述 QScrollBar其实就是一个滚动条控件,它使用户能够访问大于用于显示文档的小组件的文档部分。它提供了用户在文档中的当前位置以及可见的文档量的可视指示。滚动条通常配备其他控件&…

什么是MOS管的米勒效应

在说MOS管的米勒效应之前我们先看下示波器测量的这个波形: 这个波形其实就是这个MOS管开关电路的波形,探头1这个黄色的测量的是MOS管的栅极,探头2这个蓝色的测量的是MOS管漏极 大家有没有发现这个黄色的波形在上升的过程中出现了一个平台,其实…

一年半经验如何准备前端面试

typeof NaN 的结果是什么? NaN 指“不是一个数字”(not a number),NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误情况,即“执行数…

如何快速拥有好的测试idea

如果接手任意一个测试任务,如何开始测试以及怎么快速的形成测试点呢?其实也是有一套小套路的。大概整理了下,可以从6个方面来考虑入手。 1.项目 快速了解项目背景、信息对象、项目风险、测试资料、债务、交流、语境分析、交付品、工具。 项目的提出动机…

0~9岁|一文讲清楚精细动作有多重要

人都有两宝:“双手和大脑”。 在我们的脑中枢神经内,有一部分专门掌管手部动作,手部动作越精细,与之对应的大脑神经元也就越发达。作为儿童智能的重要组成部分,精细动作还是衡量儿童神经系统发育的一个重要指标。 一、…

C++:继承、模板、CRTP:谈谈C++多态设计模式(三):函数模板

1:模板的概念 C中不止有 面向对象编程思想,还要泛型编程思想。而泛型编程思想的核心就是 模板 模板的建立大大提搞了复用行,C中的模板包括 :函数模板和类模板。 2:函数模板基本语法 函数模板 概念: 建立…

细粒度图像分类论文研读-2018

文章目录Object-Part Attention Model for Fine-grained Image Classification(by localization- classification subnetwork)AbstractIntroductionObject- Part Attention ModelObject- Part Spatial Constraint ModelOur OPAM ApproachObject-level At…

Flink从入门到放弃—Stream API—clean()方法

文章目录导航clean()案例贴上源码导航 涉及到文章: Flink从入门到放弃—Stream API—Join实现(即多流操作) Flink从入门到放弃—Stream API—常用算子(map和flatMap) Flink从入门到放弃—Stream API—常用算子(filter…

讲解Redis的主从复制

Redis 主从复制1 主从复制2 作用3 主从复制架构图4 搭建主从复制5 使用规则1 主从复制 主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据 无法解决: 1.master节点出现故障的自动故障转移 主从复制,是指将一台Redis服务器的数据,复制到…

数据挖掘的步骤有哪些?

所谓数据挖掘就是从海量的数据中,找到隐藏在数据里有价值的信息。因为这个数据是隐式的,因此想要挖掘出来并不简单。那么,如何进行数据挖掘呢?数据挖掘的步骤有哪些呢?一般来讲,数据挖掘需要经历数据收集、…

openEuler 倡议建立 eBPF 软件发布标准

eBPF 是一个能够在内核运行沙箱程序的技术,提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,使得非内核开发人员也可以对内核进行控制。随着内核的发展,eBPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等&#xff0…

软件测试之测试用例评审

一、评审目的 一般来说,参加测试用例评审的人员包括对应项目的产品人员、设计人员、开发人员和测试人员。 图1-1 测试用例评审相关人员 测试用例评审会议的发起者一般是测试人员,既然我们是发起者,那我们发起这个会议的目的是什么呢&#x…

【Java开发】 Spring 11 :Spring Boot 配置 Web 运行参数并部署至服务器

Spring Boot 项目开发结束后的工作便是运维,简单来说需要配置 Web 运行参数和项目部署两大工作,本文将尽可能详细地给大家讲全! 目录 1 定制 Web 容器运行参数 1.1 运行参数介绍 1.2 项目搭建 ① 通过 IDEA Spring Initializr 创建项目 …