资讯动态

毫米波雷达物体检测算法全解析:从CFAR到深度学习

发布时间:2026/10/14 8:17:45 来源:尧图企业网站定制
很多人一提起自动驾驶感知第一反应就是摄像头和激光雷达。我做了几年毫米波雷达物体检测算法反而觉得这条线最被低估。毫米波雷达最核心的本事是在雨雾、夜间、逆光这种摄像头容易“瞎”的场景里照样测距测速成本又远低于激光雷达。所以不管整车方案怎么变它一直稳稳坐在量产清单里。这篇文章不打算聊雷达硬件怎么选型而是把物体检测算法这条主线完整拆开从传统的恒虚警检测、点云聚类到基于栅格和稀疏卷积的深度学习方法再到多普勒解模糊、目标分类这类雷达特有难点最后聊一聊评估和部署里容易踩的坑。适合正在做感知算法、或者准备从视觉/激光转雷达方向的开发者。1. 毫米波雷达物体检测到底在解决什么问题1.1 从一维距离谱到四维检测空间的直觉理解要理解毫米波雷达物体检测先得丢掉“雷达直接输出点云”的直觉。雷达看世界更像蒙着眼睛听回声发射端持续发送线性调频连续波回波和本振信号混频后得到一个中频信号这个中频里同时藏着距离和速度信息。对中频信号做一次距离维FFT能得到目标在多少个距离单元上再对连续多个chirp做多普勒维FFT又能得到每个距离单元上的多普勒频移也就是径向速度。多根收发天线形成的虚拟阵列再补一次角度FFT就有了方位和俯仰。经过这三步原始数据是“距离-多普勒-角度”三维立方体每个单元代表某个空间位置可能存在的反射能量。毫米波雷达物体检测算法的第一步本质上是在这个立方体里找“哪些点是目标”第二步才是把目标聚成一个个物体。很多刚入门的人直接把最终点云拿来做检测却不知道前端的恒虚警检测、峰值凝聚、角度估计已经决定了后面所有算法的上限。1.2 和视觉、激光雷达的定位差异摄像头能看清颜色和纹理但强光、暗光、雨雾都会让它的置信度剧烈波动。激光雷达点云很密分辨率高可一旦遇到雨雾或者灰尘回波会被大幅衰减而且价格高、对镜片要求苛刻。毫米波雷达工作频段在77GHz附近波长只有几毫米能穿透雨雾和灰尘对光照完全不敏感另一个独特优势是能直接测出目标相对雷达的径向速度这是摄像头需要用多帧图像估算、激光雷达需要用点云帧间匹配来算的东西。这就决定了算法设计的基本盘毫米波雷达适合干“可靠测距测速”和“恶劣天气兜底”但它的点云太稀疏、角度分辨率太低不适合干“精细形状识别”。很多项目里毫米波雷达和视觉做目标级融合毫米波负责远距离探测和速度测量视觉负责颜色、类型、语义分类。雷达物体检测算法如果只输出一个“疑似目标”下游融合就会很痛苦如果输出带类别概率和速度估计的结果融合系统才真的敢用。1.3 毫米波雷达“点云”不是激光雷达那种点云我见过不少做激光雷达算法的同事拿到雷达点云后下意识套用原有模型结果效果很惨。原因很简单激光雷达点云一帧有数万乃至数十万个点分布均匀每点有强度毫米波雷达点云一帧通常只有几十到几百个点稀疏且非均匀目标在远处可能只剩三五个点。更麻烦的是雷达点云里每个点的特征不是一个强度而是距离、径向速度、方位、俯仰、信噪比SNR、RCS等多个维度。还有一类雷达点让人头疼多径反射生成的虚假点。比如车辆旁边的金属护栏会把雷达波反射到路面再反射回来算法看到的是一个“幽灵目标”。雷达点云里的噪点和虚警比激光雷达严重得多。所以雷达物体检测算法必须要做两件事一是从能量图中提取真正有物理意义的反射峰二是从目标层面过滤掉那些不满足运动一致性和几何一致性的虚假检测。这个问题是后面所有章节的核心出发点。2. 传统物体检测算法路线CFAR、角度估计与点云聚类2.1 CFAR检测恒定虚警率背后的取舍先看第一个关键步骤。毫米波雷达接收到的原始热图上目标信号是叠加在噪声和杂波里的。如果用一个固定门限近处强杂波区目标会被噪声淹没远处干净区域又全是虚警。经典做法是恒虚警检测CFAR它根据每个检测单元周围的噪声统计量动态计算门限目标只在自己的局部背景里突出就能被检测到。CFAR里有三个绕不开的参数保护单元、参考单元、目标虚警率。保护单元是为了防止目标能量泄漏到参考窗里抬高门限参考单元决定统计噪声的窗口大小虚警率决定检测阈值的松紧。我常用的CA-CFAR核心思路很简单取参考窗内的噪声均值乘以一个由虚警率和参考单元数决定的缩放因子作为当前单元的门限。import numpy as np def cfar_1d(x, guard4, ref12, pfa1e-4): n len(x) out np.zeros_like(x, dtypebool) for i in range(ref guard, n - ref - guard): left x[i - guard - ref : i - guard] right x[i guard 1 : i guard ref 1] noise np.concatenate([left, right]) scale ref * (pfa ** (-1.0 / ref) - 1.0) out[i] x[i] scale * np.mean(noise) return out实际工程里我不会直接在整幅距离-多普勒图上用单一CFAR参数。不同距离段的杂波特性不同近处道路护栏和路面反射很强远处噪声底又很干净。分段、分距离门设置不同的参考窗和虚警率比试图找到一个“万能参数”靠谱得多。CFAR检测完还会出来很多相邻的峰值需要做峰值凝聚把相邻的几个检测单元合并成一个点否则聚类阶段同一个目标会被切得稀碎。2.2 从到达角估计到点云坐标CFAR给出的是“距离单元-多普勒单元”的位置还没有方位。角度估计靠的是多根天线之间的相位差。多根发射、接收天线组成虚拟阵列后目标从不同方向回来会在不同天线对之间形成线性相位差对相位差做一次FFT或者用数字波束形成扫描一系列角度就能找到能量最大的角度作为目标方位。这个过程计算简单是车规芯片上最常用的方案。角度估计要理解一个物理限制角度分辨率由天线有效孔径和波长决定孔径越大分辨率越高但车规雷达外形尺寸有限不可能像激光雷达那样做很大的阵列。所以毫米波雷达的方位分辨率一般在几度级别远目标横向距离误差会被放大。比如目标在100米外角度误差2度对应的横向偏差差不多3.5米单帧点云根本无法准确框出车身位置。这也是雷达物体检测算法不能只看单帧的原因多帧积累和滤波必不可少。从距离、多普勒、角度到直角坐标还有一个细节容易忽略角度估计的结果通常转换为笛卡尔坐标x、y时默认目标处在雷达视场中心的扫描网格上但角度FFT的点数有限造成角度量化误差。对于近距离目标应该保留未量化的估计值或者用高分辨角度算法做局部细化对于远距离目标角度估计本身已经不够准强行细化意义不大。2.3 点云聚类与航迹关联的实操要点雷达点云稀疏且分布不匀聚类时最常见的错是拿DBSCAN默认参数跑一遍。DBSCAN的距离阈值不能固定近处目标点密集远处目标点离散同一个epsilon在30米内能把一个行人切成好几块在70米外又什么都连不起来。我习惯把距离阈值设计成随目标距离和方位角变化的量甚至在三个维度上使用不同的权重距离维权重小一点速度维权重大一点SNR维做辅助。聚类出来之后有些目标仍然会漏检。雷达点云不是刚体表面而是一块块强反射峰比如一辆车的角反射器、后保险杠、轮毂都可能产生独立反射簇。如果只按空间距离聚类车周围那几个点簇很难并成一个目标。我的做法是先聚类再用运动一致性做合并两个点簇如果速度相差小于1m/s且距离较近就合并且重新估计速度和尺寸。这一步对金属护栏、隧道墙壁这种场景特别关键因为它们经常产生很多分离点簇。传统算法路线的最后一道关是航迹关联。关联时不能只看位置一定要把径向速度纳入匹配代价。毫米波雷达的检测点速递变化很剧烈同一个目标在多普勒维可能有好几个峰直接用位置最近邻容易产生航迹跳变。一个简单有效的方案是最近邻关联加上速度 gating先用位置距离筛选候选再用速度差做二次约束最后用恒速或匀加速模型更新目标状态。这个阶段做扎实了深度学习模型拿到的目标历史帧才是干净、连续的逻辑。3. 深度学习物体检测算法路线从雷达表达到目标框3.1 为什么雷达数据不能简单套用激光模型现在越来越多团队想用深度学习做毫米波雷达物体检测但第一步就很容易走偏直接把稀疏点云塞进为激光雷达设计的网络骨架。激光模型天然假设点云足够稠密、局部几何有意义而雷达点云一帧一个目标可能只有三五个点点之间的几何关系根本无法支撑“学习局部结构”。我见过只用点坐标和RCS特征训练的模型在近距离样本上能看远距离全是漏检。雷达深度学习特征设计的关键是把多普勒、SNR、距离分辨率这些信息显式送给网络而不是只给x、y、z。多普勒维可以区分静止和运动目标SNR可以反映反射强度是否可信RCS的起伏还能帮助区分行人和车辆。不少团队把这类雷达特有特征拼接到点云特征里效果比纯坐标提升非常明显。但也要小心不是特征越多越好部分特征在不同传感器之间差异大需要做归一化和层级消融实验。3.2 基于BEV栅格化与多目标检测工程上最容易落地的深度学习表达是BEV栅格。将雷达点云投影到x-y平面每个栅格里保留多个通道点云数量、最大SNR、平均多普勒速度、速度标准差、RCS均值等。这样原本稀疏的点云被转成一张或多张二维特征图再接一个轻量的卷积网络就能输出目标框、类别和速度。栅格尺寸需要认真权衡。分辨率太细比如0.3米一格远距离栅格几乎全是空的计算浪费分辨率太粗比如1米一格近距离两个车又容易被并成一个目标。我常用0.5到0.75米同时配合多帧累积来解决点太少的问题。多帧累积不是简单地把点都堆进去而是先做运动补偿把历史帧按当前帧的坐标系重新投影否则运动目标会拖出一条速度相关的“影子”。对自动驾驶而言累积5到10帧比较合适太多帧会带来动态目标形状拉长太少帧则补不上点数。BEV方法还有一个小小的改进技巧在栅格特征里显式加入径向速度方向。有些目标在多帧之间位置几乎不变但速度却很大比如横穿马路的行人相对于雷达的径向速度接近零容易被当成静止目标。如果不把多普勒信息传进去网络很可能在动态场景里漏检。3.3 基于稀疏卷积与立体网格的检测方法BEV栅格把雷达点云压到二维损失了高度信息。虽然雷达俯仰分辨率很低但高度仍然能帮助区分立交桥上的车辆和地面目标。一个替代方案是把空间划分成三维体素然后用稀疏卷积只处理有点的体素避免对空体素做无用计算。雷达点云太稀疏全稠密3D卷积差不多是不可接受的稀疏卷积反而是天然匹配的表达。三维体素方案要注意体素尺寸和各维特征对齐。雷达在距离维分辨率很高在方位维很差如果三个方向用相同的体素尺寸会放大角度分辨率的不足。我的经验是距离维可以取0.3到0.5米方位维对应的横向体素尺寸稍微放宽把注意力放在对目标更敏感的距离和速度上。另外在多普勒维单独增加一个“速度通道”让网络可以在x、y、z之外直接回归目标速度比单纯用多帧位置差算速度更稳。3.4 距离-多普勒谱上的检测与候选分类除了转成点云或栅格还有一种路线是在距离-多普勒图上直接做语义检测。在二维RDM图上一个运动目标会表现为一个具有特定速度展宽的亮斑行人因为肢体摆动速度展宽明显车辆速度展宽窄、能量集中。直接用卷积网络对RDM图做目标候选预测再把这些候选映射到笛卡尔坐标在资源受限的嵌入式平台上有价值因为输入是一个二维热图计算量比点云网络更可控。这种方法的挑战是把RDM检测结果映射回物理空间时会遇到同一个目标在不同距离单元出现多次以及多径造成的虚假亮斑。工程上我不建议只依赖RDM分支而是把它当“候选提款机”RDM网络速度快负责说“这里有东西”点云聚类负责给出“这个东西在哪、什么速度”再融合分类网络判断“这是车、人还是干扰”。多分支配合比单模型硬扛要稳。4. 雷达算法绕不开的三个硬骨头多普勒、速度模糊与目标分类4.1 多普勒速度是雷达独有的优势深度学习和视觉算法经常把目标速度当作位置的差分误差大且滞后明显。毫米波雷达每个检测点都自带相对雷达的径向速度利用这个信息可以大幅提高检测和跟踪质量。最直接的用法是区分静止杂波和运动目标路边的铁皮、护栏、静止车辆都是固定的它们在雷达坐标系里的多普勒速度会随着本车运动形成规律分布如果本车速度和航向已经知道就能把“多普勒速度与预测不符”的点标成可疑目标。多普勒速度还能辅助目标匹配和航迹关联。同一时刻N个目标的径向速度差异通常比位置差异更稳定用速度做第一级gating可以挡住很大一部分误关联。我遇到过不少“位置很近但速度不同”的目标场景比如高速上相邻车道车辆和隔离带上的静止护栏如果只用距离聚类很容易把护栏点和车辆点粘在一起引入速度一致性后聚类和关联都干净很多。4.2 速度模糊的产生与两种解模糊策略多普勒测速不是无限量程的。雷达发射chirp的速度受雷达波形重复频率限制超过最大不模糊速度的目标多普勒频率会折叠速度看起来突然变成另一个值。举一个直觉例子一个以80km/h远离雷达的目标可能被报成30km/h朝向雷达这在碰撞预警里是致命的。工程上有两种常见解模糊思路。一种是提高chirp重复频率直接扩展最大不模糊速度但代价是最大探测距离下降另一种是使用两套不同的chirp周期交替发送同一个目标在两组数据里会产生不同的模糊速度通过组合数论关系恢复真实速度。第二种方案对波形设计和处理链路要求更高但更符合同时兼顾远距离和高速场景的需求。做算法的人至少要做到在雷达点云生成时保留解模糊后的速度并在输出目标状态时不直接放过“一个速度明显可疑”的检测结果用航迹一致性来兜底。4.3 目标分类微多普勒、点云结构与上下文毫米波雷达分类是一个“看细节”的活。行人不是刚体手臂和腿来回摆动雷达回波里会出现明显的微多普勒调制反映在速度维上就是速度扩展大、多个多普勒峰同时存在车辆是刚体反射点多集中在车尾或车侧速度扩展小但RCS会随车身姿态变化骑行者则有车轮旋转带来的周期性多普勒边带点云分布介于行人和车辆之间。传统分类方法可以统计点云速度标准差、点数、尺寸、RCS均值再放进随机森林或支持向量机。深度学习方法则可以把点云特征和多普勒频谱特征一起输给一个小型分类网络。这里一定要说雷达分类输出概率比输出硬标签重要得多。毫米波雷达在远距离、低分辨率条件下本来就容易混淆目标级融合需要的是一个“有点像行人也有点像自行车”的后验概率而不是一个拍死的类别。点云结构和上下文也能辅助分类。同样一个点簇出现在车道中间大概率是车辆出现在人行道旁边大概率是行人目标多帧的速度变化模式也在透露出身。我在实际项目里会把目标历史帧的横向速度概率分布当作一个特征拼进分类器虽然听起来很“传统”但对识别横穿马路的行人有奇效。5. 工程落地中的评估、数据、调参和部署5.1 评测指标怎么定才不会自欺欺人很多团队评估雷达检测算法只看一个mAP或者召回率我觉得远远不够。首先要有目标的匹配规则不能单纯按3D IoU匹配因为雷达点云稀疏计算的包围盒尺寸充满了不确定性。一种更稳的匹配策略是联合位置距离和速度差比如目标中心距离小于2米同时径向速度差小于2m/s才认为是同一目标。其次要看关键误差分布而不是只看平均值。距离误差的95%分位比均值更有参考价值速度误差同样要看有没有长尾异常。雷达误检也是一个重要指标一辆车在高速上每小时出现几次“幽灵碰撞预警”直接决定这个算法能不能量产。我建议评估时专门拆出三种场景高速直线、城区多径、隧道/车库金属环境分开看指标因为它们的失败模式完全不同。5.2 数据标注与数据增强实战雷达点云无法像图像一样直观看出“这是行人”标注很考验经验。常见做法是借助摄像头或激光雷达做辅助标注但它不是简单把视觉框投影过去标注规范里必须写明“雷达点云必须给出至少一个有效反射点支持”否则视觉目标遮挡或距离过远时雷达根本没信号强行标注反而污染训练标签。好的标签应该包含目标类别、目标框、真实速度、遮挡状态和点云质量等级。数据增强是雷达深度学习里最容易立功也最容易做坏的地方。常见增强包括随机丢弃点云模拟密集多径下的漏检对多普勒速度加入随机偏移模拟解模糊偏差插入一些随机噪点模拟护栏和井盖反射。有一点要注意雷达点的速度不是任意加的它必须和目标真实运动以及自车运动近似一致否则网络学到的是“速度维是乱的”部署时会更不稳定。5.3 车规级部署中的几条经验最后聊一聊部署。雷达的原始数据率很高但对实时性要求又极其苛刻。我现在的习惯是把整个链路分成三层DSP上跑CFAR、脉冲凝聚和角度估计NPU上跑目标候选和分类网络CPU上做多帧聚类、航迹关联和逻辑过滤。不要试图把所有模块塞进同一个芯片否则某一层卡顿会拖垮整个感知帧。常见问题还包括CFAR阈值在不同温度下会有漂移长时间运行后噪声底变化虚警率会增加雷达天线相位标定一旦有偏差远处的目标位置会整体偏移这个问题在深度模型里更难发现。调试时我有一个几乎不变的习惯先看中间热图不要只看最终框。如果在距离-多普勒图上明明有能量最终框却丢了那是聚类和网络的问题如果热图上根本没有能量那就是CFAR和前端配置的问题。还有一个容易被忽略的经验一定要建立影子日志系统。实时跑的时候把“雷达检出但融合输出丢失”和“融合输出有目标但雷达没有对应检测”的两类case全部录下来定期拉到本地做离线分析。很多上线后的漏检、误报问题靠现场几千公里的路测根本看不完只有这种数据闭环才能让算法持续变好。最后说一条我反复强调的经验不要急着把传统CFAR和聚类全部替换成端到端深度学习。雷达的前端检测质量决定深度学习模型的上限而深度学习负责把雷达点云变成对下游更友好的目标表达。先花时间把热图、点云、聚类结果看明白再谈模型调参。雷达物体检测这个领域大部分问题不是模型能力不够而是你和数据之间还隔着几层没看透的中间表示。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑