首页 > 其他分享 >Voxel R-CNN 代码解析

Voxel R-CNN 代码解析

时间:2024-01-24 21:23:52浏览次数:30  
标签:Voxel spconv self batch dict voxel CNN 解析 size

1. 网络主体架构

voxel_rcnn_car.yaml为例。

主要包括:

  1. VFE(体素编码网络),这里采用下MeanVFE;
  2. BACKBONE_3D,这里采用VoxelBackBone8x;
  3. MAP_TO_BEV,这里采用HeightCompressionNUM_BEV_FEATURES为256;
  4. BACKBONE_2D,这里采用BaseBEVBackbone
  5. DENSE_HEAD,这里采用AnchorHeadSingle;
  6. ROI_HEAD,这里采用VoxelRCNNHead;

2. VFE 模块


这里采用的MeanVFE, 这里的depth_downsample_factor 为None,因为在cfgs/dataset_configs/kitti_dataset.yaml中没有定义。
MeanVFE的实现:

这里

3. BACKBONE_3D 模块

这里采用VoxelBackBone8x

class VoxelBackBone8x(nn.Module):
    def __init__(self, model_cfg, input_channels, grid_size, **kwargs):
        super().__init__()
        self.model_cfg = model_cfg
        norm_fn = partial(nn.BatchNorm1d, eps=1e-3, momentum=0.01)

        self.sparse_shape = grid_size[::-1] + [1, 0, 0] # grid_size (1408,1600,40) input_channels : 4

        self.conv_input = spconv.SparseSequential(
            spconv.SubMConv3d(input_channels, 16, 3, padding=1, bias=False, indice_key='subm1'),
            norm_fn(16),
            nn.ReLU(),
        ) # 定义了一个稀疏卷积
        block = post_act_block

        self.conv1 = spconv.SparseSequential(
            block(16, 16, 3, norm_fn=norm_fn, padding=1, indice_key='subm1'),
        )

        self.conv2 = spconv.SparseSequential(
            # [1600, 1408, 41] <- [800, 704, 21]
            block(16, 32, 3, norm_fn=norm_fn, stride=2, padding=1, indice_key='spconv2', conv_type='spconv'),
            block(32, 32, 3, norm_fn=norm_fn, padding=1, indice_key='subm2'),
            block(32, 32, 3, norm_fn=norm_fn, padding=1, indice_key='subm2'),
        )

        self.conv3 = spconv.SparseSequential(
            # [800, 704, 21] <- [400, 352, 11]
            block(32, 64, 3, norm_fn=norm_fn, stride=2, padding=1, indice_key='spconv3', conv_type='spconv'),
            block(64, 64, 3, norm_fn=norm_fn, padding=1, indice_key='subm3'),
            block(64, 64, 3, norm_fn=norm_fn, padding=1, indice_key='subm3'),
        )

        self.conv4 = spconv.SparseSequential(
            # [400, 352, 11] <- [200, 176, 5]
            block(64, 64, 3, norm_fn=norm_fn, stride=2, padding=(0, 1, 1), indice_key='spconv4', conv_type='spconv'),
            block(64, 64, 3, norm_fn=norm_fn, padding=1, indice_key='subm4'),
            block(64, 64, 3, norm_fn=norm_fn, padding=1, indice_key='subm4'),
        )

        last_pad = 0
        last_pad = self.model_cfg.get('last_pad', last_pad)
        self.conv_out = spconv.SparseSequential(
            # [200, 150, 5] -> [200, 150, 2]
            spconv.SparseConv3d(64, 128, (3, 1, 1), stride=(2, 1, 1), padding=last_pad,
                                bias=False, indice_key='spconv_down2'),
            norm_fn(128),
            nn.ReLU(),
        )
        self.num_point_features = 128
        self.backbone_channels = {
            'x_conv1': 16,
            'x_conv2': 32,
            'x_conv3': 64,
            'x_conv4': 64
        }



    def forward(self, batch_dict):
        """
        Args:
            batch_dict:
                batch_size: int
                vfe_features: (num_voxels, C)
                voxel_coords: (num_voxels, 4), [batch_idx, z_idx, y_idx, x_idx]
        Returns:
            batch_dict:
                encoded_spconv_tensor: sparse tensor
        """
        voxel_features, voxel_coords = batch_dict['voxel_features'], batch_dict['voxel_coords']
        batch_size = batch_dict['batch_size']
        input_sp_tensor = spconv.SparseConvTensor(
            features=voxel_features,
            indices=voxel_coords.int(),
            spatial_shape=self.sparse_shape,
            batch_size=batch_size
        )

        x = self.conv_input(input_sp_tensor)

        x_conv1 = self.conv1(x)
        x_conv2 = self.conv2(x_conv1)
        x_conv3 = self.conv3(x_conv2)
        x_conv4 = self.conv4(x_conv3)

        # for detection head
        # [200, 176, 5] -> [200, 176, 2]
        out = self.conv_out(x_conv4)

        batch_dict.update({
            'encoded_spconv_tensor': out,
            'encoded_spconv_tensor_stride': 8
        })
        batch_dict.update({
            'multi_scale_3d_features': {
                'x_conv1': x_conv1,
                'x_conv2': x_conv2,
                'x_conv3': x_conv3,
                'x_conv4': x_conv4,
            }
        })
        batch_dict.update({
            'multi_scale_3d_strides': {
                'x_conv1': 1,
                'x_conv2': 2,
                'x_conv3': 4,
                'x_conv4': 8,
            }
        })

        return batch_dict

标签:Voxel,spconv,self,batch,dict,voxel,CNN,解析,size
From: https://www.cnblogs.com/AccompanyingLight/p/17984102

相关文章

  • C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
    C#Methods方法是一段代码,只有在调用时才会运行。您可以将数据(称为参数)传递给方法。方法用于执行某些操作,也被称为函数。为什么使用方法?为了重用代码:定义一次代码,然后多次使用。创建一个方法方法的定义以方法的名称开头,后跟括号()。C#提供了一些预定义的方法,您已经熟悉,例如......
  • BeautifulSoup和Cheerio库:解析QQ音频文件的完整教程
    在当今数字化的世界中,网络上充斥着各种各样的数据,而这些数据往往以各种不同的格式和结构存在。要从这些数据中获取有用的信息,我们就需要使用一些工具来解析和提取数据。BeautifulSoup和CheerioBeautifulSoup是Python中用于解析HTML和XML文档的库,而Cheerio是Node.js中类似的库。......
  • 【快速阅读四】基于边缘信息的模版匹配中贪婪度参数的简单解析。
    对这个课题稍作研究,以便记录。在基于边缘的模版匹配中,我们知道可以有个贪婪度参数可以设置。在Halcon的帮助文档中,也有对他进行说明。我们在Halcon那本经典的书上,没有看到对这个参数的解析。不过他也有讲到在计算某个候选位置的得分时,如果满足一定的条件也可以提前结束......
  • 深度解析Android APP加固中的必备手段——代码混淆技术
    AndroidAPP加固是优化APK安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下AndroidAPP加固的具体实现方式。混淆代码使用ipaguard工具可以对代码进行混淆,使得反编译出来的代码很难阅读和理解,官网下载ipaguard即可。加固混淆为了保......
  • 线程管理神器:Executors全面解析
    内容摘要Executors在Java中提供了快速创建线程池的能力,其优点显著:它简化了线程管理,减少了代码量;提供了多种类型的线程池以适应不同场景;通过复用线程,降低了资源消耗,提高了系统响应速度和吞吐量。使用Executors,开发者能够更专注于业务逻辑,而无需深入底层线程细节。官方文档:https:/......
  • 前瞻性解析:数字孪生技术真正的实用价值
    在多领域2D、3D可视化监控层面确实是有实用价值的。数字孪生其实就是利用数字化技术创建的一个实体或系统的虚拟副本,它可以模拟和仿真现实世界的物理、工艺和行为特征。常被应用在2D和3D工业可视化监控中,通过将物理系统的数据与虚拟模型相结合,提供实时可视化的方式监测和管理......
  • 死磕Spring之IoC篇 - BeanDefinition 的解析过程(面向注解)
    BeanDefinition的解析过程(面向注解)前面的几篇文章对Spring解析XML文件生成BeanDefinition并注册的过程进行了较为详细的分析,这种定义Bean的方式是面向资源(XML)的方式。面向注解定义Bean的方式Spring的处理过程又是如何进行的?本文将会分析Spring是如何将 @Component......
  • C#析构函数解析:资源管理的精要和使用技巧
     在C#中,析构函数(Destructor)是一个特殊的方法,用于清理对象占用的资源。它是由垃圾回收器在对象被销毁时自动调用的。析构函数的原理是在对象即将被回收时执行一些清理操作,例如释放非托管资源或执行一些对象销毁前的必要操作。析构函数的基本原理:调用时机: 当对象被垃圾回收......
  • 44从零开始用Rust编写nginx,命令行参数的设计与解析及说明
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • # yyds干货盘点 # 解析json数据,指定列去解析报错如何破?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python解析的问题。问题如下:大佬们请问下这个是啥情况呀 解析json数据 指定列去解析报错JSONDecodeError:Expecting','delimiter:line1column73(char72)数据不多我就一个个去试指......