ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

单目3D目标检测与BEV可视化:从Anchor-Free到源码实践

单目3D目标检测与BEV可视化:从Anchor-Free到源码实践 简介在自动驾驶与辅助驾驶场景中视觉感知的核心挑战之一是如何用单目相机还原三维世界。单目3D目标检测因缺乏深度信息而存在天然歧义但凭借低成本与高可量产性成为行业关注的热点。这类算法通常基于深度学习在2D检测框架上扩展回归目标尺寸、朝向与中心深度从而在图像中恢复目标的立体位置。为提升感知可解释性BEV鸟瞰视角可视化被广泛用于将检测结果统一映射到俯视平面便于决策规划模块直接使用。Anchor-Free回归头设计因样本分配简洁、多属性联合学习高效成为单目3D感知中常见的基座方案。从KITTI数据集上的模型训练到推理可视化一套完整的工程实现能够帮助研究者快速构建基线系统也展示了纯视觉方案在智能驾驶中的落地潜力。本文所剖析的源码覆盖了2D/3D检测头设计、深度回归策略、相机坐标变换及BEV绘制等关键链路适合作为入门单目3D感知的实践参考。 最近不少搞自动驾驶和辅助驾驶的朋友都在聊BEVBirds Eye View鸟瞰视角感知但说到单目相机做3D目标检测很多人第一反应是“这不靠谱吧单目没有深度信息啊”。确实单目3D检测在行业内一直是个难点但也是成本和工程落地潜力最大的方案之一。今天就借一套我刚整理完的单目2D/3D目标检测及BEV可视化源码完整拆一遍从模型设计到可视化落地的全过程。这套源码基于Python实现2D部分走的是Anchor-Free路线3D部分在2D检测基础上直接回归目标的尺寸、朝向角和中心点深度信息最后还把检测结果投影到BEV空间进行可视化。不管你是刚入门目标检测的学生还是在做智能驾驶感知的工程师这篇文章都能让你对单目3D感知的完整链路有个清晰认识也能直接照着源码跑通一套可用的基线方案。先说清楚这套东西能干什么。输入是一张普通RGB图像比如行车记录仪拍的画面输出是三样东西2D检测框包含类别和置信度、3D检测框包含中心点坐标、长宽高尺寸以及朝向角可以用来在图像上画立体框以及一个BEV视角下的俯视图可视化结果。也就是说你给它一张图片它能把画面里的车、行人、骑行者等目标识别出来并且告诉你这些目标在你的正前方大概什么位置、离你多远、朝向哪里然后在地面俯视图上给你画出来。这个能力对应到实际场景里小到倒车碰撞预警大到高级辅助驾驶的决策规划都能派上用场而且只用一颗摄像头成本比激光雷达方案低一个数量级。项目本身的代码量不大但麻雀虽小五脏俱全包含了数据加载、模型定义、训练入口、推理脚本、可视化工具这几大模块。接下来我按照从整体到细节、从原理到实战的顺序把整个项目的设计和实现掰开揉碎讲一遍。1. 项目全貌与核心技术路线1.1 单目3D检测为什么难在展开源码细节之前有必要先把“单目3D”这件事的难度说清楚。相机成像本质上是把一个三维空间点投影到二维图像平面这个投影过程天然丢失了深度这一维信息也就是所谓的“深度歧义性”。你看到一个苹果和看到一个脸盆在图像上可能是同样大小因为大的离得远、小的离得近投影结果一样。所以单目3D检测本质上是在做一个“病态”问题的求解——从信息不完整的输入中反推完整的三维信息。这就决定了单目3D检测不能像双目视觉那样靠视差计算深度也不能像激光雷达那样直接测距只能靠“先验知识”和“几何约束”来推测。具体来说靠的是两点一是目标在图像上的表观特征比如一辆车的整体轮廓、轮子位置、阴影方向二是3D框投影到2D图像后必须和2D检测框保持一致的几何约束。这两个先验条件是整个单目3D检测算法的立足之本理解了这一点后面所有设计逻辑都能顺下来。1.2 整体框架Anchor-Free基座加3D回归头这套源码的整体架构选择了一个很务实的组合方式2D检测用Anchor-Free框架3D检测在2D特征基础上直接回归不做复杂的两阶段细化。Anchor-Free的意思是不需要预设密集的锚框而是让网络直接预测目标中心点以及到边界框四条边的距离然后用中心点特征去预测对应的3D属性。之所以选Anchor-Free而不是更常见的YOLO系Anchor-Based方案核心考量有两点。第一3D检测需要为每个目标回归的属性非常多中心点偏移、深度、尺寸、朝向角四组信息如果每个anchor都要回归这么多参数正负样本的定义会变得极其复杂而Anchor-Free的正样本就是目标中心点附近的少量像素位置回归任务相对集中样本分配更好处理。第二Anchor-Free的Head结构天然是“一个位置预测一个目标”这种一一对应关系让3D属性回归的损失函数设计简单很多不需要做Anchor匹配的复杂逻辑。完整的数据流是图片输入后先经过Backbone提取特征然后经过一个特征金字塔FPN结构融合多尺度特征最后送入检测Head。检测Head有两条分支一条是2D检测分支负责分类和2D框回归另一条是3D检测分支在2D分支的输出特征位置继续回归3D信息。训练的时候两个分支共享Backbone的特征但损失函数是分开计算的最后融合成总损失。1.3 源码的模块化设计和运行流程这套源码的工程组织很清晰大概分了这么几个部分数据集封装模块负责读取KITTI格式的标注数据转换成训练需要的张量格式模型定义模块包含Backbone、FPN、检测Head三个子模块训练脚本负责损失计算、反向传播、模型保存推理脚本则是对单张图片或者一个测试集做检测并把结果可视化出来。运行流程上看训练阶段读入图片和标注经过网络前向得到预测结果然后分别计算分类损失、2D框损失、3D属性损失反向传播更新参数。推理阶段则简单得多图片输入网络前向对输出做解码将网络输出的相对值还原成真实的坐标和尺寸然后做NMS去重最后调用可视化模块将2D框和3D框绘制到原图上同时投影到BEV空间生成俯瞰图。这套架构最大的优点是把2D和3D任务耦合在一个网络上3D任务可以“借用”2D任务学习到的特征表示而2D任务也能因为3D任务的约束获得更准确的边界信息。实测下来这种多任务学习方式比两套独立模型的效果要好训练也只需要一份数据和一次标注工程成本低很多。2. 2D检测模块的细节设计2.1 从CenterNet到FCOS的混合思路2D检测头采用的是一种介于CenterNet和FCOS之间的混合设计。CenterNet的思路是把目标检测变成关键点估计问题——网络预测一个热力图热力图的峰值位置就是目标中心点然后在这个位置上回归目标框的宽高。FCOS的思路则是逐像素预测对每个像素预测它到所在目标框四条边的距离再加一个centerness分支抑制低质量预测。源码实际上采用了FCOS风格的回归方式对每个正样本位置目标中心区域内的像素预测它到目标左、上、右、下四条边的距离然后解码出2D框。选择FCOS而不是CenterNet的主要原因在于简化解码流程——FCOS直接回归四边距离不需要像CenterNet那样额外预测目标尺寸再做中心点加尺寸的组合解码实现起来更直接。分类分支用的是标准的Focal Loss。目标检测中正负样本是极度不平衡的一张图上背景像素数量远超前景目标像素Focal Loss通过调制因子降低易分类样本的损失贡献让模型把注意力放在难分类的样本上。分类输出通道数等于数据集类别数比如KITTI的Car、Pedestrian、Cyclist三类那就是3个输出通道每个通道对应一个类别的热力图或概率图。2.2 正负样本分配和损失计算2D检测的样本分配策略很简单但很有效。对于每个GT框取它的中心点在中心点周围一个固定半径和框的尺寸相关内的所有特征图位置都视为正样本。这个正样本带positive area的设计借鉴了CenterNet的高斯核思想——离中心点越近的位置回归难度越低对损失的贡献权重应该越高。源码里实际实现是直接对框中心周围一个正方形区域内的像素都标记为正样本然后统一回归四边距离。回归分支的损失函数用的是GIoU Loss而不是传统Smooth-L1 Loss。原因在于Smooth-L1是逐元素计算损失它把四边的回归当作四个独立的任务但实际上这四个值共同决定了一个框的完整性逐元素误差小不代表框的整体IoU高。GIoU Loss直接优化预测框和GT框的重合程度可以同时考虑框的位置和尺寸整体误差收敛速度和对齐度都更好。这个细节虽然小但对最终mAP的影响非常明显。2.3 推理时的解码和后处理推理阶段2D分支的输出是一张分类概率图每个位置每个类别的得分和一张回归特征图每个位置到四条边的距离。解码过程就是找到概率图上的局部极大值点把这些点的位置坐标还原成图像坐标然后对每个点用四边距离计算出预测框的左上角和右下角坐标再乘以特征图相对于原图的下采样倍数得到原图尺度上的2D框。后处理用的是同类目标中比较成熟的做法先按类别分别做对每个类别先筛选出得分大于阈值的候选框然后做NMS非极大值抑制去除重叠框。项目里没有直接用COCO的NMS实现而是手写了一个基于GPU的NMS版本用矩阵广播的方式两两计算IoU然后通过掩码筛选保留最大得分的框。在大约几百个候选框的场景下这个NMS实现比循环遍历的Python版本快了三倍不止。3. 3D检测模块的核心原理与实现3.1 3D属性回归的目标定义3D检测是这套源码的精华所在它的输出定义了相机坐标系下的7个参数目标中心点的三维坐标x, y, z、目标的长宽高l, w, h、以及朝向角yaw。其中x和y分别是目标中心在相机坐标系下的水平偏移和高度偏移z是目标到相机的深度距离这三个量决定了目标在三维空间里的位置长宽高决定了目标的物理尺寸朝向角决定了目标在地面上的摆放方向。在KITTI数据集的设定中相机坐标系的原点位于相机光心x轴朝右y轴朝下z轴朝前单位是米。这里有个容易踩坑的地方图像坐标系是二维的像素坐标(u, v)相机坐标系是三维的米制坐标两者之间通过相机内参矩阵K和尺度因子建立投影关系。源码在设计3D回归目标时不是直接让网络回归相机系下的x、y、z而是做了一个中间变换——先让网络预测目标的中心点在图像上的投影位置对应2D中心点然后基于该位置用深度z和相机内参反算出相机系下的x和y。这样配合比较稳的原因在于x和y与图像的投影位置是强相关的网络更容易学准而深度z作为唯一的绝对尺度量独立回归。3.2 深度估计的回归策略深度z的回归是单目3D检测的核心难点也是最容易玄学的地方。很多项目在这里直接用L1损失回归深度值但这有个问题深度值范围从几米到几十米甚至上百米数值跨度大大距离的误差会主导梯度更新导致近处目标预测精度反而下降。这套源码采用了业界更稳健的策略——对深度取倒数disparity视差作为回归目标再在解码时取倒数还原成深度值。这个操作的物理意义很明确在双目视觉里视差和深度是反比关系深度越大视差变化越小用视差作为回归目标相当于在近处给更多分辨率远处给更少分辨率这和人类对近处深度变化更敏感的特性一致。在实际训练中把深度z变成1/z作为回归值损失函数用Smooth-L1远近距离的梯度幅值就均衡了很多。另外源码在深度回归分支的输出层加了一个Sigmoid激活函数把网络输出限制在0到1范围内然后再乘以一个缩放系数比如80得到最终的逆深度值。这个设计的初衷是让网络在初始阶段不那么容易因为深度值估计过大而产生爆炸梯度相当于提前给深度预测加了一个物理范围约束。3.3 尺寸回归和朝向角处理的几个细节目标的物理尺寸长宽高回归相对直接因为同一类目标的尺寸分布是相对集中的轿车大概就是4.5米长、1.8米宽、1.5米高行人则更小巧。源码的做法是直接回归尺寸值但如果从零开始训容易震荡所以采用了“先验尺寸加残差”的方式——对每个类别统计训练集中所有目标的平均尺寸网络只需要预测相对于这个平均尺寸的残差偏移量。这个设计让网络的任务简单了很多实测能加快收敛速度尤其当训练数据不大时效果非常明显。朝向角回归是最有技巧性的一环。这里说的yaw角是目标的全局朝向角也就是目标在三维空间里朝向的方向角范围是-π到π。直接回归这个角度值会有角度周期性问题——比如角度从179度变到-179度数值上差了358度但实际朝向只差了2度如果用L1损失会给出一个巨大的惩罚信号导致网络训练剧烈震荡。源码解决这个问题的方式是不直接回归角度值而是回归角度的sin和cos两个分量。sin和cos作为连续变量没有周期跳跃问题解码时通过atan2函数还原出原始角度。特别说明一下这里是在计算损失时用了sin和cos形式而在网络输出时仍然是两个神经元分别预测sin和cos的近似值用atan2组合成最终角度。这里强调一下为什么不用分类方式去做角度预测因为角度是连续的把它离散化成若干个区间会导致量化误差尤其对后续BEV显示的精度影响太大连续回归是更自然的选择。3.4 3D框投影与损失约束3D检测本身还涉及一个额外的约束——投影一致性。一个正确的3D框投影到图像上它的8个角点投影后应当和2D检测框基本吻合。源码在训练时额外加了一个投影损失把预测的3D框8个角点按照相机内参投影到图像平面计算这些投影点的最小包围框和GT 2D框的IoU作为一项辅助约束加进总损失。这个做法的好处是让网络在学习3D属性时“借用”了2D检测框的监督信号相当于一种多任务学习中的软约束。特别是当3D标注数量不足时这个投影损失能让3D分支仍然从2D信息中获得梯度。当然这个损失项的实现也对相机内参矩阵的处理提出要求——你需要在训练时把内参矩阵放到与输入图像相同的尺度上否则投影坐标会错位。4. BEV可视化的实现过程4.1 从相机坐标到BEV坐标的几何变换BEV可视化的核心就是坐标系转换。3D检测输出的目标位置在相机坐标系下而BEV视图是一个俯视视角映射到世界坐标系的一个平面通常是地面平面。要做这个变换最关键的一步是将相机坐标系里的目标中心通过外参矩阵转换到车辆坐标系或者世界坐标系然后取其在水平面上的x和z坐标画到BEV图上。在KITTI数据集里外参矩阵通常是相机到IMU坐标系的变换或者在单体测试里也可以简化为一个虚拟的“地面坐标系”。这里的变换过程是首先从相机系坐标x, y, z通过旋转矩阵和平移向量变成世界系坐标X, Y, Z然后取X和Z值映射到BEV俯视图的像素坐标——通常用旋转、缩放、平移三个步骤把空间坐标映射到俯视图范围内的像素位置。4.2 相机内外参在代码中的处理方式很多初学者会在这一步卡住原因是坐标系选择混乱。在实际代码实现中源码对相机内参矩阵的处理做了很大的简化没有从数据集标定文件里逐帧读取内参而是直接使用KITTI的默认标定值并将内参矩阵按图像缩放比例做了归一化处理。在训练时图像被缩放到固定尺寸比如512×256内参矩阵的焦距和光心坐标也要同步缩放。外参部分源码默认相机安装在车顶中心z轴朝车头前方y轴朝下x轴朝右相机光心在地面上的投影作为世界坐标原点。这个假设简化了外参矩阵的推导但你如果想用这个模块跑自采数据集就必须把实际标定的外参填进去否则BEV图上目标的位置会和真实物理位置明显错位。我在代码里看到这种硬编码写法时没什么可惊讶的因为项目的基本盘是KITTI格式的测试集能在KITTI上验证可视化流程就已经达到目的了。4.3 BEV图绘制和多目标叠加展示BEV可视化的绘图部分不复杂但涉及几个工程细节需要注意。首先BEV图需要预先定义覆盖范围这里一般取深度方向0到50米、横向50米左右的范围。然后创建一个像素坐标网格比如500×500的图每个像素映射到对应的物理位置比如每个像素代表0.1米×0.1米这样目标的3D中心坐标就能按物理比例画在图上。绘制逻辑上3D框在BEV空间的显示就是画一个矩形这个矩形由目标的长宽决定朝向角决定矩形的旋转角度。具体实现时需要根据目标的yaw角对矩形的四个角点坐标做旋转一个以目标中心为原点的局部坐标系里矩形四角坐标是长宽一半的组合然后按照yaw角旋转再平移到目标的全局位置。最后用OpenCV的polylines或者填充多边形函数画出来。同时还可以在BEV图里画出道路边界线、自车位置等先验元素增强可读性。另外对于一辆车BEV图里除了显示3D框最好还能显示目标的运动朝向箭头、类别标签和距离信息这样可视化效果才有实战价值。源码里这部分画法很简单但作为一个演示版本已经够用你可以在这个基础上自己加置信度筛选和颜色规则。5. 工程结构与代码细节拆解5.1 关键文件和数据流梳理拿到源码压缩包后建议用tree命令先理清目录结构。除去数据文件和权重文件核心代码大约在十个文件左右。data_loader和kitti_dataset负责数据读取backbone和fpn模块定义了特征提取网络detection_head实现了2D和3D的预测头train和inference是训练和推理的入口可视化工具单独一个文件实现图像绘制和BEV绘制。数据流整体是这样的训练时数据加载器读到一张图像和对应的标注信息标注信息是一行行的“类别 截断程度 遮挡程度 2D框坐标 3D框参数高宽长、位置、朝向角”然后通过数据增强随机翻转、缩放、色彩抖动把数据送入网络。网络输出三个层级的特征图分别对应不同尺度目标然后计算总损失并更新梯度。推理时只需要读取图像文件预处理后跑一次前向然后执行解码和可视化两个步骤。5.2 一个实战配置KITTI数据上的参数选择关于训练参数这套源码在KITTI的默认设置是输入尺寸768×384Backbone用ResNet-18的变体FPN输出三层特征下采样8、16、32倍最大训练轮数是80轮初始学习率1e-3在第50轮和第70轮分别衰减十倍批量大小是8。在单张GTX 1080Ti上完成一轮完整的训练大约需要20分钟左右整体训完80轮大概一天多。在KITTI验证集上实测这个配置的2D检测平均精度在Car类别上可以达到约55%的mAP3D检测的BEV平均精度IoU阈值0.7大约在20%左右。这个数字在单目算法中是中规中矩的水平毕竟它只是一个教学演示级别的实现没有用上最新的深度估计预训练模型也没有做复杂的多尺度融合。但如果拿来做baseline或者入门学习这个配置完全够用而且后续提升空间很清楚——换更强的Backbone、加深度预训练模型、改多帧时序融合每一步都能直接涨点。5.3 代码走读检测头的核心实现检测头的构造文件是整个项目最精华的部分它定义了网络结构如何把2D和3D预测结合起来。在Forward函数里输入是FPN输出的多尺度特征图先经过一个1×1卷积将通道数压缩到合适维度然后并行出四个分支分类分支、2D框回归分支、3D属性回归分支、深度分支。2D框分支输出四通道到左、上、右、下的距离3D属性输出七通道中心点偏移、尺寸、朝向角sin以及cos深度分支输出单通道逆深度值。3D属性回归分支里的“中心点偏移”实际上是一个二维坐标偏移量正样本位置对应GT中心点的量化位置偏移量则是GT中心点在特征图上的小数部分。这用于把粗糙的正样本位置细化到亚像素精度。解码阶段首先用深度值乘以中心点的相机坐标通过内参得到目标的3D坐标然后根据尺寸和朝向角构建出3D框的8个角点最后投影到图像上就得到3D框可视化效果。我特别想提醒的是这段代码的索引顺序非常容易出问题。特征图的索引顺序是高度、宽度、通道但Numpy等数组操作时经常混用导致坐标位置反了。调试的时候建议先在纸上画出特征图和图像坐标的对应关系再动手不然会出现图像绘制结果和BEV可视化结果始终对不上的灵异事件。6. 环境部署与常见问题排查6.1 从零开始跑通的环境准备依赖库方面项目并不重主要依赖PyTorch 1.8以上、OpenCV、NumPy、Pillow以及一些Python内置库。建议创建独立的conda环境Python版本选3.8以上PyTorch按照CUDA版本选择对应安装命令。我的操作方式是这样先在机器上装好Anaconda然后创建虚拟环境再把依赖一次性安装到位。安装完之后直接下载KITTI目标检测数据集只需要用到其中的训练集图像和标注文件不需要把Velodyne点云全部下载下来因为单目方案用不到点云数据。跑通之前需要做的事情是修改config文件中的路径配置把数据根目录和初始权重路径改成你本机的实际路径。初始权重如果有预训练模型就加载没有的话也可以用随机初始化从头训但收敛速度会明显变慢2D检测的精度也会低不少。如果你的机器显存不够8GB建议把批量大小调到4甚至2同时降低输入图像尺寸到512×256但相应地最终精度也会有所下降。6.2 我踩过的三个大坑和解决方案第一个坑是深度标签的预处理。原始KITTI标注里深度z是正的而且目标都是在相机前方这个含义很直观。但网络输出的逆深度用Sigmoid限制在0到1后如果直接原样还原深度会变成1到无穷大而实际深度往往是0到80米所以输出必须做缩放。我一开始没有做缩放处理导致预测深度普遍偏大BEV图上目标被推得很远很远和2D框完全对不上。后来在解码时加入了缩放系数将Sigmoid的输出乘以80再取倒数问题才解决。第二个坑是FPN多尺度输出和标注分配的不匹配。FPN输出三个尺度的特征图同一张图上的目标会分布到不同尺度的特征图上。但有的目标是中等大小在两个尺度上都有响应这就需要在计算损失的时候对多尺度上的目标做重复抑制否则一个目标被两个尺度的分支同时学习反而互相干扰。源码里的解决方案是对每个目标只指定一个最适合的尺度层级按照目标尺寸和特征图感受野的比例关系分配。第三个坑是BEV可视化中外参单位不一致导致的错位。KITTI标定文件里相机的高度、位置都是在IMU坐标系下以米为单位的但处理BEV投影时有些人会把内参的像素单位和外参的米制单位混在一起用得到的结果就会在比例上完全错误。我的解决办法是画BEV之前先把所有三维量统一成米制单位然后按比例映射到图像像素网格这样逻辑上就通顺了。6.3 常见问题速查表问题现象可能原因解决方案训练Loss下降但mAP不涨正负样本分配过松背景误检严重调整centerness权重或降低正样本半径3D框投影到图像上偏移明显深度估计偏差大或内参同步缩放错误检查内参缩放逻辑验证深度解码范围BEV图目标位置错乱外参矩阵单位或坐标系方向错误统一米制单位确认z轴方向和自车位置训练速度慢GPU利用率低数据加载存在瓶颈图像解码耗时过长增加DataLoader的num_workers用prefetch小目标漏检严重小目标分配到的特征图分辨率不足增加浅层特征图输出或提高输入分辨率朝向角预测完全反了yaw角定义方向不一致检查角度的旋转方向和正方向定义6.4 如何验证模型效果是否正常训练完成后不要只看打印的损失值要实际跑推理脚本生成可视化结果。建议选一个白天、无遮挡、目标数量适中的场景把2D框、3D框和BEV图放到同一个面板上对比看。一个正常的模型2D框应该紧贴目标轮廓3D框的底边应该贴合目标底部朝向角和目标实际运动方向一致BEV图上的目标应该形成清晰可辨的矩形轮廓。如果出现“2D框准但3D框乱”的情况大概率是3D回归分支没学好优先检查深度分支和尺寸分支的数值分布看看是不是范围被限制得太死了。如果“3D框看起来合理但BEV图错乱”那问题基本出在外参变换上检查坐标系转换的矩阵顺序是否正确。一句话总结单目3D检测的验证不能只看一个指标图像视角和俯视视角必须联合检查很多错误在单一视图里是隐藏的。7. 可以继续优化的几个方向项目本身是一个完整可用的baseline但距离真正上车还有很多可以打磨的空间。第一个方向是深度估计能力的加强。现在这个版本的深度分支是直接从图像特征回归深度值没有显式引入深度估计的先验后续可以改为把预训练的深度估计模型的特征图作为辅助输入或者用自监督深度估计的损失函数联合优化这样深度分支的精度会显著提升。第二个方向是时序融合。单目3D检测天然存在单帧信息不足问题但车辆在行驶过程中会对同一个目标多次观测如果能加上目标跟踪和运动模型比如卡尔曼滤波、或者学习式的motion prediction就能利用多帧的一致性和运动几何约束把单帧的深度估计误差大幅压低。这也是行业里许多落地系统确实在用的方案。第三个方向是部署层的优化。训练出的PyTorch模型可以直接导出成ONNX然后通过TensorRT做INT8量化加速在边缘设备上可以跑实时检测。但需要注意量化后的模型对深度分支的精度影响比较大建议在量化前对深度分支做敏感性分析必要时保留FP16精度。这些优化工作说起来简单做起来每一个都够写一篇长文好在都有明确的路径可循。我自己的体会是单目3D检测和BEV可视化这条技术路线的价值被很多人低估了。它虽然物理上不如激光雷达方案“硬核”但在成本和可量产性上优势突出而且随着深度学习的进展纯视觉方案的性能追赶速度非常快。你打开这套源码跑通的那一刻可能会觉得效果一般但如果你真的理解每一层网络在做什么、每一步坐标变换在算什么这个工程带给你的价值会远超一个简单的基线模型。踩过坑之后回头看单目3D感知的每一个环节都有独特的挑战也正是这些挑战让它成为计算机视觉里最有嚼头的方向之一。本文还有配套的精品资源点击获取
返回列表