资讯详情

资讯详情

三维视觉入门:从点云到3D目标检测的完整学习路线

我不想把这篇写成那种“从入门到放弃”的劝退文也不想堆满公式和论文列表假装自己很懂。这只是一个普通开发者花了大半年从零开始摸三维检测和三维语义理解3D-understanding踩了不少坑、推翻了不少错误认知之后沉淀下来的一份学习路线复盘。最近挺多朋友问我做二维目标检测做了几年现在想往3D方向转到底该怎么下手或者说刚读研一导师丢来一个“点云语义分割”的方向完全不知道从哪里开始。这篇文章就是写给这些人的。我会把整个学习过程中最关键的概念、工具、模型脉络、数据集和实操经验按照我实际走过的顺序梳理出来。如果你也想认真学这个方向直接沿着这条路线走会省掉很多我当初瞎折腾的时间。1. 先搞清楚3D-understanding到底在解决什么问题1.1 从二维到三维补上了哪个关键缺口做二维检测的时候我们拿到的是一张图像模型输出的是2D框——也就是目标在画面里的位置。但真实场景里的物体是有体积、有朝向、有空间关系的。一张图上两个物体挨得很近可能一个在前面一个在后面也可能一个躺着一个小角度斜着放。这些信息在2D框里是完全缺失的。3D-understanding要做的就是让机器真正理解场景的“几何结构”和“物体在三维空间中的状态”。它包含几个互相独立又有重叠的任务方向三维目标检测3D Object Detection输出物体的3D包围框通常包含中心点坐标(x, y, z)、尺寸(w, h, l)、朝向角(yaw)这是很多自动驾驶感知系统的核心模块。三维语义分割3D Semantic Segmentation对点云或体素中的每个点/每个单元做类别预测回答的是“这个点属于什么物体”。三维实例分割3D Instance Segmentation比语义分割更进一步需要区分同类别下的不同个体比如一堆椅子里的这一把。多模态融合感知不是单独吃一种数据而是把图像、激光雷达点云、毫米波雷达数据结合起来做综合判断。一开始最容易犯的认知错误就是以为“3D检测 2D检测换个数据格式”。完全不是这么回事。2D检测的卷积网络可以直接处理规则网格图像但点云是稀疏、无序、不规则分布的数据处理逻辑从根本上不一样。这也是为什么要单独开一个“3D-understanding”的学习专题不能拿2D的思路直接套。1.2 这个方向的实际应用场景决定了学习方向学习一个方向之前最好先搞清楚它的“钱在哪”也就是真实需求在哪里。3D理解的工程价值主要集中在几个地方自动驾驶这是最热的方向。感知模块要输出障碍物的3D位置、尺寸、朝向才能做路径规划和避障决策。机器人抓取与操作机械臂要抓取一个物体得知道物体在什么位置、什么姿态这就需要实例级别的3D理解。AR/VR空间感知虚拟物体要“锚定”在真实空间中就需要理解真实场景的结构和物体位置。智能安防与智慧交通比如路口全息感知需要从路侧激光雷达数据还原整个路口的交通参与者分布。这些场景决定了3D学习不能只停留在“调个模型跑通”的层面最终要能理解传感器坐标系、标定关系、数据特征这些偏工程的东西。我的建议是如果你现在还在犹豫学什么方向优先看自动驾驶感知。因为这个方向的需求量最大相关数据集、开源模型和社区讨论也是最多的适合自学者。1.3 我自己当时的背景和学习目标先交代一下我自己的起点方便你对标参考。我之前的工作主要是做图像相关的算法开发和部署PyTorch很熟Linux命令行没问题C能看懂但不太熟。对于点云处理和3D几何基本上是零基础连点云PCD文件长什么样都不知道。我的学习目标定得很实际第一能看懂主流3D检测论文的核心思路第二能跑通至少一个经典模型并理解每个模块的作用第三能处理自己采集的激光雷达数据并做简单的可视化第四为后续做多模态融合打基础。如果你已经有较强的深度学习基础目标可以朝“模块改进”方向定如果是纯小白建议先不要想着发论文先解决“跑通和看懂”的问题。把目标拆成四级——看懂论文、跑通代码、理解数据、改进模块——前三级是必须过的坎。2. 入门前的扫盲向量、坐标系和点云的基本概念2.1 坐标系是3D理解的地基绕不过去3D感知里的一切操作都在坐标系中完成。最常遇到的坐标系有传感器坐标系激光雷达或相机自己的坐标系、车体坐标系、世界坐标系。模型输入的数据通常落在传感器坐标系中但下游模块往往需要车体或世界坐标系下的结果所以坐标变换是入门第一课。这里面最关键的就是旋转矩阵和欧拉角。yaw偏航角是3D检测中最关心的角度因为在地面场景中物体主要绕竖直轴旋转pitch和roll相对不那么重要车辆上下坡时会存在但很多模型做了简化。我当时犯过的低级错误是直接拿PyTorch的矩阵乘法去变换点云坐标结果把x、y、z的顺序搞错了可视化出来全是乱点。这里提醒一下初学者点云的坐标顺序在不同工具里可能不一样。比如某些数据集用的是(x, y, z)某些渲染工具内部是(y, z, x)。处理之前一定要确认好。关于坐标变换可以自己用一段简单的NumPy代码验证import numpy as np # 绕着Z轴旋转一个点模拟yaw角旋转 def rotate_yaw(points, yaw): cos_yaw np.cos(yaw) sin_yaw np.sin(yaw) R np.array([ [cos_yaw, -sin_yaw, 0], [sin_yaw, cos_yaw, 0], [0, 0, 1] ]) return points R.T # 测试原点(1,0,0)绕z轴转90度期望变成(0,1,0) p np.array([[1.0, 0.0, 0.0]]) rotated rotate_yaw(p, np.pi / 2) print(rotated) # 结果应该是 [[0, 1, 0]]这类小脚本非常建议自己手敲一遍能加深对旋转矩阵的理解。不要只调用现成的库函数因为它们封装太深出了问题很难排查。2.2 点云到底是什么稀疏性和无序性意味着什么点云就是一组三维点的集合每个点通常包含(x, y, z)坐标还可以带有额外的特征比如反射强度(intensity)、RGB颜色、时间戳等。激光雷达每秒能产生十几万到上百万个点但这些点不是均匀分布的近处的点密集、远处的点稀疏而且大量的点在空旷区域背景、地面上。正是这种稀疏性导致我们不能直接把点云当作“三维图像”丢给3D卷积网络。一张1280×720的RGB图有约92万个像素每个像素都有值。但一次激光雷达扫描的有效点可能只有几万个如果放进一个规则的体素网格里超过95%的格子是空的。直接在空体素上做3D卷积计算量爆炸且效率极低。这是3D方法设计和2D方法完全不同的核心原因。无序性也是个大问题。点的排列顺序不影响它所代表的物体——同一辆车扫描出来哪怕点的顺序完全被打乱语义还是一样的。所以点云模型必须具备置换不变性。最经典的PointNet系列就是从这个性质出发设计的。2.3 3D数据的几种典型表示形式初学者接触到3D数据时会被各种表示形式绕晕。我帮你梳理一下主流的几种原始点云Raw Point Cloud最直接的表示精度最高但数据不规则需要特殊网络结构处理。体素网格Voxel Grid把空间划分成固定大小的小立方体只保留有点的体素适合用3D稀疏卷积处理。鸟瞰图BEV把点云投影到地面平面上形成类似“俯视图”的规则网格可以直接用2D卷积处理。这是目前自动驾驶方案中最主流的表示之一。距离视图Range View把点云按照激光雷达扫描线的方式展开成类似“全景图”的二维表示适合处理旋转式机械激光雷达数据。每种表示都有优势和代价。体素化会损失部分精细几何信息看你的体素尺寸定多大BEV表示天然适合做车辆检测但对小目标和垂直方向的物体不太友好距离视图接近原始传感器数据但多线激光雷达之间的插值问题处理起来比较麻烦。学习的时候不要问“哪种最好”要问“这个任务里哪种最合适”。3. 学习路线第一阶段吃透PointNet家族3.1 PointNet为什么是所有人的起点如果说3D-understanding领域只能精读一篇论文那一定是PointNet。它发表于2017年是最早直接在原始点云上做深度学习的方法。它的核心思想有两个一是用共享的多层感知机MLP独立处理每个点的特征二是用对称函数最大池化把点的特征聚合起来实现置换不变性。用生活化的类比来解释想象你在统计一个班级学生的身高每个学生单独站好量身高MLP提取点特征然后把所有人身高的最大值、最小值、平均值汇总起来对称聚合函数。无论学生站队的顺序怎么变最终的统计结果应该是不变的。PointNet就是这个思路。它还有一个关键模块叫T-Net用来预测一个变换矩阵对输入点云做旋转对齐。这是PointNet里很容易被忽略但又很有启发性的地方——它证明了网络自己能够学习“规范化”输入数据的变换。3.2 PointNet解决了什么问题PointNet的明显缺陷是没有局部结构信息它只对每个点独立提取特征再全局池化根本不知道一个点和它邻居之间的关系。这就导致它很难识别精细的几何结构。比如两把造型略有不同的椅子PointNet很可能把它们视为同一类。PointNet的思路是在不同尺度上做“局部聚合”。它就是模仿CNN的感受野思想先在局部小范围里提取特征再逐步扩大范围把局部特征聚合成更高级的全局特征。通过最远点采样FPS挑选中心点然后以中心点为球心划分局部区域在局部区域里套用PointNet。整个过程类似“由小到大、逐层抽象”。对初学者来说PointNet有两个值得记住的实现细节一是最远点采样保证了采样的均匀性二是局部区域半径选择会影响感知范围。这些细节在后续很多模型里都对标了这个框架所以理解它之后阅读VoteNet、PointGroup等论文会顺畅很多。3.3 我用代码验证PointNet的感受当时我照着PyTorch实现敲了一遍PointNet的分类和分割代码前向传播的部分大概长这样import torch import torch.nn as nn class PointNetBasic(nn.Module): def __init__(self, num_classes): super().__init__() self.mlp1 nn.Sequential( nn.Conv1d(3, 64, 1), nn.BatchNorm1d(64), nn.ReLU(), nn.Conv1d(64, 64, 1), nn.BatchNorm1d(64), nn.ReLU(), ) self.mlp2 nn.Sequential( nn.Conv1d(64, 128, 1), nn.BatchNorm1d(128), nn.ReLU(), nn.Conv1d(128, 256, 1), nn.BatchNorm1d(256), nn.ReLU(), ) self.fc nn.Sequential( nn.Linear(256, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, num_classes), ) def forward(self, x): # x: [B, 3, N] x self.mlp1(x) x self.mlp2(x) x x.max(dim2)[0] # 全局最大池化 x self.fc(x) return x这段代码最关键的一行就是全局最大池化。你自己动手改一改把max改成mean或者sum感受一下效果有什么不同——这样能最直观地理解“对称聚合函数”的作用。我当初做了一个小实验发现改成mean之后对点数比较多的点云的鲁棒性会下降分类效果也略有波动。这种动手的经验会比读十篇博客都有效。4. 学习路线第二阶段从分割到检测模型怎么一步步变复杂4.1 点云分割的常见思路3D语义分割和2D的语义分割概念相似就是把每个点分类。PointNet本身就能做分割任务它的decoder部分通过特征传播将采样点特征传回原始点。后来出现的PointTransformer系列引入了自注意力机制让点云特征提取能力提升了一个台阶但计算量也大得多。从工程实践来看如果你只是想快速做一个语义分割demo不用一上来就上TransformerPointNet已经够用。等真正需要追求精度的时候再考虑更重的模型。这也是我踩过的一个坑——一上来就追求SOTA结果代码跑不动、调试难度大浪费了很多时间。4.2 3D目标检测的核心难点怎么从点云“变出”3D框如果说分割是按“点”做分类那3D检测就是按“物体”做定位。它的核心难点不只是分类还要回归出物体的位置、尺寸、朝向。具体来说有三大挑战物体的几何形状不完全由可见点决定点云扫描的往往是物体的表面遮挡严重的时候只能看到一部分点要“猜”出完整的包围框。朝向回归是难点2D检测不用管物体朝哪3D检测要输出一个准确的yaw角。同一个物体从不同角度看点云形状差异很大这让网络很难学习。点云稀疏性对小目标极不友好一个行人可能只有几十个点远不如一辆卡车有几百上千个点。检测器很容易漏掉远处的小目标。4.3 从PointNet到VoteNet关键一步前面提到PointNet主要做分割和分类要让它做检测还需要一个关键的思路转换vote。看VoteNet这篇论文之前一定要理解它的核心逻辑直接用PointNet输出的点特征去预测物体框很困难因为物体中心的点往往在物体内部根本不会被激光雷达扫描到。比如一辆车的中心在车体内部如果要求网络预测中心点网络看到的是车身表面它得“穿透”车身去推测内心。VoteNet的解决办法是让每个种子点“投票”出靠近物体中心的位置再把这些投票聚类出来做框回归。这种思路非常优雅也影响了后续很多方法。我读这篇论文的时候最大的收获是3D检测不一定要直接回归目标框而是可以通过中间表示比如投票生成的候选中心来降低学习难度。这就是所谓“提出合适的中间监督信号”的意义。4.4 基于BEV的方法为什么自动驾驶方案喜欢它另一条主流路线是把点云转换到鸟瞰图视角。代表模型比如PointPillars它把点云划分成垂直的柱体每个柱体里聚合特征再用2D卷积做检测。这样做的好处是计算效率高而且能直接复用成熟的2D检测框架比如anchor匹配、NMS等。缺点是垂直方向的信息被压缩对物体的高度估计会有精度损失。我开始学这个方向时也觉得困惑VoteNet和PointPillars的思路完全不同到底该学哪个我的建议是两个都要学因为它们是两种典型范式的代表。VoteNet代表“直接在原始点云上做检测”的原生派PointPillars代表“中间表示转换”的工业派。后续很多模型都是在这两个框架上做改进明白了两者的本质区别再看其他论文就很快。5. 数据、标定和数据集决定你学习上限的基础设施5.1 主流的3D数据集长什么样学习3D理解绕不开开源数据集。最常见的有几个KITTI最早也最经典的自动驾驶数据集包含相机图像和激光雷达点云标注了车辆、行人、骑行者等类别。数据量不算大但非常适合学习很多老模型和基线都在它上面测试。Waymo Open Dataset规模比KITTI大很多覆盖了不同天气和多种城市环境点云密度和标注质量都比较高是目前做自动驾驶感知的主流基准。nuScenes除了激光雷达还提供多相机图像和毫米波雷达数据非常适合做多模态学习和BEV相关方法研究。SemanticKITTI / nuScenes-lidarseg主要做语义分割任务用的标注是逐点的类别标签非常吃存储和算力。对初学者来说我强烈建议先从KITTI入门。它数据量适中标注格式简单清晰GPU要求不高。你不用下载全部数据先下载“同步数据sync data”里的点云、图像和标定文件就够了总共大概几十GB具体看下载哪些子集。5.2 千万别忽略标定文件如果你收集了自己的数据或者想在KITTI上做可视化那就必须理解标定文件。标定决定了激光雷达坐标系和相机坐标系之间的变换关系。KITTI的calib目录里通常提供了P2等投影矩阵和Tr_velo_to_cam等变换矩阵。我当时做点云投影到图像的任务时最大的坑就是投影公式写反了。点云投影到图像的原理很简单先用外参Tr_velo_to_cam把激光雷达坐标系的点变换到相机坐标系然后用内参矩阵P2把相机坐标系的点投影到像素坐标系。看起来简单但实际操作时变换顺序、矩阵维度、齐次坐标的添加方式都能让你debug一下午。建议一定自己写一遍投影函数然后可视化几张图验证结果。数据可视化是检验你理解是否正确的最快手段。5.3 评估指标怎么看懂3D检测最常用的指标是APAverage Precision但3D版本与2D有区别评估时两个3D框是否匹配要看它们的3D IoU交并比是否超过阈值。KITTI常用0.5或0.7的IoU阈值车辆用0.7而且按难度分为Easy、Moderate、Hard三档。Waymo则同时使用AP和APH带朝向匹配的AP对朝向要求更严格。刚接触时不要只看AP数值还要理解Recall和Precision的平衡。模型可能输出很多框来提升Recall但误检也会变多。对应到真实场景漏检一个行人远比多框一个行人严重得多所以评估指标的选择本身就隐含了安全导向。学习时如果能意识到这一点对这个领域的理解会更深一层。6. 动手实战搭建环境和跑通第一个模型6.1 环境配置建议跑3D模型前环境配置是很多小白的第一个“劝退点”。我直接给一套稳妥的配置组合Ubuntu 20.04/22.04、Python 3.8/3.9、PyTorch 1.10、CUDA 11.3。不要一上来就追求最新版本。很多3D模型代码尤其是经典开源项目是在老版本PyTorch下写的太新的版本反而容易出兼容性问题。我当时就遇到过PyTorch 2.0跑老项目时算子报错的情况后来乖乖换回1.10才顺利跑通。如果只是做学习和验证不建议自己从零搭环境可以直接用开源项目提供的Docker镜像省去大量折腾时间。举个例子跑OpenPCDet这个工具库时直接把它的Docker拉下来进容器运行就好。等你后面需要改动代码做实验时再自己搭环境也不迟。6.2 推荐直接上手的工具库学3D理解有几个高星开源项目几乎是必看的OpenPCDet目前最常用的3D目标检测工具箱集成了PointPillars、SECOND、PV-RCNN等经典模型代码结构相对清晰适合学习和二次开发。mmdetection3d同样是3D检测工具库继承了OpenMMLab生态支持多模态和多任务代码风格更统一。如果你熟悉mmcv上手会更快。PointNet/PointNet官方实现用于理解基础模型。Open3D一个非常好用的点云处理库可视化、下采样、法线估计等功能都很完善强烈推荐初学阶段使用。我自己最开始接触的是OpenPCDet因为它对KITTI数据集的支持比较友好而且模型配置采用yaml管理做实验时改参数很方便。mmdetection3d则更适合如果你想在多个任务比如检测加分割之间切换的情况。6.3 跑通PointPillars的完整实操记录下面是我在KITTI数据集上跑通PointPillars的完整流程按步骤照做基本都能跑通下载KITTI同步数据并按OpenPCDet规定的目录结构放到data/kitti/下。目录结构要严格对齐否则工具会找不到文件。具体结构包括training/calib、training/label_2、training/velodyne、training/image_2和对应的testing目录。创建软链接或直接拷贝pcdet/datasets/kitti/kitti_dataset.py相关的配置生成训练用的数据索引文件。在configs目录下选择pointpillars相关的yaml配置打开看一下主干网络结构、锚点设置和训练参数。执行训练命令。数据集不大的情况下用一张中高端GPU训练几十个epoch大概要几个小时。想快速验证可以把epoch数调小batch size调大显存允许范围内。训练完成后用test.py生成结果再用提供的评估脚本计算AP。这里有个关键细节KITTI的数据集目录一旦不对你连数据加载都会报错。我当时卡在自己的数据集目录结构上花了快一天时间。后来发现其实就是少了ImageSets这个文件目录这个文件里包含训练/验证的划分索引。OpenPCDet读取数据时依赖它来切分数据少了这个文件就会报找不到训练集。所以大家下载数据时一定要看清楚官方文档里关于目录结构的要求一个文件夹都不能少。6.4 可视化的重要性不要只盯着一堆数字训练完模型后一定要做可视化验证。用Open3D加载点云把预测框画出来和真实框对比。这个步骤唯一能帮你直观判断模型是否真正学到了东西。我之前训练了一个模型AP指标看起来不错但可视化之后发现它把小树全部检成了行人。指标骗人视觉真相。一句话总结指标是用来衡量模型能力的工具但可视化是理解模型行为的方式两者结合才能对模型有完整认知。7. 从检测到语义理解高阶方向怎么选7.1 3D语义分割与实例分割的关系语义分割把点分类实例分割不仅要分类还要区分不同个体。在PointNet之后出现了一大批方法PointGroup利用点的特征聚类进行实例分割核心思想是先预测每个点属于哪个实例的中心然后聚类最后再细化分割。3D-BoNet、HAIS等在不同的场景理解范式下做实例聚合。如果你已经理解了point-level prediction clustering这种组合思路看这些论文会发现它们不算特别难。学习建议是先把PointGroup的代码和数据流程图走一遍因为它的pipeline比较直观适合作为实例分割的起点。7.2 多模态融合图像和点云怎么“对齐”学习真正让3D理解产生更大价值的是图像与点云的融合。2D图像信息密度高颜色纹理丰富但缺少精确深度3D点云几何精确但稀疏且无纹理。把两者结合是自动驾驶感知的主流研究方向。融合的层次大致分为三类早期融合直接把图像特征和点云特征在输入层拼接。中期融合在特征层进行融合例如用2D检测结果引导点云注意力。后期融合分别预测后在决策层做融合。学习多模态融合最推荐的入门文章是BEVFormer以及相关BEV方法。它把多视角图像特征通过Transformer转换为鸟瞰视角的BEV特征再在BEV空间做检测。这是一种非常优雅的统一表达方式也是目前学术界和工业界都很关注的方向。我在学BEV相关方法的时候发现自己的知识缺口主要集中在Transformer的attention机制以及可变形注意力deformable attention上。如果你也想深入这个方向建议先补一下这两个基础概念再读BEVFormer或BEVDet会顺畅很多。7.3 自监督学习和三维大模型的方向值得关注但别急3D领域也有自监督预训练的趋势比如通过掩码重建点云、对比学习等方式在无标注数据上学习通用3D表示。这个概念热门但不建议新手一开始就啃。自监督方法需要比较深的模型理解能力和实验调试经验等基础模型学扎实后再接触会更有收获。同样点云上的大模型也还处在快速演进期。保持关注但不用急着跟上每一次更新。做研究讲究厚积薄发做学习同样是这样。8. 常见问题与排查技巧实录8.1 训练loss不下降怎么办两个最容易的原因一是学习率设置不合适二是数据预处理出了问题。我的排查顺序是这样的先在少量数据上过拟合看看能不能把loss打到很低如果连过拟合都做不到说明模型或配置很可能有问题如果能过拟合再拿全量数据训练看是不是数据集太大、学习率衰减策略不对。这个排查方法我用了很多次每次都能快速定位问题。不要一上来就调网络结构很多问题根本不在网络结构上。8.2 显存不足怎么处理3D模型显存占用明显比2D模型大因为点云数据加载进显存比较吃容量。常用方案包括减小batch size这是最简单有效的办法。缩小输入点云范围比如只保留前方60米范围内的点既减少计算量也符合多数自动驾驶场景需求。使用混合精度训练在V100级别及以上的GPU上能显著减少显存占用。用梯度累积模拟大batch size。如果这些方法都尝试完还是不够那就要考虑换轻量级模型比如用PointPillars替换PV-RCNN效果虽然不是最优但胜在快。8.3 可视化结果和标注框对不上这个问题的根源几乎都在坐标系的变换或数据增强上。先检查是不是数据增强的时候旋转了点云但忘了同步旋转标注框或者翻转的时候只翻转了框没翻转点。如果数据增强没问题再检查坐标系变换标注通常使用相机坐标系而点云在激光雷达坐标系两者之间的变换矩阵是否用对。8.4 类别不均衡问题3D检测里类别不均衡比2D更严重车辆样本多、行人样本少骑行者更少。模型很容易偏向于多数的车辆类把少数类忽略掉。常见的解决办法有类别重加权损失给少数类的loss加更大的权重。数据增强复制粘贴少数类样本或使用开源数据集补充。两阶段训练先训练一个通用检测器再针对少数类微调。不过要提醒的是数据增强里的复制粘贴并不是随便做就行尤其要注意物体之间的物理位置合理性。比如行人和车辆重叠太严重物理上不可能同时存在这会让模型学到错误的知识。9. 一些给后来人的学习建议整体学下来我个人最大的感受是3D-understanding虽然看起来高深但拆解成“数据表示、网络结构、任务定义、评估体系”四个维度之后它是完全可以按部就班掌握的。不要拿“我数学不好”“我C不太行”当退缩的理由这个方向入门阶段对数学的要求并不高真正需要的是耐心和动手能力。最后再分享几个小的实操习惯我觉得对学习特别有帮助第一每周固定时间做“论文精读笔记”不是翻译论文而是用自己的话总结这篇解决什么问题、用什么方法、实验怎么设计、存在什么不足。第二读完一篇论文就逼自己去看对应代码把forward部分从头到尾过一遍。知道“论文里说的A模块对应代码里的哪一段”这个能力非常关键很多招聘笔试也会考。第三多参加开源社区讨论。很多3D方向的坑比如某个算子不兼容、数据集下载失败、参数配置错误早就在issue里有了答案。你能在社区里解决的问题就不要自己傻扛。3D方向还在快速发展新的数据集、新的模型架构层出不穷。但大家要记住一个原则基础概念永远比最新的trick更重要。只要把坐标系变换、点云特征提取、检测框回归这些基本功打牢面对任何新方法都不会慌。这条路确实没有捷径但走扎实之后你会发现三维世界里的问题远比二维世界里的要有趣得多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →