
1. 被不变性带偏的雷达点云检测做激光雷达点云目标检测的朋友大概率都经历过这样一个阶段疯狂追求模型对旋转、平移、尺度变化的不变性。旋转不变、平移不变、置换不变听起来特别优雅仿佛只要把这些不变性做足了模型就能稳如老狗。我早期也这么想甚至一度把不变性越强泛化越好当成信条。直到我在实际项目里反复被一个现象打脸——模型对目标的位置和类别判断都还行但一到框的方向上就开始飘尤其是长条形目标车辆、卡车、公交车预测出来的框经常横过来或者转个九十度IoU 直接掉一大截。这个现象背后其实藏着一个很反直觉的结论在雷达点云目标检测里不变性不是越强越好方向线索对框预测的价值被严重低估了。换句话说你费尽心思把方向信息抹平掉换来的所谓鲁棒性很可能是在牺牲框回归最需要的那部分信息。这篇博文就想把这件事掰开揉碎讲清楚为什么方向线索值钱、不变性做过头会出什么问题、以及在工程上到底该怎么平衡这两者。先明确一下讨论范围。这里说的雷达点云主要指机械式或固态激光雷达采集的三维点云目标检测任务是在三维空间里输出带朝向的边界框3D bounding box典型输出是(x, y, z, l, w, h, heading)。关键词里的不变性指的是模型对输入变换的等变性/不变性设计方向线索指的是点云中隐含的朝向信息比如点的分布朝向、表面法向、局部几何走向框预测就是最终的 3D 框回归。适合谁看做自动驾驶感知、机器人三维感知、点云算法落地的工程师和研究生尤其是正在被 heading 预测折磨的那批人。2. 不变性到底在不变什么为什么它会被滥用2.1 从二维图像检测的思维惯性说起很多人做点云检测时脑子里装的还是二维图像检测那套逻辑。在图像里我们希望模型对目标的位置、大小有一定容忍度卷积本身带来的平移等变性帮了大忙。到了点云大家自然想复制这个思路既然点云是无序的、旋转一下还是同一个物体那就设计一个对旋转、平移都不敏感的骨干网络让特征提取稳下来。这个出发点没错但问题在于**对什么不变和在哪个阶段不变是两码事**。图像里的平移等变性是卷积结构天然给的它不破坏语义而点云里如果你强行让特征对朝向不变你其实是在把这个物体朝哪边这个信息从特征里删掉了。可框预测偏偏需要这个信息。这就好比你为了让人脸识别不受光照影响把颜色通道全扔了结果连肤色都判断不了——鲁棒性是上去了但有用的判别信息也没了。2.2 旋转不变性的三种常见做法及其代价工程里追求旋转不变常见有三条路子我逐个说说代价。第一条是数据层面的旋转增强。训练时随机把整个场景绕 Z 轴转一个角度让模型见过各种朝向。这个做法本身没问题是标配。但注意它带来的是模型见过更多朝向而不是模型对朝向不敏感。这两者天差地别。前者是让模型学会处理朝向后者是让模型放弃朝向。第二条是特征层面的旋转不变算子。比如用相对角度、距离直方图、或者把局部邻域按某种规范对齐后再提特征。这类方法在分类任务上很香因为分类确实不需要知道物体朝哪。但一旦用到检测的框回归分支就会出问题你把局部坐标系规范化了heading 的绝对参考系就丢了回归头只能靠全局上下文去猜朝向精度自然打折。第三条是把 heading 预测离散化成分类。这是目前很多检测器包括一些经典的单阶段方法的做法把 360 度分成若干个 bin让网络分类落到哪个 bin再回归一个残差。这个做法缓解了回归的连续性难题但它本质上还是在用不变性换稳定——bin 的划分引入了量化误差边界处的样本特别容易翻车。2.3 一个具体的翻车场景我拿一个真实调过的场景举例。某次做城市道路的车辆检测骨干用了带旋转不变设计的结构分类分支 mAP 很漂亮但 heading 误差在长车卡车、公交上明显偏大。可视化之后发现模型对车头朝前还是朝后经常搞反180 度翻转的比例不低。原因就是旋转不变特征把前后方向的信息压掉了而车辆前后其实是不对称的车头有引擎盖、车尾有后备箱点云分布不一样这个不对称恰恰是判断朝向的关键线索被我们亲手抹掉了。提示判断一个不变性设计是否值得先问一句——它抹掉的信息下游任务需不需要如果下游是框回归朝向信息大概率是需要的。3. 方向线索藏在点云的哪些角落既然方向线索值钱那它到底藏在哪我把实际能用的方向线索归了几类每一类都对应着可提取的几何或统计特征。3.1 局部表面法向与几何走向点云是物体表面的采样表面法向天然携带朝向信息。比如一辆车车顶法向朝上侧面法向朝左右车头前脸的法向朝前。如果你能稳定估计局部法向用 PCA 对邻域拟合平面最小特征值对应的特征向量就是法向那么法向的分布就能反映物体的朝向。工程上常用的是把邻域协方差矩阵的特征值组合成特征线性度、平面度、散射度这些量对朝向是敏感的不该被不变掉。3.2 点分布的朝向性各向异性长条形目标的点云在长轴方向上的延展明显大于短轴这个各向异性就是朝向线索。对邻域做 PCA最大特征值对应的特征向量方向就是局部的主走向。把一堆局部主走向聚合起来就能估计整体 heading。这也是为什么很多方法会用朝向敏感的卷积或者方向卷积来提特征——它们刻意保留方向信息而不是抹平。3.3 强度与密度的前后差异激光雷达的反射强度跟材质、入射角有关。车头的格栅、车灯的反射特性跟车尾不一样密度分布也不一样。这些细微差异在旋转不变特征里会被平均掉但在方向敏感的特征里能被保留。我实测过把强度通道单独喂给一个方向敏感的支路对解决 180 度翻转问题有肉眼可见的帮助。3.4 全局参考系与局部参考系的取舍这里有个关键设计决策heading 是相对全局坐标系比如车体坐标系定义的还是相对某个局部参考系如果你在局部参考系里做不变性那回归出来的 heading 还得转回全局转换过程会引入误差累积。我的经验是朝向回归最好在接近全局的参考系里做局部不变性只用在特征提取的浅层深层和回归头要保留全局方向感。方向线索类型提取方式对 heading 的价值是否容易被不变性抹掉表面法向邻域 PCA 拟合平面高是点分布各向异性邻域协方差特征值高是强度前后差异强度通道统计中是局部主走向特征向量聚合高是全局位置绝对坐标中辅助否4. 框预测为什么对方向线索如此敏感4.1 heading 回归的连续性难题3D 框的 heading 是一个角度角度这东西有个天然的坑0 度和 360 度是同一个方向但数值上差了 360。如果你直接回归一个角度值网络在 359 度和 1 度之间会看到巨大的数值跳变梯度就炸了。这就是为什么大家要么用 sin/cos 双通道回归把角度映射到单位圆上消除跳变要么用 bin 分类加残差。但不管哪种方式前提都是特征里得有方向信息。你用 sin/cos 回归特征里没有方向感网络照样学不出来你用 bin 分类特征被抹平了bin 的分类边界照样糊。所以方向线索不是锦上添花是框预测的地基。4.2 IoU 对 heading 误差的放大效应3D IoU 对 heading 误差极其敏感尤其是长宽比大的目标。我做过一个粗略的估算对于一辆长 4.5 米、宽 1.8 米的车heading 误差 10 度时3D IoU 大概还能维持在 0.7 以上误差到 30 度IoU 掉到 0.5 左右一旦到 90 度横过来IoU 直接掉到 0.2 以下基本等于没检测到。而同样 10 度的误差对一个接近正方形的目标比如行人IoU 影响就小得多。这就是为什么长条形目标对方向线索的需求最迫切。4.3 分类与回归对方向信息的需求差异这里要区分清楚分类分支其实不太需要方向信息它只要知道这是车就行车朝哪边不影响它是车。但回归分支极度需要方向信息因为框的朝向是回归目标的一部分。很多不变性设计是一刀切地作用在整个骨干上结果就是分类受益、回归受害。正确的做法应该是让不变性和方向敏感性在不同分支、不同层级上有区分。注意如果你发现分类指标很好但回归指标尤其是 heading很差八成是骨干把方向信息抹得太狠了先别急着调回归损失回头看看特征提取。5. 工程上怎么平衡不变性与方向敏感性5.1 分层设计浅层不变深层保方向我的实践结论是浅层特征可以适度追求不变性用来做局部几何的稳定描述深层特征和回归头要保留甚至强化方向敏感性。浅层面对的是原始点云的噪声、密度变化适度不变能提升鲁棒性深层面对的是语义和朝向这时候抹掉方向就是自废武功。具体实现上可以在浅层用相对坐标、局部规范化在深层用全局坐标或者显式的方向编码。5.2 双分支分类走不变回归走方向另一个我常用的结构是双分支。分类分支用旋转不变特征让它对朝向不敏感专注语义回归分支用方向敏感特征甚至显式地把局部主走向、法向统计拼进去。两个分支共享浅层骨干在深层分开。这样各取所需互不干扰。实测下来这种结构比一个骨干打天下在 heading 精度上有明显提升而且分类指标不掉。5.3 显式方向编码把角度信息喂进去除了让网络自己学还可以显式地把方向信息编码进特征。常见做法包括把每个点的相对角度相对于邻域中心或相对于全局原点作为额外通道用方向卷积让卷积核在不同方向上响应不同或者用可变形卷积让采样点跟着局部几何走向走。这些方法的核心思想都是别让方向信息在特征提取里被平均掉。5.4 损失函数层面的配合损失函数也要配合。heading 回归建议用 sin/cos 双通道加 smooth L1或者用带周期性的角度损失。如果用了 bin 分类bin 的数量和边界要仔细调边界最好落在样本稀疏的方向上。另外可以给 heading 损失加一个权重让它在总损失里占更重要的位置——毕竟它是最容易被忽略又最影响 IoU 的一项。策略作用层级对分类影响对 heading 影响实现复杂度分层不变性骨干浅层中性中性偏正低双分支骨干深层正正中显式方向编码特征层中性正中方向敏感卷积卷积层中性正高heading 损失加权损失层中性正低6. 实测对比抹掉方向线索后到底掉多少6.1 实验设置我拿一个中等规模的城市道路数据集做过一组对照。基线是一个常规的单阶段 3D 检测器骨干用稀疏卷积heading 用 sin/cos 回归。对照组做了两件事一是把骨干换成带旋转不变设计的版本二是把方向相关的输入通道相对角度、法向统计去掉。两组除了这两处其他超参、数据增强、训练轮数完全一致。6.2 结果与解读结果很说明问题。分类分支的 AP 两组几乎持平甚至不变性版本还略高一点点因为特征更稳。但 heading 误差上不变性版本明显更差长条形目标的 180 度翻转率从基线的 3% 左右涨到了 11% 上下整体 3D mAP 掉了好几个点。更关键的是这个差距在长车、卡车这类长宽比大的目标上被进一步放大。这个结果印证了前面的判断不变性对分类是友好的对回归是有害的而且害处集中在长条形目标上。如果你的数据集里长条形目标占比高城市道路场景基本都高那这个坑你迟早会踩。6.3 一个容易被忽略的细节还有个细节值得说方向线索的丢失有时候不是一步到位的而是被平均掉的。比如你在做邻域特征聚合时用了对称的聚合函数max、sum朝向信息在聚合过程中就被平滑掉了。这种丢失很隐蔽因为单看某一层特征好像还有方向感但经过几层聚合之后就没了。排查的时候建议逐层可视化特征的方向敏感性别只看最终输出。7. 几个我踩过的坑和对应的解法7.1 坑一以为数据增强能替代方向敏感设计我一开始觉得只要训练时把场景转个遍模型自然就学会处理各种朝向了不需要在结构上做方向敏感设计。后来发现数据增强解决的是模型见过解决不了特征里有。增强能让模型在见过的朝向上表现好但特征被抹平之后模型学到的其实是忽略朝向的策略遇到训练分布外的朝向照样翻车。解法就是前面说的结构上保留方向敏感性增强只是辅助。7.2 坑二bin 分类的边界样本用 bin 分类做 heading 时落在 bin 边界的样本特别容易错。因为边界处两个 bin 的得分接近网络一犹豫就选错选错之后残差回归也救不回来。我的解法是让 bin 的边界避开样本密集的方向比如车辆直行方向或者用软标签让边界样本同时学两个 bin。另外 bin 数量别太多太多会让每个 bin 的样本变少训练不充分。7.3 坑三局部参考系转换的误差累积前面提过在局部参考系里做不变性回归出来的 heading 要转回全局。这个转换如果依赖一个估计出来的局部朝向而局部朝向本身有误差那误差就会累积到最终 heading 上。我遇到过局部朝向估计偏 5 度最终 heading 偏 15 度的情况。解法是尽量在全局参考系里做朝向回归局部不变性只用在浅层特征。7.4 坑四忽略强度通道强度通道经常被当成可有可无的附加信息但在方向判断上它其实有用。车头车尾的反射差异、材质差异都能帮模型区分前后。我后来把强度单独走一个方向敏感的小支路180 度翻转问题改善了不少。这个改动成本很低值得一试。提示排查 heading 问题时先做三件事——可视化翻转样本、逐层看特征方向敏感性、检查局部参考系转换链路。这三步能定位大部分问题。8. 关于不变性与方向线索我的几点个人体会做了几年点云检测我越来越觉得不变性这个词被神化了。它是个好工具但工具用错地方就是负担。在点云检测里不变性应该服务于鲁棒性而不是取代判别性。方向线索就是那个最容易被不变性误伤的判别信息而它偏偏是框预测最值钱的东西。如果让我给正在做这块的同行一句建议那就是先想清楚你的下游任务需要什么信息再决定在哪里做不变性。分类可以不变回归必须保方向浅层可以不变深层必须保方向。把这两条守住heading 精度和 3D mAP 通常都会有改善。至于具体用双分支、显式编码还是方向卷积那是实现细节核心思路对了剩下的就是调参和迭代的事。最后再分享一个小技巧如果你不确定某个不变性设计有没有伤到方向信息做个消融——把方向相关的输入通道或特征去掉看 heading 误差涨多少。涨得越多说明这个设计抹掉的方向信息越关键就越该重新考虑。这个消融成本很低但能帮你快速判断方向线索在你当前 pipeline 里的实际价值。