文章分享:E-RODNet: Lightweight Approach to ObjectDetection by Vehicular Millimeter-Wave Radar
引言
近年来,自动驾驶技术和高级驾驶辅助系统(ADAS)的研究快速发展,成为汽车科技领域的热点方向。为了实现高效的环境感知,目前主流传感器包括摄像头、激光雷达(LiDAR)以及毫米波雷达。相较于其他传感器,毫米波雷达具有以下显著优势:
全天候、全时段操作能力:不受光照和天气条件的影响,特别是在雨、雪、雾等恶劣环境中表现突出;
长距离探测与速度测量:可以精准获取目标的距离和速度信息;
低成本和广泛可用性。
然而,现有的基于毫米波雷达的目标检测模型通常过于复杂,模型参数量庞大、计算资源需求高,难以满足自动驾驶实时性和资源受限场景的实际需求。针对这一问题,《E-RODNet: Lightweight Approach to ObjectDetection by Vehicular Millimeter-Wave Radar》提出了一种高效的轻量级雷达目标检测模型 E-RODNet。
文章主要创新点
- modification of the SepConv operator within ConvFormer to adapt to the needs of 3-D spatiotemporal modeling;
 - introduction of a new global feature fusion module toenhance global modeling capability;
 - enhancement of the short-time sequence fusion module to improve the feature representation of long-time sequences.
 
ConvFormer块作为特征提取核心: E-RODNet采用了 ConvFormer块 作为主要的特征提取单元,将卷积操作扩展至三维,能够更有效地捕捉时空特征。相较于传统的自注意力机制,ConvFormer块是一种轻量级的解决方案,在保证性能的同时显著降低了计算开销。
全局特征融合模块: 在编码器的最后阶段引入了全局特征融合模块,利用全局上下文信息为每个像素增加全局语义关联。该模块通过局部池化操作提取全局特征向量,并将其重新投影到像素空间,从而提升全局建模能力。
短期序列融合模块: 针对毫米波雷达的时空序列数据,设计了一种改进的短期序列特征增强模块,能够有效提取雷达数据帧中的速度和空间特征。与传统的快速傅里叶变换(DFT)方法相比,该模块通过卷积操作学习速度特征,避免了傅里叶变换分辨率不足的问题。
同时,E-RODNet在模型参数量和计算量上大幅优化,参数量仅占T-RODNet模型参数的 3.8% ,计算量降低至T-RODNet的 18.2% ,实现了真正意义上的资源节约。
算法框图

算法实现
A. 总体架构
E-RODNet模型采用了U型结构,包含编码器 (Encoder)和解码器 (Decoder),并在两者之间通过跳跃连接(Skip Connections)来实现多尺度特征提取和融合。

数据处理流程:
- 输入数据是毫米波雷达的二维范围-角度(Range-Angle, R-A)射频图像。
 - 首先通过短期序列融合模块(Short-Term Sequence Fusion Module)提取短期时空特征,提升对目标动态变化的建模能力。
 - 数据经过编码器,逐层提取多尺度的时空特征,并通过下采样压缩数据维度。
 - 在编码器的最后一层,引入全局特征融合模块(Global Feature Fusion Module),为每个像素添加全局上下文信息,从而提升模型的全局建模能力。
 - 解码器通过线性插值(Linear Interpolation)对特征逐步进行上采样,同时通过跳跃连接融合低层次特征,最终输出目标类别的像素级预测结果。
 
B. 短期序列融合模块(Short-Term Sequence Fusion Module)
毫米波雷达的目标感知机制基于调频连续波(Frequency-Modulated Continuous Wave, FMCW)的信号处理:
- 雷达连续发射调频脉冲信号,遇到障碍物后产生反射,形成中频信号(Intermediate Frequency, IF)。
 - 通过快速傅里叶变换(Fast Fourier Transform, FFT)处理中频信号,可以得到目标的距离、速度和角度信息。
 
论文将这些调频脉冲信号视为一个短期序列(Short-Term Sequence),每帧包含多个chirps(采样点)。在CRUW数据集中,每帧有256个chirps,但数据集中仅提供了0、64、128、192号chirps。
模块设计:
模块分为速度分支(Velocity Branch)和 空间分支(Spatial Branch):
* 速度分支通过3D卷积核(大小为4×1×1,步长为4×1×1)提取速度特征,将输入的四个chirps压缩为单帧特征。
* 空间分支使用3D卷积核(大小为1×3×3),结合最大池化(Max Pooling),提取空间特征。
        最终,这两种特征通过线性层进行交互并融合,形成增强的短期序列特征。
C. 改进的ConvFormer块(核心特征提取)

MetaFormer 最早由华为 Noah’s Ark 实验室在论文 “MetaFormer is Actually What You Need for Vision” 中提出,核心思想是:将视觉 Transformer 的主体结构(也就是 “TokenMixer + MLP + 残差”)抽象为一个通用的架构框架 ,而不局限于特定的注意力机制。换句话说,Transformer 中最重要的并不是 “自注意力(Self-Attention)” 本身,而是「MetaFormer 结构」 。
在这种框架下,“TokenMixer” 可以被替换成任意对 token(即特征)进行混合或交互的操作,包括卷积 、深度可分离卷积 、池化 、注意力 等等。整块结构仍保持 Transformer Block 的输入输出形式和残差连接等设计。
E-RODNet采用了MetaFormer框架中提出的ConvFormer块 ,并针对时空特征建模进行了改进。
ConvFormer的特点:
- 基于深度卷积(Depthwise Convolution)和点卷积(Pointwise Convolution)的Token交互机制,提供了一种轻量化的特征提取方法;
 - 将ConvFormer的卷积操作扩展到三维空间,使用3×7×7大小的3D深度卷积核,能够更好地捕捉时空特征。
 
数学表达式:
分离卷积(SepConv)的操作:

其中:
* Convpw1和 Convpw2 是点卷积;
* Convdw是深度卷积;
* sigmaσ 是激活函数(如ReLU或GELU)。
        最终,ConvFormer块通过残差连接(Residual Connection)和归一化(Normalization)完成特征建模。
下面代码为文章实际使用的堆叠块,通过在编码器解码器结构中堆叠MetaFormerBlock实现特征提取和恢复。
个人理解的代码的主要步骤如下:
(a) self.norm1(x):先对输入 x 做归一化。
(b) self.token_mixer(...):让 token_mixer 对归一化结果做混合 (如卷积/注意力/池化,encode和decode步骤中,可以看到token_mixer的方法是作者前面定义的深度可分离模块sepconv)。
(c) self.drop_path1(...):随机丢弃路径 (在训练时),正则化。
(d) self.layer_scale1(...):用可学习向量缩放该分支。
(e) self.res_scale1(x):对残差的输入 x 也可以有一个缩放。
最后两者相加得到新的 x
 class MetaFormerBlock(nn.Module):
    
     """
    
     Implementation of one MetaFormer block.
    
     """
    
  
    
     def __init__(self, dim,
    
              token_mixer=nn.Identity, mlp=Mlp,
    
              norm_layer=nn.LayerNorm,
    
              drop=0., drop_path=0.,
    
              layer_scale_init_value=None, res_scale_init_value=None
    
              ):
    
     super().__init__()
    
  
    
     self.norm1 = norm_layer(dim)
    
     self.token_mixer = token_mixer(dim=dim, drop=drop)
    
     self.drop_path1 = DropPath(drop_path) if drop_path > 0. else nn.Identity()
    
     self.layer_scale1 = Scale(dim=dim, init_value=layer_scale_init_value) \
    
         if layer_scale_init_value else nn.Identity()
    
     self.res_scale1 = Scale(dim=dim, init_value=res_scale_init_value) \
    
         if res_scale_init_value else nn.Identity()
    
  
    
     self.norm2 = norm_layer(dim)
    
     self.mlp = mlp(dim=dim, drop=drop)
    
     self.drop_path2 = DropPath(drop_path) if drop_path > 0. else nn.Identity()
    
     self.layer_scale2 = Scale(dim=dim, init_value=layer_scale_init_value) \
    
         if layer_scale_init_value else nn.Identity()
    
     self.res_scale2 = Scale(dim=dim, init_value=res_scale_init_value) \
    
         if res_scale_init_value else nn.Identity()
    
  
    
     def forward(self, x):
    
     x = self.res_scale1(x) + \
    
         self.layer_scale1(
    
             self.drop_path1(
    
                 self.token_mixer(self.norm1(x))
    
             )
    
         )
    
     x = self.res_scale2(x) + \
    
         self.layer_scale2(
    
             self.drop_path2(
    
                 self.mlp(self.norm2(x))
    
             )
    
         )
    
     return x
    
    
    
    
    python
    
    

        D. 全局特征融合模块(Global Feature Fusion Module)
目标检测任务与语义分割任务类似,需要为每个像素分配特定的语义类别。在此过程中,引入全局上下文信息可以增强模型对局部模糊区域的理解。
模块设计:
- 对编码器最后一层的输出特征进行局部池化,生成全局特征向量;
 - 使用特征投影层对全局特征进行映射,生成语义丰富的上下文信息;
 - 将全局特征添加到每个像素,提升全局建模能力。
 
与传统方法不同,该模块的全局特征通过投影层增强了语义表达能力,从而显著提升了预测精度。
 class GFF_Module(nn.Module):
    
     def __init__(self, dim=256, kernel_size=(4, 8, 8), expansion_ratio=4):
    
     super().__init__()
    
     self.globalpatch = nn.AvgPool3d(kernel_size=kernel_size, stride=kernel_size, padding=0)
    
     self.proj_layer = nn.Sequential(nn.Linear(dim*expansion_ratio, dim*expansion_ratio//2),
    
                                     nn.LayerNorm(normalized_shape=dim*expansion_ratio//2),
    
                                     nn.Linear(dim*expansion_ratio//2, dim),
    
                                     nn.GELU(),
    
                                     nn.Linear(dim, dim),
    
                                     )
    
     self.catlayer = nn.Sequential(nn.Conv3d(in_channels=dim*2, out_channels=dim, kernel_size=1, stride=1, padding=0),
    
                                   nn.GELU()
    
                                   )
    
  
    
     def forward(self, x):
    
     B, C, T, H, W = x.shape
    
  
    
     x1 = x / x.norm(dim=1, keepdim=True)
    
     x2 = self.globalpatch(x)  # B,256,1,2,2
    
     x2 = rearrange(x2, 'b c d h w-> b (c d h w)')
    
     x2 = self.proj_layer(x2)
    
     x20 = x2 / x2.norm(dim=1, keepdim=True)
    
     x20 = x20.view(B, C, 1, 1, 1).expand(B, C, T, H, W)
    
     x_global = self.catlayer(torch.cat([x1, x20], dim=1))
    
  
    
     return x_global
    
    
    
    
    python
    
    

        E. 下采样与上采样层
下采样层:
使用非重叠平均池化和线性层实现特征的降维。
在每次空间分辨率变化前后添加归一化层,提升训练稳定性。
上采样层:
通过三线性插值对特征进行上采样。
最后一层线性层作为分类器,并结合Sigmoid激活函数生成最终的像素预测。
F. 损失函数
模型使用平滑L1损失函数(Smooth L1 Loss)进行训练:
- 平滑L1损失在误差较小时表现为二次项,在误差较大时表现为线性项,从而减轻了异常值对模型训练的影响。
 
数学表达式:

相比BCEloss,该损失函数对标注噪声具有更强的鲁棒性。
G.结果



