如果说自动驾驶是一个正在学开车的“学徒”,那计算机视觉就是它的眼睛。但这双眼睛跟人眼完全不是一回事——人眼天生知道远近、熟悉常识、能预判别人想干嘛,机器一开始却只是个“像素统计器”。怎么教会它看懂路况,这些年技术圈走过不少弯路,也慢慢摸索出了一些门道。从OpenCV的老手艺,到CNN的物体识别,再到Transformer的全局注意力,这条路越走越深,也越来越接近人类开车的方式。
OpenCV:老一辈的“手艺活”,至今还在打杂
很多人一聊自动驾驶就堆深度学习模型,但真正上路的量产系统里,OpenCV这个开源视觉库依然无处不在。它里面塞满了各种传统图像处理的算法——边缘检测(Canny)、角点提取(Harris)、光流计算(Farneback)、透视变换、颜色空间转换……听起来有点过时,但它在自动驾驶里干的都是“脏活累活”,而且是不可替代的那种。
第一个作用是“数据的前菜处理”。 车载摄像头拍到的原始图像,存在曝光不均、镜头畸变、反光过强等问题。OpenCV里几十行代码就能完成畸变校正、直方图均衡化、自适应阈值分割,把图像“洗”干净再喂给深度学习模型。没有这步预处理,大模型的精度会肉眼可见地往下掉。
第二个作用是“传感器标定”。 激光雷达和摄像头的联合标定,需要把两个传感器的坐标系精确对齐。OpenCV里的张正友标定法是行业标配——只需拍几张棋盘格照片,就能算出相机的内参(焦距、畸变系数)和外参(相机在三维空间的位置和朝向)。这套方法计算确定性强,没有任何黑盒,出了问题可以逐行排查,工程上最看重这一点。
第三个作用是“轻量级保底方案”。 在高速公路这种结构化场景下,车道线检测完全可以用OpenCV的经典管线来完成——颜色阈值筛选 + Canny边缘检测 + 霍夫变换直线拟合。这套组合拳算力消耗极低,在嵌入式平台上跑得飞起。很多量产车会在感知模块里设一个“看门狗”:深度学习模型如果掉线或输出异常,立刻切回OpenCV管线保底,至少让车辆能沿当前车道减速靠边。这叫“冗余”,是量产的生命线。
第四个作用你可能想不到——数据标注流水线。 量产自动驾驶需要海量标注数据,OpenCV被大量用在标注流水线里做自动化预标注:比如用背景建模(MOG2)把运动物体粗检测出来,减少人工框选的工作量;或者做图像增强(旋转、缩放、色彩抖动)来扩充训练集。它不“智能”,但它“稳”——计算确定性极强,没有概率输出,不出幺蛾子。
所以OpenCV它不是被淘汰的老古董,而是整个系统里最踏实的那块地基。
从2D框到3D理解:让机器知道“有多远”
有了干净的数据,接下来要让机器“看见”物体。早期大家觉得在2D画面里框出车和人就行,于是有了YOLO、Faster R-CNN这类目标检测算法。但开车这件事本质上是在三维空间里做决策——你不仅要知道“左边有辆车”,还得清楚它距离你几米、速度多快。2D像素坐标给不了这些。
于是技术重心转向3D理解。怎么搞?两条路:
一条是“奢侈路线”:给车装上激光雷达,直接发射激光测距,生成一圈点云。点云天生就是三维的,用PointPillars这类方法把点云投影成伪图像,卷积网络一把就处理了。精度高,但一台激光雷达动辄上万元,大规模量产扛不住。
另一条是“省钱路线”:只用摄像头。这里面的苦功夫全在“推理”上——让模型从二维像素里猜深度。一开始大家硬来,直接回归3D框(比如FCOS3D),效果不理想。后来有人想出个妙招:先用深度估计网络(比如MiDaS)给每个像素预测深度值,然后反投回三维空间,生成伪激光雷达数据,再用现成的3D检测网络处理。这样一来,纯视觉跟激光雷达的精度差距大大缩小了。
不过单帧图像始终不可靠,人类开车也不会只看一帧。所以现在的系统会把连续好几帧串起来,用Transformer或LSTM做时序建模——让系统“想起来”刚才那辆车在什么位置,推测出它现在大概在哪,即便被遮挡了一两秒也能合理补全。
Transformer:让机器学会“东张西望”和“翻旧账”
如果说CNN像是一个“局部扫描仪”,盯着小窗口提取纹理特征,那Transformer就像给机器装上了“全局注意力”——它能一下子看到画面里任意两个像素之间的关系,不管隔得多远。
Transformer第一个大放异彩的地方是BEV感知。 前面说到要把多个摄像头的图像拼成一张俯视图,这个“拼接”最难的是视角转换——图像是透视的,俯视图是正交的,两者之间没有简单的数学映射。
BEVFormer直接用Transformer来解决这件事。简单说,俯视图上的每一个格子都是一个“查询”,它会去问所有摄像头图像:你们谁拍到了我这个格子对应的区域?通过注意力机制,模型自动决定该看哪个图像的哪个局部,把信息软性地聚合回来。这不像老方法LSS需要显式预测每个像素的深度——如果深度猜错了,投影就全歪了。BEVFormer用注意力绕开了“必须精确知道深度”的难题,用软方式把特征“拉”到正确位置,鲁棒性更好。
第二个战场是时序融合。 开车不是看定格照片。Transformer天然擅长处理变长的序列输入——把过去5帧、10帧的BEV特征叠在一起,通过时序注意力去“翻旧账”:上一帧这辆车在哪?上上帧它的朝向怎样?由此推断出速度和加速度,甚至预判它下一秒会不会压线。这种能力在密集车流中尤其重要,你需要同时跟踪几十个动态目标,并推断它们之间的交互关系。
第三个是端到端决策里的“全局调度”。 以UniAD为例,它把感知、预测、规划做在一个大模型里,全靠Transformer的注意力在内部传递信息。这里引入了查询向量——你可以把它理解为模型内部“问问题的小纸条”。感知模块的查询向量问“这辆车在哪”,得到位置后传给运动预测模块,接着问“它要去哪儿”,最后规划模块的查询向量问“那我该怎么开”。整个过程信息通过注意力在查询向量间自由流动,没有传统架构里“感知输出列表→规划再算交互”的信息断层。
第四个方向是视觉语言模型。 LLaVA这类模型把视觉编码器和大语言模型接在一起,既能看图又能读文。到了驾驶场景,我们喂给它大量图文对——“左侧有车辆加塞,应该减速让行”,它慢慢学会了把视觉画面翻译成驾驶决策。这刚好补上端到端模型缺的“常识”——端到端知道怎么避开障碍,但不知道为什么交警举手要停车;VLA知道那个手势的含义,只是它反应慢。所以量产里常见“双系统”:快系统(轻量端到端)负责95%的常规驾驶,慢系统(大VLA)对剩下5%的长尾场景做兜底判断。
统一坐标系与在线建图:让车知道自己在哪里
多传感器要协同工作,就得用统一的“语言”描述空间。行业达成的共识是BEV(鸟瞰图) ,把所有数据都投影到俯视图网格里,在这个统一坐标系下做融合。
在BEV基础上衍生出的占用网络,不关心你是什么物体,只关心“这个立体小格子有没有被占据”。路上可能掉下来一袋水泥或一截树枝,模型从没见过这类物体,但只要知道“前方有障碍物”,就足以决策。特斯拉是这条路线的大力推动者。
地图方面,高精度地图虽好但建起来太烧钱,于是在线建图技术兴起——让车自己实时画地图。VectorMapNet把车道线当成一串点来预测,输出的地图是矢量的,几何精确,规划模块用起来顺手。在没有GPS的地方(隧道、地下车库),ORB-SLAM3这类视觉SLAM算法通过提取和匹配画面里的角点特征,实时推算出车身的位姿变化,保证定位不丢失。

扫码申领本地嵌入式教学实录全套视频及配套源码