本文目前仅包含2个体素编码器、2个中间编码器、1个主干网络、1个颈部网络和1个检测头。如果有机会,会继续补充更多模型。
若发现内容有误,欢迎指出。
MMDetection3D的点云数据一般会经历如下步骤/模块:
下面分别介绍每个部分的一些典型模型。
在介绍体素编码器前,需要先介绍体素化函数,以理解体素编码器的输入参数含义。
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| max_voxels | (int, int) | - | 最大体素数 | 两个元素分别表示训练时和测试时的最大体素数 |
| max_num_points | int | - | 体素内最大点数 | 记为 M M M |
| point_cloud_range | List(float) | – | 点云范围 | 列表长为6,依次表示
x
,
y
,
z
x,y,z
x,y,z方向的最小值和
x
,
y
,
z
x,y,z
x,y,z方向的最大值,即[x_min,y_min,z_min,x_max,y_max,z_max] |
| voxel_size | List(float) | - | 每个体素的大小 | 列表长为3,依次表示体素的
x
,
y
,
z
x,y,z
x,y,z尺寸,即[x_size,y_size,z_size] |
注:将体素大小z_zise设置为与点云高度范围相同时,就可以实现柱体化操作。
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| input | Tensor(float) | - | 点云特征 | ( n p , C ) (n_p,C) (np,C),其中 n p n_p np为点的数量, C C C为通道维度 |
| features | Tensor(float) | 返回值1 | 每个体素内的点 |
(
n
,
M
,
C
)
(n,M,C)
(n,M,C),其中
n
n
n为非空体素数,若第
i
i
i个体素内的点数
m
i
<
M
m_i<M
mi<M,则features[i,j,:](
j
≥
m
i
j\geq m_i
j≥mi)为零向量 |
| num_points | Tensor(int) | 返回值2 | 每个体素内的点数 |
(
n
,
)
(n,)
(n,),其中第
i
i
i个体素内的点数为num_points[i](即上文的
m
i
m_i
mi) |
| coors | Tensor(int) | 返回值3 | 每个体素的3维位置索引 |
(
n
,
3
)
(n,3)
(n,3),其中3表示z_id,y_id,x_id |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| points | List(Tensor(float)) | - | 一个batch的点云 | 列表长为batch size,其第 i i i个元素大小为 ( n i , p , C ) (n_{i,p},C) (ni,p,C) |
| voxels | Tensor(float) | 返回值1 | 每个体素内的点 | ( N , M , C ) (N,M,C) (N,M,C),其中 N N N为整个batch的总非空体素数,即 N = ∑ i n i N=\sum_i n_i N=∑ini |
| num_points | Tensor(int) | 返回值2 | 每个体素内的点数 | 大小为 ( N , ) (N,) (N,) |
| coors | Tensor(int) | 返回值3 | 每个体素的batch索引和3维位置索引 |
(
N
,
4
)
(N,4)
(N,4),其中4表示batch_id,z_id,y_id,x_id |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| num_features | int | - | 点云的特征维度 | 记为 C C C |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| features | Tensor(float) | - | 每个体素内的点 | 大小为 ( N , M , C ) (N,M,C) (N,M,C),可为MVXTwoStageDetector类中的voxelize函数输出 |
| num_points | Tensor(int) | - | 每个体素内的点数 | 大小为 ( N , ) (N,) (N,),可为MVXTwoStageDetector类中的voxelize函数输出 |
| coors | Tensor(int) | - | 每个体素的batch索引和3维位置索引 | 大小为 ( N , 4 ) (N,4) (N,4),可为MVXTwoStageDetector类中的voxelize函数输出(在本函数中无实际作用,仅为和其余体素编码器有相同的输入) |
| 返回值 | Tensor(float) | 返回值 | 非空体素特征 | 大小为 ( N , C ) (N,C) (N,C) |
用于点云的柱体表达编码。通常搭配PointPillarsScatter中间编码器。

| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | int | - | 柱体的特征维度 | 记为 C C C |
| feat_channels | Tuple(int) | - | - | 长度表示图中PFN的数量 N N N,第 i i i个元素表示第 i i i个PFN的输出通道数 |
| with_distance | bool | False | 表示是否将点到原点的距离附加在点的通道维度 | - |
| with_cluster_center | bool | True | 表示是否将点到体素质心的三维偏移量附加在点的通道维度 | - |
| with_voxel_center | bool | True | 表示是否将点到体素中心的三维偏移量附加在点的通道维度 | - |
| voxel_size | List(float) | - | 每个体素的大小 | 列表长为3,依次表示体素的
x
,
y
,
z
x,y,z
x,y,z尺寸,即[x_size,y_size,z_size] |
| point_cloud_range | Tuple(float) | - | 点云范围 | 长为6,依次表示
x
,
y
,
z
x,y,z
x,y,z方向的最小值和
x
,
y
,
z
x,y,z
x,y,z方向的最大值,即[x_min,y_min,z_min,x_max,y_max,z_max] |
| norm_cfg | dict | 归一化类型默认为BN1d | 设置归一化类型 | 配置文件格式 |
| mode | str | 池化类型默认为最大池化 | 设置池化类型 | 'max’表示最大池化,'avg’表示均值池化 |
| legacy | bool | True | - | 若为True,会导致with_cluster_center=True时影响到原始特征,且若此时with_distance=True,则附加的特征会变为到体素中心的距离而非到原点的距离;为False时结果正常 |

| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | int | - | 输入通道数 | 记为 C C C |
| sparse_shape | List(int) | - | 体素空间的shape | 列表长为3,依次表示 z , y , x z,y,x z,y,x方向的体素数 |
| order | Tuple(str) | (‘conv’, ‘norm’, ‘act’) | 表示卷积、归一化和激活函数的顺序 | - |
| norm_cfg | dict | 归一化类型默认为BN1d | 归一化类型设置 | 配置文件格式 |
| base_channel | int | - | 第一个卷积的输出通道数 | - |
| output_channels | int | - | 最后一个卷积的输出通道数 | - |
| encoder_channels | Tuple(Tuple(int)) | - | 每层的输出通道维度 | 外层元组长度为阶段数(图中 N N N),内层元组长度为每阶段层数(图中 L L L) |
| encoder_paddings | Tuple(Tuple(int)) | - | 每层的填充值 | 内外层元组长度分别与encoder_channels相同 |
| block_type | str | - | 使用的模块类型 | 可为’conv_module’或’basicblock’(区别如图) |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| voxel_features | Tensor(float) | - | 非空体素特征 | ( N , C ) (N,C) (N,C), N N N为体素数;该参数通常是VOXEL_ENCODERS的输出 |
| coors | Tensor(int) | - | 非空体素坐标 | ( N , 4 ) (N,4) (N,4),该参数通常是体素化函数的输出 |
| batch_size | int | - | batch size | 记为 B B B |
| spatial_features | Tensor(float) | 返回值 | BEV特征图 | 大小为
(
B
,
C
′
,
H
,
W
)
(B,C',H,W)
(B,C′,H,W),其中
H
H
H为宽度(y_size),
W
W
W为长度(x_size) |
用于点云的柱体表达编码。可搭配PillarFeatureNet体素编码器。
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | int | - | 输入通道数 | - |
| output_shape | List(int) | - | 输出BEV特征图的大小 | 长度为2,分别为BEV特征图的宽度
H
H
H(y_size)和长度
W
W
W(x_size) |
SECOND主干网络通常搭配SECONDFPN颈部网络。前面可搭配体素操作(如HardSimpleVFE + SparseEncoder)或柱体操作(如PillarFeatureNet + PointPillarsScatter)。

| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | int | - | 输入的体素特征维度 | - |
| out_channels | List(int) | - | 每个阶段的输出通道数 | 长度为图中 L L L |
| layer_nums | List(int) | - | 每阶段的卷积层数(图中 N N N) | 长度与out_channels相同 |
| layer_strides | List(int) | - | 每阶段第一个卷积的步长 | 长度与out_channels相同 |
| conv_cfg | dict | 默认卷积类型为Conv2d | 设置卷积类型 | 配置文件格式 |
| norm_cfg | dict | 默认归一化类型为BN | 设置归一化类型 | 配置文件格式 |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| x | Tensor(float) | - | 点云的BEV表达 | ( B , C , H , W ) (B,C,H,W) (B,C,H,W),通常为MIDDLE_ENCODERS的输出 |
| 返回值 | List(Tensor(float)) | 返回值 | 输出为点云的多尺度BEV特征 | 列表长度等于尺度数,每个尺度特征图大小为 ( B , C i , H i , W i ) (B,C_i,H_i,W_i) (B,Ci,Hi,Wi) |
SECONDFPN颈部网络通常搭配SECOND主干网络。

| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | List(int) | - | 表示各尺度特征通道数 | 与SECOND的out_channels相同 |
| out_channels | List(int) | - | 每个DeConv的输出通道数 | 长度为图中 L L L |
| upsample_strides | List(int) | - | 上采样步长 | 每个上采样块的上采样比例 |
| conv_cfg | dict | 默认卷积类型为Conv2d | 设置卷积类型 | 配置文件格式 |
| norm_cfg | dict | 默认归一化类型为BN | 设置归一化类型 | 配置文件格式 |
| upsample_cfg | dict | 默认上采样方式为DeConv | 上采样方式 | 配置文件格式 |
| use_conv_for_no_stride | bool | False | - | - |
use_conv_for_no_stride=False且upsample_stride=1时,或upsample_stride>1时使用upsample_cfg搭建DeConv卷积,否则(即use_conv_for_no_stride=True且upsample_stride=1,或upsample_stride<1)使用conv_cfg搭建Conv2d卷积
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| x | List(Tensor(float)) | - | 点云多尺度BEV特征 | 列表长度为尺度数,可直接使用SECOND的输出 |
| 返回值 | List(Tensor(float)) | 返回值 | 多尺度融合后的BEV特征 | 列表长度为1 |
检测头模块需要注意两点:
一是loss函数的计算以及预测结果的生成均是在检测头中实现的方法;
二是检测头初始化一般都有train_cfg和test_cfg两个参数,但在配置文件中,这两个参数往往需要写到检测器模型(DETECTOR)中而非检测头中。
CenterPoint的检测头。可搭配SECOND + SECONDFPN结构使用。

| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| in_channels | List(int) | - | 输入通道数 | 与颈部网络的输出通道数相同 |
| shared_conv_channel | int | - | 第一个共享卷积的输出通道维度 | - |
| bias | str | ’auto’ | 第一个共享卷积层的偏置项设置 | - |
| tasks | List(dict) | - | dict为{'num_class': int, 'class_names': List(str)}的结构;列表的每一个元素对应图中的一个SeperateHead结构(即对不同的类别,head的网络参数可能不同) | |
| num_heatmap_convs | int | - | 每个中心热图头的卷积数 | - |
| common_heads | dict | - | - | 可包含如’reg’(BEV位置偏差)、‘hei’(离地高度)、‘dim’(尺寸)、‘rot’(旋转角)、‘vel’(速度)等项;每一项的值为二元组(int,int):第一元素为最终维度,第二元素为head中的卷积层数(对应图中 N N N) |
| norm_bbox | bool | True | 是否对数归一化边界框尺寸作为估计值 | - |
| conv_cfg | dict | 默认卷积类型为Conv2d | 设置卷积类型 | 配置文件格式 |
| norm_cfg | dict | 默认归一化类型为BN2d | 设置归一化类型 | 配置文件格式 |
| bbox_coder | dict | 默认BBOX_CODERS类型为CenterPointBBoxCoder类 | 设置BBOX_CODERS类型 | 配置文件格式 |
| loss_cls | dict | 默认LOSS类型为GaussianFocalLoss | 设置分类任务的LOSS类型 | 配置文件格式 |
| loss_bbox | dict | 默认LOSS类型为L1Loss | 设置回归任务的LOSS类型 | 配置文件格式 |
| seperate_head | dict | 默认为SeperateHead类 | 设置SeperateHead的参数 | 配置文件格式,其中需要手动设置的初始化参数包括:head_conv为Head卷积的中间维度;final_kernal为Head卷积核大小 |
train_cfg和test_cfg均为字典格式,这里单独拿出来介绍:
| 参数名称 | 数据类型 | 含义 | 取值说明 |
|---|---|---|---|
| grid_size | List(int) | 原始体素空间的shape | 列表长为3,依次表示 x , y , z x,y,z x,y,z方向的体素数 |
| point_cloud_range | List(float) | 点云范围 | 列表长为6,依次表示
x
,
y
,
z
x,y,z
x,y,z方向的最小值和
x
,
y
,
z
x,y,z
x,y,z方向的最大值,即[x_min,y_min,z_min,x_max,y_max,z_max] |
| voxel_size | List(float) | 体素大小 | 列表长为3,依次表示体素的
x
,
y
,
z
x,y,z
x,y,z尺寸,即[x_size,y_size,z_size] |
| out_size_factor | int | 下采样倍数 | 最后BEV预测的大小为grid_size//out_size_factor |
| max_objs | int | 最大检测物体数量 | 会取至多max_objs个物体计算热图回归目标 |
| dense_reg | float | 与max_objs相乘作为最终的最大检测数量 | 可固定为1,仅设置max_objs即可 |
| gaussian_overlap | float | 计算高斯半径时的参数 | 与真实物体尺寸一起用于计算高斯半径,从而生成热图的真值 |
| min_radius | float | 最小高斯半径 | 防止上述计算出来的高斯半径过小 |
| code_weights | List(float) | 计算损失时的各项权重 | 长度与边界框参数编码项数相同,如边界框编码包含3维位置、3维尺度,以及朝向角的正余弦值则长度应为8 |
| 参数名称 | 数据类型 | 含义 | 取值说明 |
|---|---|---|---|
| post_center_limit_range | List(float) | 后处理时物体中心的范围 | 列表长为6,依次表示
x
,
y
,
z
x,y,z
x,y,z方向的最小值和
x
,
y
,
z
x,y,z
x,y,z方向的最大值,即[x_min,y_min,z_min,x_max,y_max,z_max];该范围一般略大于点云范围 |
| nms_type | str | NMS方法的类型 | 只能是’circle’(CenterPoint文章提到的NMS方法)或’rotate’(常规的NMS方法) |
| nms_thr | float | rotate NMS的IoU阈值 | 仅在nms_type='rotate’时需要设置 |
| score_threshold | float | rotate NMS的分数筛选阈值 | 仅在nms_type='rotate’时需要设置,nms前仅筛选满足分数大于该阈值的物体 |
| pre_max_size | int | rotate NMS前考虑的最大物体数量 | 仅在nms_type='rotate’时需要设置,多余的预测会被丢弃(若需要全部考虑,可设置为None) |
| post_max_size | int | rotate NMS或circle NMS后保留的最大物体数量 | - |
| min_radius | List(float) | circle NMS的最小半径 | 仅在nms_type='circle’时需要设置,长度为tasks数;第 i i i项对应第 i i i个task的物体BEV中心距离阈值 |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| feats | List(Tensor(float)) | - | (多尺度)特征图 | 通常为颈部网络的输出 |
| 返回值 | Tuple(List(dict)) | 返回值 | BEV上的预测结果 | 外层元组长为任务数,内层列表长为尺度数,字典的键为’heatmap’以及common_heads中的键(如’reg’、‘hei’、‘dim’、‘rot’),值为相应Head的输出Tensor(大小为 ( B , ∗ , h , w ) (B,*,h,w) (B,∗,h,w)) |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| pred_dicts | Tuple(List(dict)) | - | BEV下的预测结果 | 检测头模块forward函数的输出结果 |
| gt_bboxes_3d | List(Tensor(float)) | - | 真实边界框参数 | 列表长为batch size,Tensor为 ( n b , box_dim ) (n_b,\textup{box\_dim}) (nb,box_dim),其中 n b n_b nb表示该帧的真实边界框数量 |
| gt_labels_3d | List(Tensor(int)) | - | 真实边界框类别标签 | 列表长为batch size,Tensor为 ( n b , ) (n_b,) (nb,) |
| 返回值 | dict | 返回值 | 损失字典 | 包含各任务的分类损失和回归损失,格式为{'task0.loss_heatmap': float, 'task0.loss_bbox': float, 'task1.loss_heatmap': float, ...} |
| 参数名称 | 数据类型 | 默认值 | 含义 | 取值说明 |
|---|---|---|---|---|
| pred_dicts | Tuple(List(dict)) | - | BEV预测下的预测结果 | 检测头模块forward函数的输出结果 |
| img_metas | List(dict) | - | 数据信息 | 检测器模型forward函数输入中的img_meta项;列表长为batch size |
| 返回值 | List(List(Tensor)) | - | 最终的检测结果 | 外层列表长为batch_size,内层列表长为3,分别是预测的边界框参数 ( n b pred , box_dim ) (n_b^\textup{pred},\textup{box\_dim}) (nbpred,box_dim)、分数 ( n b pred , ) (n_b^\textup{pred},) (nbpred,)和类别标签 ( n b pred , ) (n_b^\textup{pred},) (nbpred,) |
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢