古往今来,以月亮为题材的诗歌有很多。月亮是张若虚眼中的月光千里此时相见不相闻,愿逐月华流照君。月亮是李白眼中的寂寥 举杯邀明月,对影成三人。亦是李白眼中的尽兴、长久 人生得意须尽欢,莫使金樽空对月。唯愿当歌对酒时,月光长照金樽里。月亮是杜甫眼中的思乡 露从今夜白,月是故乡明。月亮是杜牧眼中的有情 明月有情应识我,年年相见在他乡。月亮是欧阳修眼中的相思 月上柳梢头,人约黄昏后。月亮是苏轼眼中的不解 明月几时有?把酒问青天。亦是苏轼眼中的祝愿 但愿人长久,千里共婵娟。
月亮是你,这个世界乱糟糟,而你干干净净悬在我的心上,做我的月亮。月亮是乡愁 新月弯弯,像一条小船。我乘船归去,越过万水千山。 https://t.cn/A6VNOEew
月亮是你,这个世界乱糟糟,而你干干净净悬在我的心上,做我的月亮。月亮是乡愁 新月弯弯,像一条小船。我乘船归去,越过万水千山。 https://t.cn/A6VNOEew
古外今来,文人眼中的月亮有一万种美。
月亮是思乡,露从今夜白,月是故乡明。
月亮是寂寥,举杯邀明月,对影成三人。
月亮是友情,明月有情应使我,年年相见在他乡。
月亮是乡愁,新月弯弯,像一条小船,
我乘船归去,越过万水千山。
月亮便是你,这个世界乱糟糟,
而你干干净净悬在我的心上,做我的月亮。
月亮更是祝愿,但愿人长久,千里共婵娟。
月亮是思乡,露从今夜白,月是故乡明。
月亮是寂寥,举杯邀明月,对影成三人。
月亮是友情,明月有情应使我,年年相见在他乡。
月亮是乡愁,新月弯弯,像一条小船,
我乘船归去,越过万水千山。
月亮便是你,这个世界乱糟糟,
而你干干净净悬在我的心上,做我的月亮。
月亮更是祝愿,但愿人长久,千里共婵娟。
特斯拉autopilot研发总监Ashok在CVPR2022上的演讲:如何检测障碍物并自动避让(中)
原创 瓦砾村钱罐 瓦砾村夫
今天,我想谈一谈在视频中没有展示的某个技术,那就是,我们如何处理一般障碍物。
当开始搭建我们更高级的技术栈时,我们想用某种方法来表示一般障碍物。我们一开始使用的是图像空间的分割方法,这几乎是个标准方法。这里,图像空间的每个像素,都被标记为可驾驶或不可驾驶。然后,我们希望规划技术栈可以使用这个信息来导航场景。
但这种方法有几个问题。首先,这些关于某个像素是否可驾驶的预测是在图像空间中完成的,基于图像的uv值,或者说,某个像素是可驾驶的像素,还是不可驾驶。但为了让汽车能够在三维世界中导航,它需要在三维空间中进行预测,这样才能建立互动的物理模型,并处理驾驶任务。
但在从图像空间转变到三维空间的过程中,如果采用这样的方式,像素分割会在系统中产生不必要的瑕疵或不必要的噪声。例如,取决于我们如何将这个图像空间转换到三维空间,图像中地平线上的像素可能会产生巨大的影响。而我们不希望规划技术栈处理带有如此多噪声的可驾驶空间。而这其实并不是一个根本性的局限,只是这种表示方式的局限。
另外,这种表示方式也不能提供场景完整的三维结构,因此很难推理出所有悬空的障碍物,或者墙壁,或者其他可以遮挡场景的物体。
对一般障碍物进行建模的另一个方法,是使用密集的深度信息。在这个任务中,你可以以像素为基础,让网络预测深度,这样每个像素都会产生某个深度值。
但是,尽管这些深度图在颜色空间中进行可视化时,看起来非常漂亮,但当你使用深度值,把射线反向投影计算得到三维点,并可视化这些三维点云时,虽然它们在近处看起来很不错,但随着距离的增加,它们就变得不一致,而且数据很难被后续流程所使用。例如,局部的深度变得不一致,因此,墙就不直了,可能是弯弯扭扭的。
这个方式也有同样的问题,即靠近地平线的物体只由很少的点来表示,这使得规划技术栈很难针对障碍避让编写合理的逻辑。
这些深度图是基于每个摄像机的图像平面生成的,这也使得这个方法很难生成一个汽车周围统一的三维空间。
由于深度图通常被建模为回归目标,很难通过遮挡来进行预测,而且由于网络的特性,边界上也很难进行预测,例如,它们可能会平滑的从车辆变为背景,而这会在三维空间中产生不必要的瑕疵。
对于这个问题,我们的解决方案就是我们内部所称的占用网络(occupancy network)。下面是一个使用我们的占用网络进行预测的例子,我在这里停一下,让你们看看预测结果。
这些占用网络接收所有八个摄像机流作为输入,并生成一个汽车周围空间的体积化的占用值。每一个体素(或汽车周围的每一个位置),网络都会生成该体素是否被占用的结果。事实上,它生成了一个该体素(或三维位置)被占用或不被占用的概率值。
如我所说,它接受所有8个摄像头作为输入,并生成了一个单一的体积化的输出。这个输出的产生,并不是通过拼接各个独立的预测结果完成的,而是网络完成所有的内部传感器融合,并产生一个单一的一致的输出空间。
这些网络能生成静态物体的占用值,比如墙壁和树木之类的东西,也能生成移动物体的动态占用值,比如车辆(大多数情况下),但有时,也包括其他移动的障碍物,如道路上的碎片。
由于输出空间直接是在三维空间中,我们可以通过遮挡来进行预测。你可以预测一条曲线的存在,尽管它可能暂时被汽车遮挡。
最后,这个方法在内存和计算方面都非常高效,尽管表面上看可能并非如此,因为它生成了密集的三维的占用值,看起来可能体积过于庞大。但最终,在内存和计算效率上,这是一种更优的方法,因为它把分辨率分配在那些关键的地方。
如我所说,密集的深度图,或图像中的可驾驶空间,远处的分辨率非常低,而近处的分辨率非常非常高。但在占用网络中,在与驾驶有关的所有体积中,分辨率几乎都一致,这让它变得极其高效。
例如,我向各位展示的网络,在我们的计算平台上运行的时间小于10毫秒,这使得网络可以以100赫兹的速度运行,比摄像机产生图像的速度快得多。
这是如何做到的?让我们简单了解一下架构。
这里我展示了几个摄像流:鱼眼摄像头,这是一个朝向正面的广角摄像头;左立柱摄像头,这是一个面向左边的摄像头。而网络的确获取所有的摄像机作为输入。
我们首先进行归一化处理,以移除所有跟特定车辆相关的配置,比如内部校准,或图像畸变,或类似的因素。
一旦进行了归一化处理,这些图像就会被输入到目前最先进的图像主干架构中。例如,这里我们采用regnets和BiFBNs来提取图像特征,但这可以换成最先进的架构,甚至是来自于CVPR2022的。
这些主干在图像空间中生成了高维特征,但我们希望占用值定义在三维空间中,对吧,怎样才能做到呢?
我们使用基于查询的注意力(attention),来生成这些三维的占有值特征。这其实与几年前一篇同名论文《占有网络》的出现颇为相似,那篇文章也是查询一系列三维点,以确定三维点是否被占用。
这里的网络也有类似的性质,我们接受三维的位置编码,然后将其映射为固定的查询。这些固定的查询然后参与我们每一个图像空间的特征,我们在图像空间中也嵌入了位置信息。这样,这些三维查询参与所有图像流的图像空间查询,然后生成三维的占用特征。
因为这些都是高维特征,很难在空间的每个点上直接进行计算。我们采用的方法,是在较低的分辨率下生成这些高维特征,然后使用典型的上采样技术,如反卷积(deconvs),来生成更密的高分辨率占用值。
有趣的是,当我们开始这个项目的时候,我们最初的目标是只处理静态物体,如墙或树。因为我们有很多不同的神经网络在车内运行,处理不同类型的障碍物,我们并没有继续搭建一个主要处理移动物体的网络,如车辆,行人,自行车手等。
而这些网络也生成了车辆的完整运动学数据,如深度,速度,加速度,动力等。我们有这个移动物体的网络,我们当时想,好的,我们这里不需要处理移动物体,我们只需要处理静态物体,如树,墙等。
但事实证明,很难生成显式定义的本体树。在这个例子中,这也是来自我们自己内部的测试:这里有一辆皮卡车,看起来像一个栅栏。
原创 瓦砾村钱罐 瓦砾村夫
今天,我想谈一谈在视频中没有展示的某个技术,那就是,我们如何处理一般障碍物。
当开始搭建我们更高级的技术栈时,我们想用某种方法来表示一般障碍物。我们一开始使用的是图像空间的分割方法,这几乎是个标准方法。这里,图像空间的每个像素,都被标记为可驾驶或不可驾驶。然后,我们希望规划技术栈可以使用这个信息来导航场景。
但这种方法有几个问题。首先,这些关于某个像素是否可驾驶的预测是在图像空间中完成的,基于图像的uv值,或者说,某个像素是可驾驶的像素,还是不可驾驶。但为了让汽车能够在三维世界中导航,它需要在三维空间中进行预测,这样才能建立互动的物理模型,并处理驾驶任务。
但在从图像空间转变到三维空间的过程中,如果采用这样的方式,像素分割会在系统中产生不必要的瑕疵或不必要的噪声。例如,取决于我们如何将这个图像空间转换到三维空间,图像中地平线上的像素可能会产生巨大的影响。而我们不希望规划技术栈处理带有如此多噪声的可驾驶空间。而这其实并不是一个根本性的局限,只是这种表示方式的局限。
另外,这种表示方式也不能提供场景完整的三维结构,因此很难推理出所有悬空的障碍物,或者墙壁,或者其他可以遮挡场景的物体。
对一般障碍物进行建模的另一个方法,是使用密集的深度信息。在这个任务中,你可以以像素为基础,让网络预测深度,这样每个像素都会产生某个深度值。
但是,尽管这些深度图在颜色空间中进行可视化时,看起来非常漂亮,但当你使用深度值,把射线反向投影计算得到三维点,并可视化这些三维点云时,虽然它们在近处看起来很不错,但随着距离的增加,它们就变得不一致,而且数据很难被后续流程所使用。例如,局部的深度变得不一致,因此,墙就不直了,可能是弯弯扭扭的。
这个方式也有同样的问题,即靠近地平线的物体只由很少的点来表示,这使得规划技术栈很难针对障碍避让编写合理的逻辑。
这些深度图是基于每个摄像机的图像平面生成的,这也使得这个方法很难生成一个汽车周围统一的三维空间。
由于深度图通常被建模为回归目标,很难通过遮挡来进行预测,而且由于网络的特性,边界上也很难进行预测,例如,它们可能会平滑的从车辆变为背景,而这会在三维空间中产生不必要的瑕疵。
对于这个问题,我们的解决方案就是我们内部所称的占用网络(occupancy network)。下面是一个使用我们的占用网络进行预测的例子,我在这里停一下,让你们看看预测结果。
这些占用网络接收所有八个摄像机流作为输入,并生成一个汽车周围空间的体积化的占用值。每一个体素(或汽车周围的每一个位置),网络都会生成该体素是否被占用的结果。事实上,它生成了一个该体素(或三维位置)被占用或不被占用的概率值。
如我所说,它接受所有8个摄像头作为输入,并生成了一个单一的体积化的输出。这个输出的产生,并不是通过拼接各个独立的预测结果完成的,而是网络完成所有的内部传感器融合,并产生一个单一的一致的输出空间。
这些网络能生成静态物体的占用值,比如墙壁和树木之类的东西,也能生成移动物体的动态占用值,比如车辆(大多数情况下),但有时,也包括其他移动的障碍物,如道路上的碎片。
由于输出空间直接是在三维空间中,我们可以通过遮挡来进行预测。你可以预测一条曲线的存在,尽管它可能暂时被汽车遮挡。
最后,这个方法在内存和计算方面都非常高效,尽管表面上看可能并非如此,因为它生成了密集的三维的占用值,看起来可能体积过于庞大。但最终,在内存和计算效率上,这是一种更优的方法,因为它把分辨率分配在那些关键的地方。
如我所说,密集的深度图,或图像中的可驾驶空间,远处的分辨率非常低,而近处的分辨率非常非常高。但在占用网络中,在与驾驶有关的所有体积中,分辨率几乎都一致,这让它变得极其高效。
例如,我向各位展示的网络,在我们的计算平台上运行的时间小于10毫秒,这使得网络可以以100赫兹的速度运行,比摄像机产生图像的速度快得多。
这是如何做到的?让我们简单了解一下架构。
这里我展示了几个摄像流:鱼眼摄像头,这是一个朝向正面的广角摄像头;左立柱摄像头,这是一个面向左边的摄像头。而网络的确获取所有的摄像机作为输入。
我们首先进行归一化处理,以移除所有跟特定车辆相关的配置,比如内部校准,或图像畸变,或类似的因素。
一旦进行了归一化处理,这些图像就会被输入到目前最先进的图像主干架构中。例如,这里我们采用regnets和BiFBNs来提取图像特征,但这可以换成最先进的架构,甚至是来自于CVPR2022的。
这些主干在图像空间中生成了高维特征,但我们希望占用值定义在三维空间中,对吧,怎样才能做到呢?
我们使用基于查询的注意力(attention),来生成这些三维的占有值特征。这其实与几年前一篇同名论文《占有网络》的出现颇为相似,那篇文章也是查询一系列三维点,以确定三维点是否被占用。
这里的网络也有类似的性质,我们接受三维的位置编码,然后将其映射为固定的查询。这些固定的查询然后参与我们每一个图像空间的特征,我们在图像空间中也嵌入了位置信息。这样,这些三维查询参与所有图像流的图像空间查询,然后生成三维的占用特征。
因为这些都是高维特征,很难在空间的每个点上直接进行计算。我们采用的方法,是在较低的分辨率下生成这些高维特征,然后使用典型的上采样技术,如反卷积(deconvs),来生成更密的高分辨率占用值。
有趣的是,当我们开始这个项目的时候,我们最初的目标是只处理静态物体,如墙或树。因为我们有很多不同的神经网络在车内运行,处理不同类型的障碍物,我们并没有继续搭建一个主要处理移动物体的网络,如车辆,行人,自行车手等。
而这些网络也生成了车辆的完整运动学数据,如深度,速度,加速度,动力等。我们有这个移动物体的网络,我们当时想,好的,我们这里不需要处理移动物体,我们只需要处理静态物体,如树,墙等。
但事实证明,很难生成显式定义的本体树。在这个例子中,这也是来自我们自己内部的测试:这里有一辆皮卡车,看起来像一个栅栏。
✋热门推荐