为什么说毫米波雷达无法感知行人，并且对周边所有障碍物无法进行精准的建模？
毫米波雷达的点云是非常稀疏的，对于小目标来说，可能只有一两个点，因此检测效果不佳。近年来，基于Range-Doppler-Azimuth数据方法逐渐兴起。在这个层次上，行人检测的效果也是非常不错的。下面是我的自动驾驶专栏中关于毫米波雷达感知的的部分内容，仅供参考。  Point Cloud 数据的处理算法 雷达的点云是一种非常稀疏的信号，比如一辆汽车上一般来说只有几个到几十个数据点，一个行人上可能只有几个数据点。相对于稠密的数据块来说，点云的的数据量非常少，因此算法很相对轻量，对硬件的要求较低，通常会应用在较低成本的感知系统中，作为其他传感器的补充。在算法方面，大部分的工作都是借鉴了激光雷达点云的处理方式。这些方法大致可以分为两种：一种直接处理点云数据，比如利用PointNet/PointNet++；另一种将点云转换为网格数据，从而采用卷积神经网络（CNN）来处理。 早期的工作一般采用聚类的方式得到目标物体的Proposal，然后提取手工设计的特征，最后输入给分类器进行处理。下面是这个方向的一个代表性工作。 Comparison of random forest and long short-term memory network performances in classification tasks using radar [1] 这篇文章来自戴姆勒，作者采用DBSCAN来对点云进行聚类，对每个cluster提取34维特征。分类器方面作者对比了Random Forest和LSTM，其中LSTM的输入为8个连续的34维特征向量。分类器输出为六个类别，包括车辆，行人，垃圾桶等。实验结果表明，LSTM并没有很大的优势。原因之一是序列长度不够，这个受限于其采集的数据。另外手工设计的特征也限制了LSTM的学习能力。 众所周知，深度学习的一大优势在于可以自动的特征学习，因此研究者逐渐放弃了人工设计特征的方式，转而将此任务交给神经网络，并逐渐过渡到端对端的学习方式。下面是这个方向两个典型的工作。 2D Car Detection in Radar Data with PointNets [2] 这篇文章来自德国Ulm大学，作者借鉴了Frustum PointNets方法。其基本思路可以理解为物体检测中常见的two-stage方法。首先生成object proposal，这里直接将每个点看做一个proposal，region的大小根据物体的先验知识来确定。每个proposal包含n个点，每个点包括x, y, speed, RCS四个特征。接着利用PointNet或者PointNet++对proposal进行分类，也对proposal中的每个点分类（称为点分割任务），并过滤掉背景点。最后只对是物体的proposal进行boundingbox预测。实验是在封闭环境下进行的，只有一辆目标车辆，Ego车辆也只一个Radar sensor。因此并不具备太多参考价值。  Semantic Segmentation on Radar Point Clouds [3] 这篇文章同样来自戴姆勒，作者采用基于PointNet++的方法对点云进行语义分割，也就是每一个点分配一个类别标签（比如车辆，行人，背景等）。值得一提的是，这篇文章在时序上对多帧的点云进行融合，以提高点云的密度。这是其成功的关键点之一。另外，作者利用了多尺度的邻域信息，并用一种类似U-Net的方式连接起来。数据方面，这篇文章采用了多个Radar sensor，并且在真实路况下采集数据，人工标注每个点的类别。  在早期阶段，研究人员一般会基于多帧的点云信号来生成occupancy grid，用来检测静态障碍物。occupancy grid与2D图像的结构相同，因此可以直接用CNN来进行物体检测和分类。比如下面这个工作，就是在occupancy grid上crop出8mx8m的候选区域，然后用CNN对这些区域进行分类。 Object Classification in Radar Using Ensemble Methods [4] Occupancy grid只能表示静态物体，因此更为一般的方法是将点云量化为2D的网格结构，每个网格内可能包含0到N个点。将多个点的数据转化成一个定长的向量，就得到了一个HxWxC的3D tensor数据，其中H和W表示网格的维度，C表示特征向量的长度。这是一个可以被CNN处理的标准数据类型，各种基于CNN的物体检测网络都可以用来执行检测任务。这里比较特别的一步就是如果将多个点转换为定长的特征向量，可以采用简单的Mean/Max Pooling，也可以采用类似于VoxelNet中的Voxel Feature Encoding的方法。VexelNet是针对于Lidar的3D点云设计的网络，也可以魔改一下用于2D的Radar点云。 Radar-based 2D Car Detection Using Deep Neural Networks [5] 这篇文章来自于慕尼黑大学，对比了基于网格和点云的方法。基于网格的方法就是简单的将点云转换成网格，特征向量为x和y方向的速度，以及RCS（作者没有说明如何处理多个点），然后利用YOLOv3网络得到物体的信息（类别，BBox位置，大小，方向）。基于点云的方法就是之前介绍的Frustum PointNets。文章在nuScences数据库上对这两种方法进行了对比，基于网格的方法的mAP为7.87%，远低于基于点云方法的19.61%。但是网格方法在速度上（6.27 f/s）比点云方法（0.27 f/s）快很多。值得一提的是，nuScenes[6]数据库是第一个拥有同步的可见光图像，激光雷达点云和毫米波雷达点云，并且在真实路况下采集的大规模数据库。后面我会再详细介绍这个数据库，它的出现对于基于雷达点云的物体检测研究是一个很大的推动。 小结：直接处理点云的方法性能较好，但是由于数据的不规则，很难利用并行计算进行加速，因此在效率上反而不如网格方法。但是总的来说，两种方法在真实路况数据上的效果都不太理想。原因大致有两点。其一，没有采取有效的时序融合，单帧的雷达检测结果包含很多噪声，传统的雷达物体跟踪算法也在很大程度上依赖于时序信息。循环神经网络（LSTM或GRU）可以更好的处理时序信号，所以应该是下一阶段研究的重点。其二，点云过于稀疏，很多有用的信息已经在预处理阶段丢掉了。因此才有研究者提出直接从雷达原始信号出发，采用端对端的方式来进行物体检测。这样做的好处是充分利用深度神经网络强大的特征学习能力，自动的去除原始信号中的噪声，保留有用信息。但是这部分网络的设计需要更多的考虑到雷达自身的特性，因此更具有挑战性。下一部分将会介绍这方面的工作。  Data Cube 数据的处理算法 原始的雷达信号经过3次FFT处理之后得到以Range-Doppler-Azimuth为坐标的Data Cube。对这个3D tensor做CFAR处理，就得到了稀疏的点云数据。这个过程不可避免的会丢失有用信息。随着自动驾驶芯片计算能力的不断提升，直接利用Data Cube作为输入数据也逐渐成为了可行的方案。近两三年来，这方面的工作慢慢多了起来，也成为毫米波雷达感知领域新的研究热点。下面就介绍几个典型的工作。 Vehicle Detection With Automotive Radar Using Deep Learning on Range-Azimuth-Doppler Tensors [7] 这篇2019年的文章来自Qualcomm，个人认为是早期的一个比较全面的工作。作者提出了两种处理Range-Doppler-Azimuth Tensor的方式：一是沿着Doppler维度将tensor压缩为2D RA tensor；二是分别沿着三个维度压缩，得到RA，RD，AD三个2D tensor，最后再合并为RA tensor。这里说的压缩其实就是相加的操作。不论采取哪种方式，最终都会得到一个以RA为坐标的特征图，特征图的channel维度编码了Doppler和Energy信息。然后，一个关键的步骤就是将这个特征图从RA坐标（也就是极坐标）转换到笛卡尔坐标。这样做的原因是在极坐标下，物体的大小是随着位置变化的，这不符合卷积操作平移不变性的假设。当然坐标转换也不能完全解决这个问题，不同位置处的物体的signature还是会有差别。这个问题比较复杂，留待之后再讨论。最后，为了利用时序信息，LSTM单元会作用在坐标转换后的特征图上。SSD Object Detector被用来进行物体检测任务。这一步不是很关键，任何object detector理论上都可以用。 实验方面，作者在高速公路的场景下采集并标注了一个中等规模的数据库（~100K帧，390K个标注）用来训练和测试。这个数据库场景单一，物体大部分应该是移动的车辆，因此难度相对较低。实验结果表明，在没有LSTM的情况下，RAD模型的性能优于RA模型。在有LSTM的情况下，则基本没有差别。这也说明LSTM会自动的学习到一定的运动信息。此外，作者还与Lidar算法进行对比，得出结论：基于雷达的检测模型受距离影响较小。当然这个对比没有采用同样的数据库，而且雷达数据库只包含了运动物体，因此这个结论并不是非常可信。 RAMP-CNN: A Novel Neural Network for Enhanced Automotive Radar Object Recognition[8] 总的来说，这篇文章的的思路和Qualcomm的很相似，都是将RAD tensor分解成三部分分别处理，再合并到一起。差别主要以下几点：1）这篇文章对于RA的处理更加复杂。RA tensor包含了复数值，并且只在任意选择的chirp上进行（并不是完整的Doppler spectrum）。2）利用3D卷积处理多帧数据；3）用AutoEncoder来提取特征；4）对于融合后的特征图，采用了3D Inception结构，以覆盖不同尺度的感受野。 实验方面，作者在不同场景下采集数据，规模大致也是100K帧，并利用相机的辅助进行标注，类别包括车辆，行人，自行车。值得注意的是，文章中采用了一些为雷达数据设计的data augmentation方法，对网络的训练也起到了很大的帮助。 以上两篇文章都是直接输入底层的雷达数据，利用神经网络进行端对端的学习来检测场景中的物体，个人觉得这应该是未来雷达感知算法的发展趋势。另外还有一些方法，会先检测场景中的ROI（类似于点云）作为候选目标，然后再用神经网络对候选目标进行分类。这类方法的缺点是无法进行端对端的学习，不能充分利用神经网络的优势，所以这里就不做介绍了。 