智能车竞赛‘走马观碑‘实战:摄像头图像识别与实时处理链路解析
第21届智能车竞赛结束之后我们队里最值得单独复盘的就是“走马观碑”这个环节。名字听起来有点文艺实际比赛里它就是一段需要车在快速行驶过程中完成“看内容、做判断”的赛道挑战。我们在它身上投入的时间比预想多了一倍踩过的坑从硬件安装到图像处理都有最终成绩不算出彩但整套流程的教训很值得写下来。如果你正在准备下一届智能车竞赛或者关注摄像头组的图像处理和实时识别方案这篇文章会从我们的视角拆解完整备赛过程规则怎么读、硬件怎么选、图像链路怎么搭、参数怎么调、现场怎么避免翻车。同时也会把那些“看起来不起眼、但直接导致失误”的细节单独提出来。1. 走马观碑不只是“识别一块牌子”它是一个完整的时序任务1.1 这个环节在赛道上的实际形态走马观碑这个环节按照字面意思理解就是“车跑过去顺便看完碑上的内容”。放到赛道里就是赛道旁边会放置一块带有特定标记或文字的标识牌车从它前面经过时需要通过摄像头采集画面在行驶过程中完成识别然后根据识别结果决定后续动作。这个动作听起来简单但放在比赛场景里难度完全不一样。首先车是运动的不是静止对着牌子拍其次识别结果必须在有效时间窗口内送达控制逻辑否则车已经冲过去了识别出来也没有意义。很多队伍第一次接触这个环节时容易把重点放在“识别准确率”上。但实际测下来真正拉开差距的并不是离线识别谁更准而是整个链路的响应速度。图像采集、目标定位、内容识别、结果输出、控制动作这一整套流程能不能在几十毫秒内完成才是核心。1.2 三种能力是考核重点从我自己的理解来看走马观碑至少同时考核了三层能力。第一层是感知能力。摄像头能不能在弱光、强光、逆光等环境下稳定看到标志牌画面里有没有反光、过曝、运动模糊。感知层的失误是后面的识别算法无论如何都弥补不了的。第二层是处理能力。采集到画面之后能不能在有限的计算资源里完成目标区域提取和内容识别。这对主控芯片的算力、图像处理的算法效率都是直接考验。第三层是整车协同能力。识别结果拿到之后车要不要减速、要不要避让、要不要切换路径这些动作要在什么时候触发、以什么优先级执行同样需要花时间设计和测试。很多队伍在赛前测试时只验证了“能识别”没有验证“识别之后车该干嘛”。到了比赛现场才发现识别出来了但没有触发有效动作或者动作执行得太晚直接被判失败。这是我在赛后总结里最想强调的是走马观碑本质上是一个完整的时序任务不只是图像识别单点任务。1.3 这个环节最容易出现的理解偏差备赛期间我们最大的理解偏差是把走马观碑当作“一个需要识别的静态目标”。一开始我们的测试方式是让车停在标志牌前拍照识别确认结果正确就算通过。这个测试方式给了我们一种虚假的安全感。离线测试环境下曝光稳定、画面静止、目标居中识别率当然高。但真正跑起来之后运动模糊、视角变化、光照变化、车体震动每个因素都会让识别效果明显下降。正确的做法应该是从一开始就模拟实际工况让车以目标速度从标志牌旁边经过用行车记录数据回放检查每一帧图像的质量、识别结果和动作触发时间。先让测试环境接近比赛环境再谈调优。2. 赛前硬件方案直接把难度分成了两个等级2.1 摄像头和灰度的分工不能只按惯性选智能车竞赛里摄像头组和灰度组的选择一直是讨论重点。灰度传感器在线搜索、边界检测等方面简单直接处理速度也快但面对走马观碑这种需要看“内容”的环节纯灰度几乎是做不了的。我们的方案是摄像头为主灰度阵列为辅。摄像头负责前瞻、目标检测和内容识别灰度负责近距离的赛道线跟踪和位置修正。这样一个组合的好处是冗余度高高速行驶时摄像头画面可能出现短暂异常灰度数据还能兜底保证车不冲出赛道。如果你决定做摄像头为主要感知手段建议优先关注这几个参数全局快门比卷帘快门更适合运动场景画面变形更小。动态范围要够大否则顺光和逆光切换时画面容易全黑或全白。帧率至少 60 帧以上否则高速行驶时目标很容易漏检。我们一开始用的是卷帘快门摄像头静止拍摄没问题车一跑起来画面就出现明显的果冻效应标志牌上的内容被拉变形识别率直接掉了一截。换到全局快门之后这个问题才基本解决。2.2 主控算力是识别方案的硬约束走马观碑对主控的要求比普通搜线任务高不少。如果只做赛道线检测很多单片机能胜任但要在图像里做目标定位和内容匹配算力不够的话帧率会掉得非常明显。我们队伍当时在两种平台之间犹豫一种是传统 MCU 加简单的模板匹配另一种是上轻量级处理器跑小型分类网络。最后考虑到调试周期和稳定性选择了 MCU 平台识别方案用模板匹配加简单特征判断。比赛圈子里也有队伍用了 RISC-V 平台比如热词里出现的 CH32V307VCT6它在主频和外设配置上确实有性价比优势但最终表现还是取决于具体任务的开销。这里给一个很实在的建议选平台之前先估算你的识别算法在目标帧率下的计算量。如果你预期识别一帧画面需要 30ms而图像采集帧率是 60fps每帧只有约 16ms 时间那就算力不够。这个矛盾不是靠优化一两处代码能解决的很可能需要换方案或者降帧率。2.3 摄像头安装位置决定“能看到的距离”硬件方案里最容易被低估的是摄像头安装参数。我们第一版方案把摄像头装得太低导致标志牌进入画面的时间很短扣除识别耗时之后留给控制动作的余量几乎没有。后来把安装高度提高、镜头倾角调大标志牌在画面里出现的时间提前了将近一倍整个链路才有了足够的缓冲。安装参数不是一个固定值它取决于标志牌距离赛道边缘多远标志牌的高度和尺寸车的最高行驶速度识别算法需要多少有效像素我们的做法是先在实验室模拟赛道的摆放位置然后以不同速度跑车截取行车画面观察标志牌在每一帧里的位置和大小再反推安装高度和视角。这个流程比较笨但是有效。不要凭感觉定安装参数一定要拿实际画面验证。3. 图像识别链路怎么搭从采集到动作每一步都有取舍3.1 曝光设置固定曝光还是自动曝光在运动场景里自动曝光不一定是好选择。因为车在行驶过程中画面内容不断变化自动曝光会根据整体亮度频繁调整参数导致标志牌区域的亮度不稳定。我们最终用了固定曝光。做法是在不同光照条件下采集多组样本选一个能让赛道线和标志牌都清晰可见的曝光值。这样做的缺点是对环境变化的适应能力差但优点是非常稳定图像亮度不会突然跳变后续处理算法的输入不会剧烈变化。这个取舍需要根据比赛场地情况判断。如果场地光照稳定固定曝光是首选如果场地有顶光、侧光、强光源等多种情况可以设置两三套曝光参数根据画面整体亮度动态切换而不是每帧都自动调整。3.2 ROI 区域提取别在整幅图上做识别识别标志牌内容时最常见的错误是先对整幅图做处理再做内容识别。这样不仅浪费算力还会引入大量无关信息降低识别稳定性。正确的流程是先做目标检测在画面中定位标志牌所在的区域也就是 ROIRegion of Interest然后只对 ROI 内的图像做识别内容处理。ROI 提取可以基于几种线索标志牌通常有明显边框或底色和赛道背景差异较大标志牌的位置相对赛道是固定的可以根据赛道线位置推测ROI的大致范围用简单的颜色阈值或灰度阈值先粗筛再做连通域判断确定 ROI 之后需要在里面找到标志牌的具体位置、大小和旋转角度再做矫正。这样识别内容时目标是正对镜头的不会因为车标牌夹角过大导致字符变形。3.3 识别算法模板匹配在小样本场景里够用我们最后用的是模板匹配加简单特征比较。这个方案在离线测试中识别率大概在 95% 左右但实际跑起来会低一些原因是运动模糊和角度偏差。如果你要识别的标志牌内容是固定的几种模板匹配确实够用。做法是提前在实验室采集好每类标志牌的标准图像提取特征信息比赛时拿 ROI 内图像做归一化比对选择相似度最高的作为识别结果。如果标志牌内容不固定比如包含数字、字母、汉字的组合模板匹配就不够灵活了。这时需要考虑小型分类网络或者特征识别方案。但这里要注意引入模型之后对主控算力的要求会显著上升调试难度也会增加。先评估你需要的识别规模再决定要不要上模型。3.4 识别结果怎么影响控制逻辑识别完成之后最关键的事情是“拿结果去干嘛”。我们在前期设计了一个简单的状态机状态一正常行驶持续搜索标志牌状态二检测到标志牌进入识别流程状态三识别完成根据结果决定减速、停车或变道状态四动作执行完成恢复正常行驶这个状态机的核心是触发时机。状态二必须在标志牌进入可识别范围的最早时刻触发给状态三和状态四留出足够的执行时间。我们的经验是宁可提前误触发也不要延后正确触发。提前误触发可以靠后续帧修正延后触发则直接错过有效窗口。4. 实测调参速度、稳定性和识别率怎么平衡4.1 从 0.5m/s 开始逐步提速整个备赛期间我们调参的顺序是先把速度降到 0.5m/s 左右保证每次经过都能稳定识别。然后以 0.2m/s 的间隔逐步提速每提高一档都跑至少 10 次统计识别率和动作触发率。这个过程很枯燥但非常重要。因为不同速度下运动模糊和视角变化对识别结果的影响差别很大。高速时能识别的方案低速时不一定会失败反过来低速时稳定的方案高速后很可能出现识别延迟。关键是记录每一档速度下的数据识别率、平均耗时、动作触发延迟、失败时的画面特征。这样即使后面改了参数也能快速判断是变好了还是变差了。4.2 曝光、阈值、ROI 要联动调整走马观碑的调参过程中最容易出问题的是“只调一个参数”。比如发现画面对比度不够就调二值化阈值调完之后发现赛道线检测出了问题又去改灰度阈值改完阈值标志牌的 ROI 定位又偏了。这类问题本质上是图像处理链路里各环节相互耦合。曝光变了灰度分布变了二值化阈值需要跟着变阈值变了目标区域分割结果变了ROI 定位也会受影响。我们的做法是把参数分为两组第一组曝光、增益、伽马这类参数影响图像整体质量第二组二值化阈值、ROI 上下边界、模板匹配相似度阈值这类参数影响识别结果调整时先稳定第一组再调第二组。第一组参数不稳定的情况下盲目调第二组只会越调越乱。4.3 连续测试 30 次才算真正验证过很多队伍在赛前测试时只跑三五次看到识别成功就觉得方案没问题。但走马观碑这种场景单次成功的参考价值非常有限。建议至少连续跑 30 次统计以下数据成功识别次数和失败次数失败时是检测不到、识别错误还是动作执行失败每次识别耗时是否有明显波动第 10 次、第 20 次、第 30 次的识别表现是否一致连续测试的真正价值在于暴露间歇性问题。有些问题不是每帧都发生而是每隔十几次出现一次比如某帧画面轻微过曝、某次车体震动导致目标偏移。单次测试基本看不到这些问题。4.4 一个具体翻车案例顺光变逆光我们在一次模拟比赛中遇到过一个典型问题。上午测试时场地是顺光标志牌区域亮度充足ROI 提取非常稳定。下午换到另一个场地测试光线变成逆光标志牌区域被背景光压暗灰度阈值又没来得及调整识别直接失败。这个问题的根源是曝光和阈值都依赖具体环境而比赛场地往往是未知的。我们的补救办法是在正式比赛前预留至少半天时间针对比赛场地的光照条件重新标定曝光和阈值。同时在代码里加入一键校准功能让车在发车区自动采集几帧背景亮度动态调整曝光参数减少人工介入。这个功能虽然不能完全解决光线变化问题但至少能把“完全依赖现场手动调参”的风险降低不少。5. 比赛现场容易忽略的四个细节5.1 场地光线和背景比想象中复杂比赛场地的灯光结构、地面材质、周围环境都会影响图像质量。有些场地是深色地毯有些是浅色地面有些会反光。这些因素在赛前测试时无法完全预知。建议进场后第一时间用手持摄像头或者车上的摄像头采集一段视频在调参软件里回放先看画面整体亮度和对比度再决定是否需要调整曝光和阈值。不要等到发车前一分钟才改参数。5.2 电池电压变化会影响车速一致性电池从满电到低电量输出电压会逐步下降电机驱动能力随之减弱。如果赛前用满电状态调好车速而正式比赛时电量只剩一半车速和加速特性都会发生变化识别结果也可能因此出现差异。解决办法是在正式发车前做一次快速测试确认当前电量下车的实际速度与调参时一致。如果速度偏差明显需要在策略里预留速度补偿或者提前慢一点优先保证识别稳定。5.3 现场调试时的干扰问题比赛现场通常有大量无线设备、对讲机、调试工具这些可能对车载控制电路造成干扰。我们遇到过一接近其他队伍的调试区域车上摄像头画面就出现条纹的情况。提前准备措施电源线尽量短而粗、传感器信号线使用屏蔽线、在主控和电机驱动之间做好隔离。如果现场出现画面干扰先检查是否是共地或电源纹波问题而不是马上怀疑算法。5.4 规则判罚的实际执行标准每个赛区的执行标准可能不完全一致比如标志牌区域是否允许压线、识别失败是否可以重试。这些细节直接影响比赛策略。我们的经验是赛前把规则文件里关于走马观碑的描述抄出来逐条读标注出所有“必须”“不得”“允许”的词然后针对每一条准备对应的技术方案。不要只看别人转述的规则解读一定要回到原始规则文件。6. 赛后复盘成绩之外真正值得留下的经验6.1 能跑通和能拿成绩是两回事这次比赛让我们深刻体会到能跑通走马观碑只是及格线。真正决定名次的是整个识别链路的稳定性连续跑 30 次不失败对未知场地的适应能力换场地后不用大改参数现场调试效率五分钟内完成参数校准这三项能力都需要在备赛阶段刻意训练不是靠赛前突击就能解决的。我们这次在稳定性上花的时间不够现场调试时明显手忙脚乱。如果再来一次我会把至少一半的备赛时间放在连续测试和场地适应性测试上。6.2 测试记录比代码本身更重要比赛结束后翻看我们的测试记录才发现很多问题其实早就出现过只是当时没有记录下来。比如某次测试中识别成功率只有 60%我们当时以为只是临时干扰没有深究。后来问题反复出现才发现是摄像头某个固定参数设置不合理。如果从一开始就记录每次测试的环境、参数、成功率和失败画面很多问题可以提前两周解决而不是拖到赛前连夜查原因。建议从备赛第一天就建立测试记录文档内容包括日期、场地条件、灯光情况、电池电量、参数版本、测试次数、成功率、失败截图、备注。这个文档不仅是排查工具也是赛后总结的重要素材。6.3 给下一届队伍的三条具体建议如果只能留三句话给下一届队伍我会说第一走马观碑不是单点识别任务而是一个由感知、处理、控制组成的时序链路。从第一天开始就按完整链路设计测试不要拆开来单测。第二硬件安装参数直接影响整个链路的上限。摄像头高度、角度、镜头选择、主控算力这些在项目初期就要认真验证不要等到中后期再推倒重来。第三稳定性的优先级高于极限速度。在高速下能稳定识别 30 次比在极限速度下偶尔成功一次有价值得多。比赛比的不是谁的单圈极限最快而是谁在多变环境中失误更少。这次走马观碑的参赛经历抛开最终成绩不谈整个过程让我们把图像处理、实时识别、整车系统集成这些知识点真正串了起来。备赛过程中积累的调试方法、参数调整思路、现场应变流程才是这次比赛最值得留下的东西。