等了半个多月,第21届智能汽车竞赛人工智能视觉组的官方数据集终于放出来了,同批公告里还带了AprilTag支架的安装方案和三维模型。消息出来那天,我们车队的备赛群一晚上刷了六百多条消息,有人讨论标注格式,有人争论支架该用PLA还是亚克力,更多人是在感慨:这届视觉组终于不用全靠“猜场地”过日子了。
作为一个带队跑过两届视觉组的老人,我今天不打算复述公告原文,而是从实际备赛的角度,把这两个文件拆开揉碎聊一聊。数据集合不合理用,直接决定后面一个月的训练效率;AprilTag支架那几页说明,看着不起眼,实际上藏了今年场地感知的最关键约束。文章最后我也会放一份我们队未来四周的落地节奏,给还在观望的队伍做个参考。
1. 一份数据集和一个支架公告,为什么让备赛思路全变了
1.1 视觉组以前最难的不是算法,是“看不见的场地”
前两年视觉组备赛,最大的痛苦不是模型训练不出来,而是训练素材和比赛场地之间存在一道巨大的信息差。每个队都在用自己的方式采集数据:有的拿手机在自家客厅里摆拍交通牌,有的把车上的摄像头拆下来录一段赛道视频,还有的直接去网上找公开数据集凑数。结果就是,大家的模型在本地验证集上跑得都不错,一到正式场地就原形毕露——光照不一样、视角不一样、标志牌的样式有一点点出入,检测置信度直接崩盘。
更难受的是场地元素的不确定性。视觉组要认的交通标志、路障、锥桶、停止线这些东西,每一届都可能调整样式或摆放逻辑。你辛苦标注了两千张“左转箭头”,结果场地里用的是另一种颜色的箭头,模型就废了一半。这种“猜题式备赛”非常消耗士气,团队花大量时间在反复采集和重新标注上,留给底盘调参和整体联调的时间被严重压缩。
官方数据集的出现,等于把这个环节从“开卷考试”变成了“半开卷”。虽然它不保证和最终场地完全一致,但至少把标志牌的种类、风格、拍摄视角和标注规范全部标准化了。所有队伍从同一个起点出发,比拼的回归到算法设计、模型迭代和整车工程能力,而不是“谁的采集运气更好”。
1.2 公告把“暗牌”翻成了“明牌”,省下的是试错预算
这次公布的内容,除了各类别的图片和标注,还包括AprilTag支架方案。这两个东西放在一起看,信息量非常大。
数据集告诉你:场地里大概会出现哪些视觉目标,它们长什么样,应该被识别成什么类别。这意味着你不用再花两周去猜测和自制“模拟标志”,可以把精力直接放在模型的收敛速度和鲁棒性上。
AprilTag支架告诉你:场地里的标志性参照物会以什么物理姿态出现在什么高度。这东西直接决定你的视觉外参设计、识别距离要求、甚至底盘上摄像头的安装高度。如果你把支架的高度和朝向参数吃透了,就能在赛前把相机的俯仰角、曝光参数、检测距离全部调到最优,上场后几乎不需要临场改参数。
说白了,组委会这次把场地感知的“暗牌”翻成了“明牌”。省下的不是某一次测试的时间,而是整个备赛周期里大量无效试错的预算。聪明的队伍应该第一时间调整工作计划,把省下来的精力投入到更值得打磨的环节里去。
2. 官方数据集到手后,先别急着训练,按这个顺序做体检
2.1 目录结构与标注格式:先读懂再动手
很多队伍下载数据集后的第一件事就是解压、扔进训练脚本、直接开跑。我建议先别急,花半天时间把数据集的目录结构和标注格式彻底搞清楚,否则后面百分之百要返工。
按照往届各组别发布训练数据的惯用方式,目录结构大概率长这样,具体以官方压缩包内的说明为准:
dataset/ ├── train/ │ ├── images/ │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ └── ... │ └── labels/ │ ├── 000001.txt │ ├── 000002.txt │ └── ... ├── val/ ├── test/ ├── classes.txt ├── calibration/ │ ├── camera_matrix.json │ └── distortion.json └── README.md拿到压缩包,我建议你按下面这张表逐项核对。不要嫌麻烦,我见过有队伍因为没仔细看说明,把坐标归一化方式搞错,白训了一个礼拜。
| 检查项 | 具体看什么 | 发现问题怎么办 |
|---|---|---|
| 标注格式 | 是COCO的json还是YOLO的txt,坐标是否归一化 | 写一个转换脚本统一成你训练框架需要的格式 |
| 类别编号 | classes.txt里的类别顺序和标注文件里的编号是否一致 | 不一致会静默错位,务必抽3个样本人工核对 |
| 分辨率 | 图片尺寸和相机输出分辨率是否一致 | 不一致时resize策略要统一,别混着来 |
| 拍摄视角 | 图片里标志牌的视角是否和你的车载摄像头接近 | 差距大就要靠自采数据补,不能硬用 |
| 标注质量 | 抽查100张,看框是否贴合目标边缘 | 错标严重的类别建议单独剔除或手动修正 |
这里尤其要注意类别的“静默错位”问题。标注文件和类别列表不匹配时,训练过程不会报错,loss照样下降,但模型输出和真实语义已经完全对不上。在赛前那几天发现这种问题,心态容易直接崩掉。
2.2 相机标定参数才是这份数据集里最容易被忽略的宝藏
大部分队伍拿到数据集会直奔图片和标注,却忽略了calibration目录里的那几个json文件。我要说,这些标定参数的价值,一点不比图片本身低。
视觉组的车最终要把“图像里检测到的目标”映射到“车体坐标系下的位置”,靠的就是相机内参和外参。官方数据集里给出的相机内参,对应的是采集数据时那台相机的焦距、主点、畸变系数。如果你的车载摄像头和采集用的摄像头型号接近,可以直接复用内参估算,省掉一大轮标定工作。
更重要的是,标定参数里通常会包含图像分辨率信息。这直接决定了你在部署模型时该用多大的输入尺寸、能做多大的降采样。有些队伍为了追求轻量,把输入压到192x192,结果小尺寸的AprilTag在图像里只剩几个像素,检测距离砍了一半。这就是没把分辨率和识别距离的关系算清楚。
所以拿到数据集后,先把calibration目录里的参数读一遍,写进你的视觉配置文档里。后面做AprilTag姿态估计的时候,你会发现这些参数每时每刻都在用。
3. 官方数据训练的三条实战经验:分布、混合与评测
3.1 先数类别再定模型,别被总样本数骗了
官方数据集的总量通常看着很可观,但如果按类别拆开看,分布往往是不均衡的。直行、停止这类高频元素可能有两三千张,某个冷门路况标志可能只有两三百张。你要是只盯着总量,很容易高估数据集的“友好程度”。
拿到数据后,我建议第一件事就是写个脚本统计各类别样本数和标注框数量,然后画一张分布表。对于少数类,不要急着强行扩充,先看看能不能用Copy-Paste增强、背景替换、轻微仿射变换这些手段把样本数撑起来。要是冷门类别是比赛里必须识别的,那就得在自采数据阶段专门去补拍。
类别分布直接影响模型结构的选择。样本充足的类别,模型学起来很快;样本稀缺的类别,就得靠更强的数据增强和更低的类别阈值去兜底。这个过程不能用“等训练完看结果”来替代,必须在训练前就摸清楚底数。
3.2 官方数据当底料,自采数据当调味,配比要控制住
官方数据集的标注质量高、场景覆盖全,但有一个天然短板:它的拍摄环境和最终比赛场地大概率存在光照、背景、摆放细节的差异。只靠官方数据训练的模型,在真实场地上表现会打折扣。
我的建议是“以官方数据为底料,自采数据为调味”。具体操作是先让官方数据占主体,再把自己车上摄像头录的赛道素材按一定比例混合进训练集,比例我一般控制在7:3左右,官方数据七成,自采数据三成。自采数据不用多,但必须覆盖不同时段的光照和你场地特有的背景干扰。
这里有个容易翻车的点:自采数据的标注质量通常不如官方数据,如果混入太多标注粗糙的样本,反而会把模型带偏。我自己踩过这个坑,自采数据占比拉到五成以后,模型在官方验证集上的mAP掉了将近四个点,后来降到三成才恢复正常。混合比例不是越平衡越好,要老老实实做消融实验。
3.3 评测别只盯mAP,误检的代价比漏检更高
很多队伍的评测习惯是看mAP或者F1,然后觉得分数够了就上车。但在智能车这种实时控制场景里,误检和漏检的代价完全不对称。
漏检一个交通标志,最坏的结果是车子犹豫一下、速度降一点,还有机会靠其他信息补救。但误检一个标志,比如把路边的深色色块识别成了“停车牌”,车子直接刹停或者执行错误动作,整圈节奏就全乱了。更麻烦的是AprilTag的误识别,认错一个ID可能导致车子在路口做出完全错误的转向决策。
所以评测时我建议给不同错误设定权重:误检的惩罚系数可以设为漏检的三到五倍。具体做法是写一个自定义评测脚本,把“错误动作触发”单独统计出来,而不是只算一个笼统的mAP。训练时如果发现误检率偏高,可以适当调高检测阈值,或者对容易混淆的类别增加负样本。
记住一句话:跑圈的模型不需要每帧都完美,但绝不能在关键节点上“自信地犯错”。
4. AprilTag支架公告里,真正值钱的不是图纸而是这些要求
4.1 一个塑料件为什么值得官方专门公告
第一次参加视觉组的队伍,可能会觉得AprilTag支架公告是个“配件消息”,扫一眼就过去了。实际上,这个支架是整个视觉感知体系中物理约束最强的一个环节,值得专门开一次会研究。
AprilTag在赛道里的作用,通常是为车辆提供全局定位参照或者触发关键动作。它不像交通标志那样只需要“被识别出来”,而是需要“被稳定地、连续地、准确地检测到”。这就对Tag本身的物理状态提出了苛刻要求:平面不能弯曲、高度必须一致、朝向必须固定。
如果只是把AprilTag打印出来直接贴在赛道边,问题很多:纸角在运输和铺设过程中容易卷边,受潮后表面会起皱,阳光斜射时还会反光。任何一个问题都会导致Tag的角点检测不稳定,姿态估计出现几厘米甚至十几厘米的偏差。支架方案的核心价值,就是把“Tag应该长在什么位置、以什么姿态出现”这件事从经验问题变成标准问题。
4.2 拿到支架方案后必须核对的四个参数
支架的三维模型和安装说明发布后,别急着打样,先对照下面几个参数逐项核对。最好做成一张表格贴在工作台旁边。
| 参数 | 影响什么 | 怎么核对 |
|---|---|---|
| Tag家族与尺寸 | 决定检测距离上限和误识别率 | 用直尺量实际打印出来的黑边外沿,别只看文件里的理论值 |
| 安装高度 | 决定相机俯仰角和检测距离设计 | 支架装好后用尺子实测底面到Tag中心的距离 |
| 安装角度 | 决定Tag平面是否正对车行方向 | 用直角尺或量角器复核,角度偏差控制在2度以内 |
| 支架间距 | 决定连续定位时Tag出现的频率 | 按公告间距在地面贴标记,全程走一遍验证 |
这四个参数里,最常见的问题出现在“Tag家族”上。AprilTag有tag16h5、tag25h9、tag36h11等多种家族,不同家族的编码能力和最小识别距离都不一样。公告里指定用哪个家族,你就必须用哪个,不要自己换一个“看起来检测率更高”的家族,否则到了现场会和场地里的Tag对不上,ID语义完全错乱。
4.3 打印与装配:材质哑光、公差要留、底板要稳
支架的材质选择,我强烈建议遵循“哑光优先”原则。PLA、PETG这类材料打印出来表面多少有些光泽,在低角度阳光下会产生镜面反射,导致Tag的黑白边界变得模糊。条件允许的话,优先用磨砂质感的打印材料,或者打印完成后喷一层哑光清漆。如果组委会直接提供了亚克力切割方案,那就更省心,亚克力板的表面平整度远高于3D打印件。
装配的时候要注意公差。3D打印件的孔位和卡扣如果设计得太紧,现场很难装;太松,车子跑几圈后支架就歪了。我建议打样阶段多做几个版本,专门测试插拔手感和紧固程度。底盘方面,不要用轻飘飘的小底座,Tag支架在赛道边要能抗住车子近距离高速通过时带起的气流,底座配重做厚一点,或者用双面胶加配重块双重固定。
还有一个小细节:支架的易更换性很重要。训练过程中Tag纸面会被蹭脏、划伤,你需要能够快速换一张新Tag,而不是把整个支架拆下来重装。设计时留一个可拆卸的Tag面板卡槽,能省下无数调试时间。
5. 支架上车之后的三个实测翻车现场
5.1 反光:上午十点的阳光教你做人
我们队第一次带着打印好的Tag支架去室外场地实测,选了个阳光明媚的上午,结果三分钟就发现问题:从某个角度望过去,Tag表面的白底区域亮成一片,黑色方块边缘完全看不清,检测器在好几个关键帧里直接丢失了目标。
反光的来源不一定是Tag本身,也可能是支架的底板或旁边的白色围挡。解决办法是给Tag表面加一层哑光膜,同时调整摄像机的曝光策略,尽量避开局部过曝。测试的时候一定要在一天中的不同时段跑几遍,早上和下午的太阳角度不同,反光出现的位置也在变,只挑傍晚光线柔和的时候测试,发现不了这个问题。
5.2 图纸高度和实际高度不是一回事
支架图纸上标的高度是“设计高度”,但实际装到赛道边以后,真实高度往往会差一点。垫板厚度、双面胶的厚度、地面不平整,都会让Tag中心高度和图纸值产生几毫米的偏差。
几毫米的偏差对检测框的位置影响不大,但对姿态估计来说就很要命了。AprilTag的解算依赖角点的精确像素坐标,高度误差会被换算成距离误差和角度误差,直接影响车辆的定位修正量。正确的做法是每个支架装好后,不采用图纸标注值,而是拿卷尺实测Tag中心到地面的真实高度,再把实测值写进标定参数文件里。所有支架的高度差异,应该控制在正负5毫米以内。
5.3 Tag串码和边缘误检:家族、间距、裁切都要管
当赛道上的Tag密度比较高时,一个画面里可能出现多个Tag,这时候有几类问题特别容易冒出来。一是串码,画面中两个相邻Tag同时出现,解码器抽到错误的角点组合,输出了一个不存在的ID;二是边缘误检,Tag的一部分出现在画面边缘被裁切,解码器用残缺的图案强行解码,给了个错误结果。
处理办法有三条:严格按照官方指定的Tag家族来,不要混用;支架间距不要小于公告规定的最小值;解码时开启“完整度校验”,对边缘截断的Tag直接丢弃,不参与定位计算。另外,输出层可以加一个简单的逻辑滤波,比如连续三帧都识别到同一个ID才认可,单帧的偶发误检直接忽略。这套逻辑跑下来,误识别率能下降一大截。
6. 未来四周的落地节奏:从数据体检到长跑验收
6.1 第一周:体检数据集,跑通官方Baseline
这一周的任务是“把地基打牢”。下载数据集、核对目录结构、确认标注格式、统计类别分布,全部在头两天内完成。然后选择一个轻量目标检测模型作为基线,在官方train集上训练一版,在val集上跑出参考指标。不要在这一版上花太多时间调参,它的唯一意义是确认整个训练链路没有错误。
如果之前没有使用过官方标定参数,这一周也一定要把相机的内参、畸变系数和安装位置代码写进工程里,跑通一条“图像输入→检测→坐标映射→输出控制信号”的最小闭环。
6.2 第二周:自采数据、混合训练、初版模型上车
第二周的重点是自采数据。用车载摄像头在模拟场地或日常环境里录制视频,抽帧后标注,与官方数据按7:3的比例混合训练。训练完成后,不要只在电脑上评测,直接把模型部署到车上的计算平台,在真实赛道里跑几圈,看看检测距离、帧率和置信度是否满足要求。
这一周最容易出现的问题是“训练集和测试集过于相似”——如果自采数据里的画面就是自己的院子,测出来的指标虚高,到了新场地就会原形毕露。建议留出一块从未参与训练的场地作为最终验证场。
6.3 第三周:把AprilTag接进控制闭环,做动态标定
第三周开始做真正的系统集成。把AprilTag检测结果接入车辆的控制逻辑,让Tag不只是“被看到”,而是真正参与转向、减速、停车等决策。动态标定的意义在于,模型在静止画面里检测得很准,不代表在车辆运动时也准,运动模糊和震动会让置信度明显下降。
这一周要重点测三类场景:高速通过Tag、侧向切入Tag、连续多Tag串行通过。每一类场景都记录检测率、解码耗时和位置误差,作为后续优化的依据。
6.4 第四周:一天两次长跑,记录掉帧和误检日志
最后一周不要大改模型,专心做稳定性考核。每天上午和下午各安排一次全赛道长跑,连续跑十圈以上,记录每一圈的关键节点表现:Tag识别是否连续、标志牌检测是否有跳动、控制指令是否出现异常。所有问题都记入日志,按“影响安全的优先修、影响性能的次之”的原则处理。
长跑最能暴露的是数据日志问题。如果车上的日志系统只记录结果不记录中间状态,出了问题根本没法复盘。我建议这一周里所有人轮流盯日志输出,确保每一圈的关键帧、置信度、解码ID和图像时间戳都能完整对上。备赛到了这一步,比的就是谁的错误残留更少。
最后说点题外话。我见过太多队把数据集下下来就直接开训,跑了两周精度上不去,回头才发现是标注文件读取方式错了,或者把验证集混进了训练集。这种低级错误在临近比赛时特别打击心态。我的建议是,从第一天起就写一份数据处理日志,谁下载的、怎么解压的、用什么工具转换的、哪一版模型用的哪些数据,全部记下来。等到调参调得头昏脑涨的时候,你会发现这份日志比任何优化技巧都管用。祝大家在21届都能跑出自己的节奏。