逆天UniVision:BEV检测和Occ联合统一框架,双SOTA!

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

>>点击进入→自动驾驶之心『BEV感知』技术交流群

写在前面&个人理解

最近这几年以视觉为中心的3D感知在自动驾驶中得到了快速发展。尽管3D感知模型在结构和概念上有许多相似之处,但在特征表示、数据格式和目标方面仍存在差距,这对统一高效的3D感知框架设计提出了挑战。

特别是BEV下的检测任务和Occupancy任务,想做好联合训练,还是很难的,不稳定和效果不可控让很多应用头大。UniVision是一个简单高效的框架,它统一了以视觉为中心的3D感知中的两个主要任务,即占用预测和目标检测。核心点是一个用于互补2D-3D feature transformation的显式-隐式视图变换模块,UniVision提出了一个局部全局特征提取和融合模块,用于高效和自适应的体素和BEV特征提取、增强和交互。

在数据增强部分,UniVision还提出了一种联合占用检测数据增强策略和渐进式loss weight调整策略,以提高多任务框架训练的效率和稳定性。在四个公共基准上对不同的感知任务进行了广泛的实验,包括无场景激光雷达分割、无场景检测、OpenOccupancy和Occ3D。UniVision在每个基准上分别以+1.5 mIoU、+1.8 NDS、+1.5 mIoU和+1.8 mIoU的增益实现了SOTA。UniVision框架可以作为统一的以视觉为中心的3D感知任务的高性能基线。

如果对BEV和Occupancy任务不熟悉的同学,也欢迎大家进一步学习我们的BEV感知教程Occupancy占用网络教程,了解更多技术细节!

当前3D感知领域的状态

3D感知是自动驾驶系统的首要任务,其目的是利用一系列传感器(如激光雷达、雷达和相机)获得的数据来全面了解驾驶场景,用于后续的规划和决策。过去,由于来自点云数据的精确3D信息,3D感知领域一直由基于激光雷达的模型主导。然而,基于激光雷达的系统成本高昂,容易受到恶劣天气的影响,而且部署起来不方便。相比之下,基于视觉的系统具有许多优点,如低成本、易于部署和良好的可扩展性。因此,以视觉为中心的三维感知引起了研究者的广泛关注。

最近,通过特征表示变换、时间融合和监督信号设计,基于视觉的3D检测得到了显著改进,不断缩小了与基于激光雷达的模型的差距。除此之外,近年来基于视觉的占用任务得到了快速发展。与使用3D box来表示一些目标不同,占用率可以更全面地描述驾驶场景的几何和语义,并且不太局限于目标的形状和类别。

尽管检测方法和占用方法在结构和概念上有很多相似之处,但同时处理这两项任务并探索它们之间的相互关系并没有得到很好的研究。占用模型和检测模型通常提取不同的特征表示。占用预测任务需要在不同的空间位置上进行详尽的语义和几何判断,因此体素表示被广泛用于保存细粒度的3D信息。在检测任务中,BEV表示是优选的,因为大多数对象处于相同的水平水平面上,具有较小的重叠。

与BEV表示相比,体素表示是精细的,但效率较低。此外,许多高级算子主要针对2D特征进行设计和优化,使其与3D体素表示的集成不那么简单。BEV表示更具时间效率和内存效率,但对于密集空间预测来说,它是次优的,因为它在高度维度上丢失了结构信息。除了特征表示,不同的感知任务在数据格式和目标方面也有所不同。因此,确保训练多任务3D感知框架的统一性和效率是一个巨大的挑战。

UniVision网络结构

854e354921843be48e3c412d2cf49bfb.png

图1显示了UniVision框架的总体架构。给定来自周围N个相机的多视角图像作为输入,首先利用图像特征提取网络从中提取图像特征。然后,使用Ex-Im视图变换模块将2D图像特征提升为3D体素特征,该模块结合了深度引导的显式特征提升和查询引导的隐式特征采样。体素特征被发送到局部全局特征提取和融合block,以分别提取局部上下文感知体素特征和全局上下文感知BEV特征。然后使用交叉表示特征交互模块对用于不同下游感知任务的体素特征和BEV特征进行信息交换。在训练过程中,联合Occ-Det数据增强和渐进loss weight调整策略用于UniVision框架的有效训练。

1)Ex-Im View Transform

深度导向显式特征提升。这里遵循LSS方法:

790f09cdb29fc2c05cd8ff49f81e244a.png

2)查询引导的隐式特征采样。然而,在表示3D信息方面存在一些缺陷。的精度与估计的深度分布的精度高度相关。此外,LSS生成的点分布不均匀。点在相机附近密集,在距离上稀疏。因此,我们进一步使用查询引导的特征采样来补偿的上述缺点。

2397f45bbe8391536644779182b634fe.png

与从LSS生成的点相比,体素查询在3D空间中均匀分布,并且它们是从所有训练样本的统计特性中学习的,这与LSS中使用的深度先验信息无关。因此,和相互补充,将它们连接起来作为视图变换模块的输出特征:

24a624446b291d9f6602422f53b5dd7a.png

2)局部全局特征提取与融合

给定输入体素特征,首先将特征叠加在Z轴上,并使用卷积层来减少通道,以获得BEV特征:

e9fc38cbd46fd3c53067b5981b7cf05d.png

然后,模型分成两个平行的分支进行特征提取和增强。局部特征提取+全局特征提取,以及最后的交叉表示特征交互!如图1(b)中所示。

3)损失函数与检测头

fd64b68729fa76d578a55602e8148925.png d80f25fab742a54e61a53c3de87dbadd.png ed73b5e6cd047718ff14580e3e10385c.png 0437eb4f2f9cb22a4d5d5b2551e00877.png

渐进式loss weight调整策略。在实践中,发现直接结合上述损失往往会导致训练过程失败,网络无法收敛。在训练的早期阶段,体素特征Fvoxel是随机分布的,并且占用头和检测头中的监督比收敛中的其他损失贡献更小。同时,检测任务中的分类损失Lcls等损失项目非常大,并且在训练过程中占主导地位,使得模型难以优化。为了克服这一问题,提出了渐进式损失权重调整策略来动态调整损失权重。具体而言,将控制参数δ添加到非图像级损失(即占用损失和检测损失)中,以调整不同训练周期中的损失权重。控制权重δ在开始时被设置为较小的值Vmin,并在N个训练时期中逐渐增加到Vmax:

ee45f50bea485c1607191ee72982e174.png

4)联合Occ-Det空间数据增强

在3D检测任务中,除了常见的图像级数据增强之外,空间级数据增强在提高模型性能方面也是有效的。然而,在占用任务中应用空间级别增强并不简单。当我们将数据扩充(如随机缩放和旋转)应用于离散占用标签时,很难确定生成的体素语义。因此,现有的方法只应用简单的空间扩充,如占用任务中的随机翻转。

为了解决这个问题,UniVision提出了一种联合Occ-Det空间数据增强,以允许在框架中同时增强3D检测任务和占用任务。由于3D box标签是连续值,并且可以直接计算增强的3D box进行训练,因此遵循BEVDet中的增强方法进行检测。尽管占用标签是离散的并且难以操作,但体素特征可以被视为连续的,并且可以通过采样和插值等操作来处理。因此建议对体素特征进行变换,而不是直接对占用标签进行操作以进行数据扩充。

具体来说,首先对空间数据增强进行采样,并计算相应的3D变换矩阵。对于占有标签及其voxel indices ,我们计算了它们的三维坐标。然后,将应用于,并对其进行归一化,以获得增强体素特征中的 voxel indices :

d4eaa1675baa4a3e3fc837bdc8ca0503.png

实验结果对比

使用了多个数据集进行验证,NuScenes LiDAR Segmentation、NuScenes 3D Object Detection、OpenOccupancy和Occ3D。

NuScenes LiDAR Segmentation:根据最近的OccFormer和TPVFormer,使用相机图像作为激光雷达分割任务的输入,并且激光雷达数据仅用于提供用于查询输出特征的3D位置。使用mIoU作为评估度量。

NuScenes 3D Object Detection:对于检测任务,使用nuScenes的官方度量,即nuScene检测分数(NDS),它是平均mAP和几个度量的加权和,包括平均平移误差(ATE)、平均尺度误差(ASE)、平均方向误差(AOE)、平均速度误差(AVE)和平均属性误差(AAE)。

OpenOccupancy:OpenOccupancy基准基于nuScenes数据集,提供512×512×40分辨率的语义占用标签。标记的类与激光雷达分割任务中的类相同,使用mIoU作为评估度量!

Occ3D:Occ3D基准基于nuScenes数据集,提供200×200×16分辨率的语义占用标签。Occ3D进一步提供了用于训练和评估的可见mask。标记的类与激光雷达分割任务中的类相同,使用mIoU作为评估度量!

1)Nuscenes激光雷达分割

表1显示了nuScenes LiDAR分割基准的结果。UniVision显著超过了最先进的基于视觉的方法OccFormer 1.5% mIoU,并在排行榜上创下了基于视觉的模型的新纪录。值得注意的是,UniVision还优于一些基于激光雷达的模型,如PolarNe和DB-UNet。

1b9d44731eaa966abf73e74422aebba3.png

2)NuScenes 3D目标检测任务

如表2所示,当使用相同的训练设置进行公平比较时,UniVision显示出优于其他方法。与512×1408图像分辨率的BEVDepth相比,UniVision在mAP和NDS方面分别获得2.4%和1.1%的增益。当放大模型并将UniVision与时间输入相结合时,它进一步以显著的优势优于基于SOTA的时序检测器。UniVision通过较小的输入分辨率实现了这一点,并且它不使用CBGS。

52416a90ca3bc0ea4fa3c14411b55072.png

3)OpenOccupancy结果对比

OpenOccupancy基准测试的结果如表3所示。UniVision在mIoU方面分别显著超过了最近的基于视觉的占用方法,包括MonoScene、TPVFormer和C-CONet,分别为7.3%、6.5%和1.5%。此外,UniVision超越了一些基于激光雷达的方法,如LMSCNet和JS3C-Net。

309b31fe77fee945e9665572e0a1714d.png

4)Occ3D实验结果

表4列出了Occ3D基准测试的结果。在不同的输入图像分辨率下,UniVision在mIoU方面显著优于最近的基于视觉的方法,分别超过2.7%和1.8%。值得注意的是,BEVFormer和BEVDet-stereo加载预先训练的权重,并在推理中使用时间输入,而UniVision没有使用它们,但仍然实现了更好的性能。

6358b0116db0ab0e34dce4630ef167f2.png

5)组件在检测任务中的有效性

在表5中显示了检测任务的消融研究。当将基于BEV的全局特征提取分支插入基线模型时,性能提高了1.7%mAP和3.0%NDS。当将基于体素的占用任务作为辅助任务添加到检测器时,该模型的mAP增益提高了1.6%。当从体素特征中明确引入交叉表示交互时,该模型实现了最佳性能,与基线相比,mAP和NDS分别提高了3.5%和4.2%;

185253ad049ff645685657d6ae074562.png

6)占用任务中组件的有效性

在表6中显示了占用任务的消融研究。基于体素的局部特征提取网络为基线模型带来了1.96%mIoU增益的改进。当检测任务被引入作为辅助监督信号时,模型性能提高了0.4%mIoU。

f62d339a0c99090cc3a93178e83412e8.png

7)其它

表5和表6显示,在UniVision框架中,检测任务和占用任务都是相辅相成的。对于检测任务,占用监督可以提高mAP和mATE度量,这表明体素语义学习有效地提高了检测器对目标几何的感知,即中心度和尺度。对于占用任务,检测监督显著提高了前景类别(即检测类别)的性能,从而实现了整体改进。

040ba6a0e4f543ab57150378945501b2.png

在表7中展示了联合Occ-Det空间增强、Ex-Im视图转换模块和渐进loss weight调整策略的有效性。通过所提出的空间增强和所提出的视图变换模块,它在mIoU、mAP和NDS度量上显示了检测任务和占用任务的显著改进。loss weight调整策略能够有效地训练多任务框架。如果没有这一点,统一框架的训练就无法收敛,性能也很低。

4e0c20a02e8a762b0243eef0eea49047.png

参考

论文链接:https://arxiv.org/pdf/2401.06994.pdf

论文名称:UniVision: A Unified Framework for Vision-Centric 3D Perception

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

4963cbb9cd9fc150750ce1242afaa699.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2400人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

1db24b9709e9d33cd01edb70bc5dc91a.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

8bd1145709b316d263cc33173737f919.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

9845cab9c64b00979fd89c1a8f8e3ec6.jpeg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例代码,用于使用 ESP8266 和 1306 OLED 显示屏显示 Bilibili 粉丝数。该代码使用了 U8g2 库和 ArduinoJson 库。 首先,你需要在 Arduino IDE 中安装 U8g2 和 ArduinoJson 库。然后,将 ESP8266 连接到网络,并将 OLED 屏幕连接到 ESP8266。 接下来,你可以使用以下代码: ```c++ #include <ESP8266WiFi.h> #include <U8g2lib.h> #include <ArduinoJson.h> const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; const char* bilibili_api_host = "api.bilibili.com"; const char* bilibili_api_path = "/x/relation/stat?vmid=YOUR_UID"; WiFiClient client; U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0); void setup() { Serial.begin(115200); u8g2.begin(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.clearBuffer(); u8g2.drawStr(0, 10, "Connecting to WiFi..."); u8g2.sendBuffer(); connectToWifi(); } void loop() { if (WiFi.status() == WL_CONNECTED) { u8g2.clearBuffer(); u8g2.drawStr(0, 10, "Fetching data..."); u8g2.sendBuffer(); String response = getBilibiliData(); int followers = parseBilibiliData(response); u8g2.clearBuffer(); u8g2.setCursor(0, 10); u8g2.print("Bilibili Followers:"); u8g2.setCursor(0, 20); u8g2.print(followers); u8g2.sendBuffer(); delay(10000); } else { connectToWifi(); } } void connectToWifi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } String getBilibiliData() { if (!client.connect(bilibili_api_host, 80)) { Serial.println("Connection failed"); return ""; } client.print(String("GET ") + bilibili_api_path + " HTTP/1.1\r\n" + "Host: " + bilibili_api_host + "\r\n" + "Connection: close\r\n\r\n"); delay(500); String response = ""; while (client.available()) { char c = client.read(); response += c; } client.stop(); return response; } int parseBilibiliData(String response) { StaticJsonDocument<200> doc; deserializeJson(doc, response); return doc["data"]["follower"].as<int>(); } ``` 在这个示例代码中,我们首先定义了 WiFi 的 SSID 和密码,以及 Bilibili API 的地址和路径。然后,我们定义了一个 WiFi 客户端以及一个 OLED 显示屏对象。 在 `setup()` 函数中,我们初始化 OLED 显示屏,并显示连接 WiFi 的消息。然后,我们调用 `connectToWifi()` 函数连接到 WiFi。 在 `loop()` 函数中,我们首先检查 WiFi 是否连接成功。如果连接成功,我们就调用 `getBilibiliData()` 函数获取 Bilibili 粉丝数,然后使用 `parseBilibiliData()` 函数解析数据并显示在 OLED 屏幕上。最后,我们暂停 10 秒钟,然后重新开始循环。 在 `connectToWifi()` 函数中,我们使用 `WiFi.begin()` 函数连接到 WiFi,并等待连接成功。 在 `getBilibiliData()` 函数中,我们使用 `client.connect()` 函数连接到 Bilibili API,并发送 HTTP GET 请求。然后,我们等待一段时间,直到服务器返回响应,并将响应保存在一个字符串中。 在 `parseBilibiliData()` 函数中,我们使用 ArduinoJson 库解析 JSON 数据,获取 Bilibili 粉丝数。 请注意,此示例代码仅供参考。你需要根据你的具体情况进行修改,例如更改 SSID、密码、UID 等。同时,你还需要将 OLED 显示屏连接到正确的引脚上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值