前言:前几篇分别讲了传感器的硬件布局和数据流转,但传感器只是"眼睛",真正让自动驾驶"看懂"世界的是背后的感知算法。同样是处理一张图片,不同的算法目的完全不同——有的是给整张图打标签,有的是给每个像素做分类,有的是框出物体位置,还有的是在连续画面里追踪同一个目标。本篇就以处理目的为主线,把感知算法要解决的问题逐个拆开,看看每种任务用什么算法、解决什么场景、主流方向在哪。欢迎大家评论及纠正~
一、感知算法的四大任务
任务 | 通俗说法 | 输入 | 输出 | 典型应用 |
分类 Classification | "这张图里是什么" | 一张图片 | 一个类别标签 | 判断当前路况类型(高速/市区/隧道) |
分割 Segmentation | "每个像素属于什么" | 一张图片 | 每个像素的类别标签 | 识别路面区域、车道线像素 |
检测 Detection | "有什么东西,在哪" | 一张图片 | 边界框 + 类别标签 | 检测前方车辆、行人、交通标识 |
跟踪 Tracking | "这个东西还是刚才那个吗" | 连续多帧图片 | 物体的时序轨迹 | 追踪前车运动轨迹、预测行为 |
用一句话区分:分类是整体判断,分割是像素级判断,检测是区域级判断,跟踪是时间维判断。精度从粗到细,维度从空间到时间。这四个任务不是孤立的,而是层层递进的关系。比如检测出前方有车(检测),再分割出车辆的精确轮廓(分割),然后在后续帧中持续追踪这辆车(跟踪),最终预测它会不会变道。
二、"每个像素是什么"——语义分割
2.1 要解决什么问题
语义分割的目的是给图像中每一个像素都打上一个类别标签。不是笼统地说"这是马路",而是精确到"这个像素是路面,那个像素是车道线,旁边那个像素是行人"。应用场景 | 需要识别的类别 | 为什么要像素级 |
可行驶区域检测 | 路面、路沿、障碍物 | 需要精确知道哪些区域可以行驶 |
车道线提取 | 车道线像素 vs 非车道线像素 | 需要精确的车道边界做车道保持 |
交通场景理解 | 路面、建筑、天空、植被、车辆、行人 | 需要完整的场景拓扑辅助规划 |
2.2 通用框架
深度学习引入语义分割后,一个通用的技术框架基本定型:前端负责从图片中提取特征并恢复到原始分辨率:先用卷积层下采样(压缩图片、提取高层语义信息),再用反卷积/上采样放大回原始尺寸,最后对每个像素做分类判断。后端负责优化前端的输出:前端得到的分割边界往往比较粗糙,后端用 CRF(条件随机场)等方法细化边界,让分割更精确。打个比方:前端像一个近视眼画草图——能画出大概轮廓但细节模糊;后端像戴上了眼镜——把模糊的边界修清晰。2.3 主流算法演进
语义分割算法的演进,本质上是在解决一个问题:怎么既看到全局信息,又不丢失局部细节。算法 | 核心创新 | 解决了什么痛点 | 通俗理解 |
FCN | 全卷积网络 + 反卷积上采样 + Skip跳层融合 | 首次将深度学习引入分割,能输出像素级结果 | 第一个"像素级画师",但画得粗 |
U-Net | 对称编码-解码结构 + 通道拼接融合 | 小数据集也能训练好(~30张图) | 像字母U,先压缩再还原,每层都"留一手" |
SegNet/ DeconvNet | 上池化(Unpooling)记住位置还原 | 上采样更精确,不靠反卷积"猜" | 压缩时记住每个值的位置,还原时原位填回 |
DeepLab | 空洞卷积(Dilated/Atrous Convolution) | 不缩小图片也能获得大感受野 | 卷积核中间"挖洞",视野更大但不丢分辨率 |
PSPNet | 金字塔池化(Pyramid Pooling) | 融合多尺度全局信息 | 同时看1倍、2倍、4倍、8倍缩小的图,全局+局部都兼顾 |
FCN——开创者。之前的分类网络(如 AlexNet)最后接的是全连接层,输出一个整体标签。FCN 把全连接层换成卷积层,使网络能接受任意大小的图片,并输出和原图一样大的特征图。但直接上采样的结果很粗糙,所以 FCN 引入了Skip 跳层——把浅层(细节多)和深层(语义强)的特征融合在一起再做分类。U-Net——跟 FCN 思路类似,但融合方式不同。FCN 是将特征逐点相加,U-Net 是将特征在通道维度拼接在一起,形成更"厚"的特征。结构上像一个 U 字:左边下采样(编码),右边上采样(解码),每一层都有跳连。好处是即使训练数据很少(约30张图)也能达到不错的效果。SegNet/DeconvNet——改进了上采样方式。普通的反卷积是"从小图卷出大图",相当于在空隙中填值;SegNet 的上池化是在池化时就记住每个最大值的位置,上采样时把值填回原位、其他位置填零。这样还原能力更强,边界更清晰。DeepLab——引入了空洞卷积。传统方法为了保证输出尺寸不会太小,要么加 padding(引入噪声),要么减少池化层(改了网络结构没法用预训练参数)。空洞卷积的做法很优雅:在卷积核中间插入"洞",3×3 的卷积核加一个洞就变成 5×5 的视野,但参数量和计算量不变。这样既保持了分辨率,又有足够大的感受野。DeepLab v1/v2 后端用 CRF 优化边界,从 v3 开始改用改进的 ASPP(空洞空间金字塔池化)模块替代 CRF,不再依赖后处理。PSPNet——引入了金字塔池化。把特征图缩放到几个不同尺寸(1×1、2×2、3×3、6×6),上采样后与原始特征融合。这使得特征同时具备全局和局部的多尺度信息,对区分外观相似但类别不同的区域特别有帮助。2.4 小结
感受野怎么变大:FCN 靠 Skip → DeepLab 靠空洞卷积 → PSPNet 靠金字塔池化上采样怎么更准:FCN 靠反卷积 → SegNet 靠上池化 → U-Net 靠转置卷积特征融合怎么更好:FCN 逐点相加 → U-Net 通道拼接 → PSPNet 多尺度融合三、"哪个是哪个"——实例分割
3.1 语义分割还不够吗
语义分割能告诉你"这块像素是车",但无法区分"这是车 A 还是车 B"。如果前方有三辆车并排,语义分割只能标出"这三块都是车",但不知道哪块是左车、哪块是右车。场景 | 语义分割 | 实例分割 |
前方三辆车 | ✅ 标出三块"车"区域 | ✅ 区分"车A""车B""车C" |
追踪前车轨迹 | ❌ 不知道哪块是同一辆 | ✅ 可以锁定具体车辆 |
统计车辆数量 | ❌ 无法区分个体 | ✅ 能数出有几辆 |
这就是实例分割要解决的问题:在语义分割的基础上,进一步区分同类物体的不同个体。3.2 Mask R-CNN
实例分割的代表作是Mask R-CNN,它的核心思路非常符合人眼直觉——先粗分再细化:实例分割 = 检测(框分类)+ 框内的普通分割(二分类mask)
步骤 | 做什么 | 通俗理解 |
1. 检测 | 用 Faster R-CNN 框出每个物体的位置和类别 | 先画框,知道"这里有辆车" |
2. ROIAlign | 精确提取每个框对应的特征区域 | 把框对准,不让特征"错位" |
3. Mask 分支 | 在每个框内做像素级二分类,生成物体轮廓 | 在框内精细描边,画出车的精确形状 |
其中ROIAlign是一个关键改进。之前的 ROIPooling 用了取整操作来对齐特征区域,这在分类任务中误差可以容忍,但分割需要像素级精度,取整带来的偏移就不可忽视了。ROIAlign 改用线性插值代替取整,让特征对应更精准。Mask 分支为每个类别单独生成一个 mask(用 sigmoid 做二分类),这样每个类别有自己专属的掩码,避免了类别间的竞争。
四、"分割算法的典型应用"——车道线检测
车道线检测是静态环境感知中最典型的应用场景,也是最能体现"从规则驱动到数据驱动"演进思路的例子。
4.1 传统方法:规则驱动
传统车道线检测的核心思路是用数学规则描述车道线的特征,然后逐步提取:步骤 | 算法 | 做什么 | 通俗理解 |
1 | Canny 边缘检测 | 找图像中亮度急剧变化的位置 | 找白色车道线和黑色路面的交界线 |
2 | 手动分割路面区域 | 指定一个三角形感兴趣区域 | 把天空、路边的干扰边缘去掉 |
3 | 霍夫变换 | 把图像空间的点转换到参数空间,找直线 | 把散乱的边缘点"连"成线 |
4 | 拟合车道线 | 综合所有检测到的线,求平均 | 画出最终的两条车道线 |
其中霍夫变换是最精妙的一步。原理是:图像空间中一条直线上的每个点,在霍夫空间中都对应一条曲线;如果很多点在同一条直线上,它们在霍夫空间的曲线就会相交于同一点。找到这个交点,就找到了直线的参数。问题 | 原因 |
弯道检测不了 | 霍夫变换找的是直线,弯道不是直线 |
手动设区域太死板 | 不同场景的路面区域形状不同,三角形不适用所有情况 |
遮挡和磨损容易失效 | 车道线被前车挡住或磨损严重时,边缘检测找不到 |
参数需要人工调 | Canny 的阈值、霍夫变换的阈值都需要根据场景调参 |
4.2 深度学习方法:数据驱动
LaneNet放弃了人工写规则,改用"先分割再聚类"的思路:步骤 | 做什么 | 通俗理解 |
1. 语义分割 | 二分类:每个像素是/不是车道线 | 先把所有车道线像素找出来 |
2. 像素嵌入 | 为每个像素生成一个 n 维向量,同一车道的向量距离近、不同车道的距离远 | 给每个像素一个"身份证号",同车道的号相似 |
3. 聚类 | 用分割结果做掩码,对车道线像素的嵌入向量做聚类 | 把"身份证号"相似的像素归到一起,区分出左车道、右车道 |
这个思路其实就是实例分割在车道线上的应用——语义分割回答"哪些像素是车道线",聚类回答"这些像素属于哪条车道线"。LaneNet 还有一个创新:用 CNN 学习透视变换参数。传统做法是使用固定的逆透视变换(IPM)矩阵将检测到的车道线点投影到鸟瞰图进行曲线拟合,但固定的变换矩阵遇到上下坡就会失效。LaneNet 的 H-Net 模块用网络学习变换参数,能自适应不同路况的拟合需求。4.3 传统 vs 深度学习对比
维度 | 传统方法(Canny+Hough) | 深度学习(LaneNet) |
核心思路 | 人工设计规则提取特征 | 从数据中自动学习特征 |
弯道处理 | ❌ 只能找直线 | ✅ 能处理弯道 |
遮挡/磨损 | ❌ 容易失效 | ✅ 鲁棒性好 |
场景适应性 | ❌ 需要手动调参 | ✅ 泛化能力强 |
计算量 | 小 | 大(需要 GPU) |
可解释性 | 强(每一步都可追溯) | 弱(黑盒) |
数据需求 | 不需要训练数据 | 需要大量标注数据 |
从规则驱动到数据驱动,核心变化是——把"人想出来的规则"换成了"机器从数据中学到的规则"。
五、主流方向与趋势
5.1 从 2D 到 3D
传统感知算法主要处理 2D 图像,但自动驾驶需要 3D 空间理解。当前主流方向:方向 | 做法 | 代表方法 |
鸟瞰图(BEV) | 将多摄像头图像统一变换到俯视图 | BEVFormer、LSS |
3D 目标检测 | 直接从点云或图像中检测 3D 边界框 | PointPillars、SMOKE |
点云分割 | 对激光雷达点云做语义/实例分割 | Cylinder3D、SPVCNN |
5.2 从单任务到多任务
早期一个网络干一件事(分割一个网络、检测一个网络),现在主流是多任务学习——一个网络同时输出分割、检测、深度估计等多个结果,共享特征提取层,减少计算量。5.3 从感知到预测
感知只是第一步,知道"现在有什么"之后,还需要预测"接下来会怎样":意图识别:判断旁边车辆是否要变道、行人是否要过马路5.4 端到端的趋势
传统方案是模块化的(感知→规划→控制),每一步独立优化。当前最前沿的方向是端到端——直接从传感器输入到控制输出,让网络自己学会从"看到"到"怎么做"的完整链路。代表方案如 UniAD、Tesla FSD V12。但端到端的可解释性和安全性仍是挑战。
六、总结
用一张图把感知算法的处理目的和对应具体任务串起来:一句话总结感知算法的演进逻辑:从人工设计规则到数据驱动学习,从单一任务到多任务融合,从 2D 平面到 3D 空间,从"看到" 到 “看懂”,再到 “预测”。
谢谢观看,码字不易。如果觉得文章对您有帮助,感谢您点个在看,转发分享!