1. 从"测距测速"到"认人认物":毫米波雷达目标分类的工程动机
1.1 传统雷达的看家本领与它的天花板
毫米波雷达进入大众视野,靠的是自动驾驶和智能家居,但它的基本功其实很朴素:测距、测速、测角。以常用的FMCW体制为例,发射频率随时间线性变化的扫频信号,回波与发射信号混频后得到一个中频信号。这个中频信号的频率正比于目标距离;同一目标在相邻多个chirp之间产生相位变化,做一次FFT就能解出多普勒频移,换算成径向速度。整套处理流程成熟、稳定、成本低,一颗77GHz雷达芯片加上外围电路,就能在雨雪雾天气稳定输出"前方50米有一个目标,径向速度3m/s,方位角-5度"这类信息。
但真正做系统集成的人会很快碰到一个尴尬问题:雷达告诉我"前方50米有一个物体",却没说那是行人、是骑自行车的人、是轿车,还是路边的金属护栏。AEB(自动紧急制动)把护栏当成行人来个急刹车,体验灾难;把横穿马路的行人当成静止物放过,直接出事故。所以目标分类在毫米波雷达的感知链路里不是锦上添花,而是决定功能能不能可靠落地的刚需。
传统雷达分类手段不是没有。RCS(雷达散射截面)能粗分大小目标,但行人、两轮车、小轿车的RCS在不少角度下有重叠区间,靠单个阈值根本分不开;微多普勒特征能分辨行人步态的周期性摆动,可它需要足够长的观测时间,还得手工设计特征、调参,一轮工程下来周期很长。说白了,传统雷达擅长的是"有没有目标、多快多远",目标识别从来不是它的舒适区。
1.2 神经网络补上的是哪一块拼图
神经网络的强项恰好是雷达最弱的部分:非线性特征映射。它不用人手工去定义"行人步态频率是多少、两轮车的微多普勒谱长什么样",而是从大量标注数据里自己学出一组表征,再把表征映射到类别标签。
对雷达感知来说,网络可用的输入形态大致分三类:
- 距离-多普勒谱(RD谱):二维复数幅度矩阵,像一张灰度图,每个像素代表某个距离、某个速度上的回波能量;
- 点云:稀疏的多个目标点,每个点携带距离、径向速度、方位角、俯仰角、RCS等属性;
- 原始ADC数据或距离-方位热力图:更靠近底层,数据量大,一般在端侧很少直接使用。
输入形态不同,网络结构完全不同,部署时的计算量、内存占用、延迟也不同。这篇文章就沿着这条链路往下拆:每级数据是怎么来的、网络为什么这么选、以及实测里会遇到哪些只有做过才知道的坑。适合正在做雷达感知算法、准备把AI模型搬上嵌入式平台、或者刚接触车辆感知与物联网方向的开发者阅读。看完你应该能回答三个问题:数据从天线到网络输入之间发生了什么?PointNet、CNN这类结构分别在处理什么?模型一上真机性能为什么就掉了。
2. 从chirp到训练张量:雷达数据链路逐级拆解
2.1 一帧数据的诞生:距离维FFT与多普勒维FFT
要理解神经网络输入,得先把雷达数据组织方式说清楚。一帧数据通常由多个chirp组成,每个chirp内又有多个ADC采样点。举个例子,某77GHz雷达配置为:带宽B=1GHz,每个chirp采样N=256点,一帧M=128个chirp,那么原始数据就是一个256行乘128列的复数矩阵。
处理的第一步是对每一行做距离维FFT。为什么?因为FMCW雷达经过混频后,目标距离直接反映在中频频率上,FFT就是把时域信号变到频域,做完之后横轴每个bin对应一个距离门。距离分辨率有明确公式:
[ \Delta R = \frac{c}{2B} ]
带宽1GHz时,(\Delta R \approx 0.15m),也就是每个距离bin约15厘米。
第二步是对每一列做多普勒维FFT。距离维FFT做完之后,同一个距离门内跨多个chirp的相位变化对应目标径向速度,再做一次128点FFT,就得到该距离门内不同速度分量的能量分布。速度分辨率和帧时长相关,典型值在0.2m/s到1m/s量级。
两次FFT做完,得到的就是RD谱矩阵。画成热力图,横轴距离、纵轴速度、颜色深浅代表回波强度。这是雷达领域最经典的"图像"。这里必须强调一点:RD谱不是照片。照片像素的语义是颜色、亮度、边缘,RD谱每个bin是距离和速度的分辨单元,一个行人在RD谱上可能只占两三个bin,远没有视觉图像里那么"大"。网络处理的并不是宏观形状,而是能量分布的模式。
2.2 点云怎么来:CFAR检测加聚类
工程上,点云比RD谱更常用,因为点云数据量小、便于和下游跟踪模块对接。标准流程是先在RD谱(或距离-方位-多普勒三维谱)上做CFAR检测。CFAR的全称是恒虚警率检测,核心思想很简单:把每个bin的幅度和它周围一片区域(保护单元+参考单元)的杂波功率做比较,如果高出设定的倍数,就判定这里有目标。CFAR有两个关键参数:
- 参考窗口大小:窗口太大,邻近目标会互相抬高底噪,导致漏检;窗口太小,杂波统计不稳定,虚警多;
- 虚警率Pfa:决定了检测门限的严格程度,Pfa设得低,门限高,点云稀疏但干净;设得高,点云密集但容易出一堆杂点。
检测出来的过门限bin,还要做聚类。工业上常用DBSCAN,因为它不需要预设簇数量,能把任意密度的点按距离和速度聚成一坨,然后对每个簇提取质心、平均RCS、多普勒速度等属性,输出一个点云目标。
点云路线的优势是下游处理直接、跟踪友好。劣势是稀疏,一个行人往往只有十几个反射点,信息密度远低于RD谱。很多做视觉的人第一次看雷达点云,都会觉得"这也太少了"。实际选型时我的经验是:近场短帧、算力紧张,优先走点云方案;远场早期检测、需要尽量提前发现小目标,RD谱方案更适合。两条路线对应不同的网络结构,下一节单独讲。
2.3 预处理与标注:最容易被低估的环节
数据从雷达端下来,不能直接丢给网络。有几个预处理细节经常被忽视,而它们恰恰是模型效果的分水岭。
第一是幅度动态范围。RD谱或者点云的RCS属性动态范围极大,近距离金属目标的回波可能比远处行人强三个数量级以上。网络看到这种大动态输入,loss容易被大值样本带偏。常见做法是取对数压缩,比如对RD谱幅度做(10\log_{10}(\cdot)),把几千倍的能量差压成几十dB的差异,再做标准化。
第二是多普勒符号。径向速度有正有负,目标朝向雷达和远离雷达在RD谱上会落在不同半区,多普勒符号本身蕴含运动方向信息,预处理时别随手取绝对值,否则等于人为丢掉一半信息。
第三是标签标注。点云标注的难度远超图像标注。图像上画个框,人眼一看就知道哪个行人对应那坨像素;雷达点云上,同一个行人的反射点可能散落在好几个聚类簇里,分辨起来非常费劲。如果只有雷达数据,我建议做目标级标注(这一簇点属于行人、车、自行车),而不是逐点语义分割标注。逐点标注的效率和一致性都差到没法工程化。
注意:RD谱方案打标签的工作量远大于点云方案。一帧RD谱里,同一个行人的能量可能跨越多个距离bin和速度bin,边界模糊,不同标注员标准不一致。建议先通过点云聚类生成候选框,再投影回RD谱位置辅助标注,能省不少力气。
3. 网络结构选型:不同数据形态对应不同模型
3.1 点云方案:PointNet及其变体为什么适合雷达
点云是一堆无序的点集,每个点有坐标和属性。处理无序点集,传统CNN直接不适用——你没法把稀疏点云整齐地排成图像网格。PointNet的思路很巧妙:对每个点独立做多层感知机(MLP),把每个点映射成高维特征,再用最大池化聚合所有点的特征,得到整个点云集的全局特征,最后接全连接层分类。
为什么最大池化有效?因为最大池化对点的顺序不敏感,天然满足点云的无序性;同时它保留了"最强响应"的特征维度,相当于网络学会了关注点集中最有区分度的那几个点。这恰好符合雷达点云的特性:目标类别往往由少数强反射点决定,比如自行车的车架角反射器、汽车尾部的平面反射。
PointNet的升级版PointNet++引入了局部区域的特征提取,先按距离分区域,再在区域内做PointNet,最后聚合。雷达点云中,局部点的空间分布模式(行人点云从上到下呈竖向分布,轿车点云呈横向扁平分布)对分类很有帮助,PointNet++通常比原始PointNet效果更好。
实际落地时要注意:雷达点云的信噪比远低于激光雷达,存在大量杂波点、旁瓣点。PointNet的全局池化对离群杂点不够鲁棒,输入前最好先把轻微杂波过滤掉,否则模型会学到"用杂波特征分类"这种假规律。另外,算力紧张时可以把点的属性压缩成距离、速度、RCS三个维度,减少MLP输入宽度,实测分类精度损失很小。
3.2 RD谱方案:CNN的处理逻辑
RD谱本质是二维矩阵,可以直接喂给卷积神经网络。CNN的卷积核在局部窗口内提取模式,然后逐层扩大感受野,这和RD谱的物理结构匹配:低层卷积看的是"局部距离-速度单元上的能量突起",高层卷积把多个突起组合成"目标整体的速度能量分布模式"。
一个典型的小型CNN处理RD谱的流程是:输入1通道或2通道(幅度+相位)的RD矩阵,经过3到5层卷积加池化,接着全局平均池化,输出分类概率。卷积核选择上,3x3小核足够,因为RD谱的局部模式尺度不大;不要一上来就上大核,参数多且容易过拟合。
值得注意的一点是RD谱的"目标姿态"信息很弱。视觉图像里行人有明确的轮廓和姿态,RD谱里行人和骑车人的区别更多体现在能量分布范围、多普勒宽度、速度-距离耦合模式上。所以RD谱分类网络的任务不是"看形状",而是"看能量分布统计特征"。设计网络时不需要追求很深的骨干网络,ResNet-18级别已经严重溢出,反而轻量的三到五层卷积更容易训练、更好部署。
如果雷达支持多输入天线,还可以把距离-方位-多普勒三维数据当作多通道输入,通道数等于方位维的FFT点数。这种三维输入能保留方位信息,对小目标分类有帮助,但计算量翻倍,端侧部署要仔细评估。
3.3 时序信息与微多普勒:把时间维度加进来
单帧RD谱或点云做分类,遇到一个场景会露怯:远处一个行人和一个慢速骑车人的单帧能量分布可能非常接近。解决思路是引入时间维度。
行人在行走时,四肢摆动会产生速度方向周期变化的微多普勒调制,在RD谱上表现为围绕主体多普勒的旁瓣波动;车辆则相对稳定。这类时序特征用单帧网络学不到,需要用循环结构或时间卷积处理连续多帧。
工程上最实用的做法不是上LSTM,而是把连续8到16帧的RD谱在帧维叠起来,当作一个三维输入,用3D卷积或2D卷积加时间注意力处理。延迟可以接受,因为雷达帧率通常二三十赫兹,16帧也就不到一秒。点云时序方案则常用PointNet提取单帧特征后接LSTM或Transformer编码器。
我的建议是:能先用多帧堆叠解决的事,就不要急着上Transformer。Transformer对雷达时序数据的收益主要在长序列,而雷达目标分类需要实时性,帧序列普遍很短,传统循环结构或时间卷积更稳、更容易在嵌入式芯片上跑。
3.4 算力约束下的轻量化选择
车载雷达的端侧芯片算力普遍有限。通用芯片上跑一个ResNet-18轻轻松松,但在车规MCU或低功耗DSP上,每毫秒的算力都是预算。轻量化的实践经验可以总结成几条:
- 用深度可分离卷积替代标准卷积,参数量和计算量能降到原来的十分之一左右,精度损失通常小于2个百分点;
- 点云方案中,限制每个目标簇的输入点数,比如统一采样到64点或128点,既控制计算量又避免点数不均衡带来的训练问题;
- RD谱方案中,可以先对RD谱做尺寸裁剪,只保留目标所在的距离-速度区域(region of interest),把全图256x128的输入降级成64x32,网络计算量直接差四倍。
真实项目里,我见过用两三百K参数量的轻量网络,在点云三分类任务上达到95%以上准确率的案例。神经网络不是越深越好,雷达数据的特征维度比图像低得多,小模型往往更稳。
4. 训练细节:数据增强、类别不均衡与模型校准
4.1 数据增强与仿真数据:雷达数据集太小怎么办
雷达数据集的获取成本比图像高一个数量级。图像可以随便拍,雷达数据需要专门设备、专门场景、精确标注,想凑够几万帧带标注的RD谱要花大量时间。两个方向缓解这个问题。
第一个方向是传统数据增强。RD谱上可以做平移(模拟目标距离和速度偏移)、加高斯噪声(模拟底噪波动)、轻微尺度缩放(模拟RCS起伏)、随机遮挡(模拟部分反射点丢失)。点云上可以做随机采样、点丢、加噪、局部抖动。这类增强配合在线增强,实测能把数据规模等效扩大十倍以上。
第二个方向是仿真数据。用射线追踪或电磁仿真软件,构建虚拟场景的雷达回波,批量生成带完美标签的RD谱和点云。仿真和实测之间存在domain gap,直接拿来训练,真机上掉点严重。常见做法是:先仿真数据预训练,再用一小部分实测数据微调;或者用无监督域适应方法对齐分布。
值得提醒的是,仿真数据容易引入"过度完美"的问题。真实雷达有各种非线性失真、天线串扰、多径反射,仿真里往往被建模得很干净,模型学到干净的规律,遇到真机杂波就不行了。不要指望纯仿真能解决所有数据问题,该做的实测数据采集还是得做。
4.2 类别不均衡与难例挖掘
雷达目标分类的类别分布天然不均衡。自动驾驶场景里,车辆出现频率远高于行人,更高于动物、锥桶、婴儿车。如果用原始分布直接训练,网络倾向于把所有目标都预测成车辆,因为整体准确率照样高。
常用的处理手段:
- 重采样:对少数类别过采样,对多数类别欠采样,让每类样本量大致齐平;
- 加权损失:在交叉熵损失里给少数类别更高权重;
- Focal Loss:让网络把注意力集中在难分类的样本上,自动降低已学好类别的权重。
还有一个容易被忽视的点:难例挖掘。雷达分类的难例往往不是那种特征模糊的中间态,而是形态奇特的罕见状态,比如行人推着购物车、骑行者旁边站着另一个人、卡车尾部挂了一排三角警示牌。这些情况单靠损失函数调权重解决不了,需要在采集中刻意规划覆盖这些场景。
实战中我建议关注的不只是准确率,而是每个类别的召回率。AEB场景里,把行人分成车是致命错误;但把车分成行人导致频繁误刹车,同样让人无法接受。类别的"代价"不同,阈值的调法就不同。
4.3 置信度校准与阈值选择
网络输出的softmax概率不是真实概率,这是很多人踩过的坑。由于数据不均衡和数据增强的存在,模型的置信度分布经常偏高或者偏扭曲。部署时直接拿0.5当阈值,往往会出现"很自信地分错"。
置信度校准的简单做法是温度缩放:在训练完的模型上,对logit除以一个温度系数T,让预测概率分布的形状更接近真实正确率。T的选择用验证集上最小化预期校准误差(ECE)来搜索,通常T在1到2之间。如果发现模型对某些类普遍过度自信,T会明显大于1。
更工程化的做法是不要只看最后的类别概率,而是同时利用多帧的预测做时序平滑。雷达一帧的预测可能抖,但十帧连续预测同一类别,置信度就高很多。部署时可以把连续N帧分类结果做投票或指数滑动平均,能显著降低单帧偶发误判的影响。
5. 实测中的坑:毫米波雷达分类的典型失败模式
5.1 多径、旁瓣与贴片噪声
雷达实测数据和理论数据之间隔着一道巨大的鸿沟,多径反射是最常见的坑。目标反射的电磁波经过地面、护栏、车辆侧面等二次反射,会形成虚假回波。在RD谱上表现为目标真实位置之外的额外能量团,在点云上表现为脱离主目标的散点。这些虚假目标如果落进分类网络输入里,模型很容易被带偏。
旁瓣是另一个问题。距离维FFT本身会有旁瓣,强目标旁瓣可能掩盖邻近的弱目标;多普勒维也存在类似现象。CFAR能过滤一部分,但强目标附近的旁瓣bin常常过门限,被当作独立目标送进网络。
处理经验有三条:输入网络前,利用目标邻域一致性做一次空间滤波,剔除与主簇距离过远的孤立点;训练数据里,对RD谱做旁瓣模拟增强(人为加小旁瓣突起),让网络学会忽视这类模式;真机上设置一个最小RCS门限,把金属护栏这类强反射体的电磁噪声挡在检测之外,避免杂波样本大量混入。
这些工程细节没法靠换更好的网络结构解决。有些团队把模型从PointNet换到更复杂的结构,准确率涨不上去,原因往往是数据链路里的脏东西没清理,模型学到的是"脏东西的模式"而不是目标本身的特征。
5.2 跨场景泛化:同一个模型换个场地就失灵
雷达数据对场景变化非常敏感。训练时在某园区采集的模型,拿到新城市、新停车场、不同路面、不同天气,准确率可能直接掉十个百分点以上。物理原因是多方面的:不同路面材质反射特性差异、不同建筑群产生的多径模式差异、雨雪衰减对距离边界的影响、天线视角不同导致的RCS起伏。
域泛化是雷达分类里最棘手的工程问题之一。缓解手段我按性价比排序:
- 多场景采集是最笨但最有效的方案。训练数据覆盖不同城市、不同天气、不同时段、不同车位布局,泛化问题能解决大半;
- 域随机化增强:训练时让距离偏移、多普勒偏移、噪声水平在更大范围内随机,相当于模拟各种传感器安装差异,能提升跨设备稳定性;
- 模型层面做特征归一化,减少对场景统计量的依赖。
实测里,跨设备(同型号不同一颗雷达)导致的性能波动也要重视。雷达前端增益、噪声系数、天线装配差异都会让同一型号设备的数据分布略有不同。在线自适应校准(用小样本估计当前设备数据分布并调整归一化参数)能缓解一大部分,但复杂度高,我在小规模项目中通常先用多设备混训来扛。
5.3 功耗、帧率与延迟约束下的部署限制
分类模型只是感知链路的一环,前面有CFAR、聚类,后面有跟踪、决策,留给分类的延迟预算往往只有十几毫秒。这意味着每帧数据只能过一遍网络,没有时间做复杂的多帧推理或模型集成。
功耗约束更直接。车载雷达芯片的功耗预算通常只有几瓦,还要和通信、控制功能共享算力。模型要么跑在专用NPU上,要么跑在MCU上。部署时通常要做INT8量化,精度损失一般可以控制在1到2个百分点以内。但雷达数据的动态范围大,量化时要特别注意RD谱幅度的分布:如果直接按最大最小值线性映射到INT8,低幅度区域的表示精度会严重不足。建议在量化前先取对数压缩幅度,再按分布均匀映射。
端侧还有一类特殊问题:模型推理的确定性。同一帧数据在同一硬件上跑两次,由于并行计算或缓存的原因,结果可能轻微不同。对分类影响不大,但对后续的时序平滑和决策会产生细微扰动。如果项目要求严格确定性,部署时建议固定线程数、关闭部分CPU并行优化,或用定点推理保证一致性。
6. 评估指标与上线前验证:不能只看准确率
雷达目标分类的评估,和图像分类有一个重大区别:图像分类的类别是互斥且明确的,雷达分类的边界天然模糊。一个推着自行车的行人,到底算行人还是自行车?一个打着转向灯停在路边的车,算静止目标还是动态目标?这些模糊边界如果不事先定义好,评估结果就完全不可比。
评估指标方面,准确率是必要的但不是充分的。我习惯用混淆矩阵加各类别精确率、召回率、F1一起来看。行人、骑车人、汽车三分类里,最关心的往往是行人和骑车人的区分边界,以及行人被误判成静止物的漏警率。
评估数据集的构建也别偷懒。把同一个场地同一时段的数据切一部分当验证集,模型过拟合风险非常大,准确率虚高得可怕。至少要保证评估集来自不同时段、不同场地,最好来自不同设备,才能真正反映上线后的状态。
上线前还建议做一次"失效模式分析":把测试集里所有的误分类样本人工过一遍,整理成几大类——远距离弱小目标、强杂波环境、遮挡后部分反射、速度模糊区域。很多小概率但致命的问题,比如"行人被护栏旁瓣掩盖导致漏检",只会在这种整理里暴露出来,而不是在平均指标里体现。
总体来说,毫米波雷达加上神经网络做目标分类,技术路径并不神秘,核心还是数据链路、网络选型和工程调优三件事。我在实际项目中体会最深的一点是:模型结构带来的提升是边际的,真正拉开差距的往往是数据质量、预处理细节和部署时的调试耐心。每次模型指标不对,先别急着换网络,把RD谱可视化打开,看看输入里到底进了什么东西,答案通常就写在数据里。