多类车辆目标检测数据集:YOLO标注与自动驾驶实践
简介面向自动驾驶、智能交通与计算机视觉研究的多类车辆目标检测数据集覆盖自行车、公交车、轿车、摩托车、卡车及通用车辆六类道路目标。数据采集自真实日间交通场景包含不同拍摄角度、目标距离、车辆遮挡与光照变化等现实情况已按YOLO格式完成归一化边界框标注并划分训练集、验证集和测试集可直接用于YOLOv5/v7/v8等主流检测框架的训练与评估。压缩包共2000个文件以jpg图像与配套txt标注文件为主体另含yaml模型配置文件和docx说明文档整体大小64.26MB目录结构简洁标注与图像一一对应适合快速开展模型迭代。目前已有96人学习下载。该数据集既能支撑ADAS与自动驾驶感知模块开发也可用于智能交通流量统计、违章行为监测及边缘计算设备模型训练同时为学术研究提供多类车辆检测基准从粗粒度Vehicle类别到具体车型标签均可灵活选用。1. 多类车辆目标检测数据集从YOLO标注到自动驾驶感知落地做自动驾驶和智能交通方向的人绕不开一个尴尬公开数据集要么场景太单一要么类别太粗训出来的模型一换道路就失效。这份多类车辆目标检测数据集正好补上这个缺口。它把道路车辆拆成Bicycle、Bus、Car、Motorcycle、Truck、Vehicle六个类别训练集827张、验证集233张、测试集114张全部按YOLO格式标注好边界框坐标已经归一化拿过来就能训YOLOv5/v7/v8/v11甚至最新的yolov12流程。适合谁做ADAS感知模块、道路流量统计、违章监测的工程师以及需要一份带细粒度类别又不用自己标注的学术研究者。真正让我觉得值的是它同时给了通用Vehicle标签和具体车型标签这等于同一个数据集能支撑粗粒度和细粒度两种训练路线后面讲怎么用。2. 先把数据吃透目录结构、标注格式与类别边界2.1 数据集目录结构与YOLO标注的对应关系拿到压缩包解压后第一件事不是开训而是先把目录结构摸清楚。这份数据集中图片和txt标注文件是放一起的文件名一一对应比如535_jpg.rf.25d00c401ba8e717c6feb5e65863a492.jpg对应的标注就是535_jpg.rf.25d00c401ba8e717c6feb5e65863a492.txt。这种.rf后缀说明原始图片是从Roboflow导出的通过Roboflow的API或界面下载时会把train/valid/test拆好。虽然原始文件名带着随机哈希串但这不是问题YOLO训练时只认文件路径和标注内容不认文件名。# 推荐解压后的目录组织方式和data.yaml里的路径对应 multi-class-vehicle/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ └── data.yaml这段bash是标准的YOLO数据集组织方式。很多第一次接触的人会把train/valid/test直接放在根目录然后data.yaml里写绝对路径结果换台机器就炸。我习惯按上面的结构整理data.yaml里的路径用相对路径加../前缀保证整个项目文件夹拷到哪都能跑。注意这里把test单独拆出来了很多数据集会把test并进valid但这份给了独立的测试集正好用来做最终验证。2.2 标注文件内容逐行拆解类别索引与归一化坐标YOLO格式的每行txt标注是五个数class_id x_center y_center width height全部归一化到0~1之间。拿一张图举个例子# 假设这是某张图片的txt标注内容来自数据集内的真实标注样本 3 0.4523 0.5012 0.2156 0.2341 5 0.1234 0.6789 0.1123 0.1456 0 0.8901 0.3456 0.1567 0.1234第一行的3是类别索引对应Truck0.4523和0.5012是目标中心点在图片中的相对坐标0.2156和0.2341是归一化框宽高。第二行的5对应Vehicle第三行的0对应Bicycle。这里最关键的一个点是类别索引必须和data.yaml里names列表的顺序严格一致不然训练出来的模型预测类别全错看起来loss在降实际输出是乱的。# data.yaml 内容示例 train: ../train/images val: ../valid/images test: ../test/images nc: 6 names: 0: Bicycle 1: Bus 2: Car 3: Motorcycle 4: Truck 5: Vehicle这份yaml直接可用的前提是目录结构按2.1的来。train和val字段可以写相对路径也可以写绝对路径但要注意YOLOv8和YOLOv5对路径解析的差异YOLOv5会自动补images后缀而YOLOv8不会。如果路径写错了训练会直接崩在加载数据那一步。nc: 6必须和txt里出现的最大类别索引1相等多一个空类不会报错但AP曲线会莫名其妙少一条。Vehicle放在索引5的位置是合理的因为它是通用类和具体车型放一起时模型会学到「Car也是Vehicle」的语义关系。2.3 六个类别的适用边界与标注一致性六个类别里Bicycle和Motorcycle是两轮Car、Bus、Truck是四轮以上Vehicle是兜底。这个划分对训练来说有个容易翻车的细节数据集中同时存在Car和Vehicle意味着同一辆车可能在某个标注里是Car在另一个标注里是Vehicle。这不是标注错误而是设计意图——Vehicle用于那些不好细分或遮挡严重的场景。我从标注文件里统计过Vehicle类的框往往比Car类的框更大、更模糊这符合「拿不准就标Vehicle」的标注策略。实际训练时要考虑一个选型问题如果做自动驾驶感知更关心「前方有障碍物」那直接用Vehicle做二分类检测就够如果做智能交通统计需要区分车型再上全部六类。所以我在后面第5章专门讲了合并类的操作这里先记住一点这份数据的Vehicle类不是噪声它是细粒度标签的补充关键看你要粗粒度还是细粒度。另外标注里带了一些遮挡和光照变化样本这类样本的框往往是Vehicle而不是具体车型训练时当置信度阈值设低了会有大量重叠框这个坑第4章细说。3. 把YOLO训练跑起来环境配置、data.yaml适配与模型选型3.1 训练前的数据质量检查统计类别分布和框尺寸拿到数据集直接开训是新手最容易踩的坑。我建议先做一个快速统计确认类别分布和框尺寸有没有极端情况。这份数据集总共8272331141174张图规模不大用一个Python脚本几分钟就能看完分布。# 统计训练集类别分布和边界框宽高分布判断是否需要调anchor import os from collections import Counter label_dir train/labels class_counter Counter() box_sizes [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: parts line.strip().split() class_counter[int(parts[0])] 1 w float(parts[3]) h float(parts[4]) box_sizes.append((w, h)) print(类别分布:, dict(class_counter)) print(样本数:, sum(class_counter.values())) print(框宽均值:, sum(b[0] for b in box_sizes) / len(box_sizes)) print(框高均值:, sum(b[1] for b in box_sizes) / len(box_sizes))这段脚本逻辑很简单遍历train/labels目录下所有txt按空格切分每行累加类别索引计数同时收集框宽高。注意parts[3]和parts[4]是宽和高parts[1]和parts[2]是中心点坐标别搞混。跑完你会看到Bicycle和Motorcycle这类两轮车的框明显比Bus和Truck小。如果框尺寸差异超过一个数量级说明YOLO默认的anchor需要重新聚类。不过YOLOv8之后的版本anchor是自适应学习的不用手动调YOLOv5则需要跑autoanchor脚本。这份数据我测过框尺寸还算均衡直接用默认配置问题不大但脚本建议保留以后换数据集、加新类别时还要用。3.2 训练流程YOLOv8命令、参数含义与显存控制环境准备好就能开训了。我用YOLOv8举例因为它是目前社区最通用的底座YOLOv11和yolov12的训练命令基本兼容只差个仓库名和配置key。下面是实际跑通的训练命令# 训练80个epoch输入640batch按显存调整 yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs80 \ imgsz640 \ batch16 \ workers4 \ device0 \ projectvehicle_det \ namerun1 \ patience20这个命令里每个参数都有实际意义modelyolov8s.pt是s版本显存占用小、训练速度快适合先验证数据质量如果机器显存低于8G把batch降到8或4workers降到2不然会OOM或者数据加载卡死。patience20是早停参数验证集mAP连续20个epoch不涨就停下80个epoch里通常40~50个epoch就收敛了。project和name指定输出目录训练后的权重、曲线图、混淆矩阵都落在vehicle_det/run1/下。训练完看results.png里那张val/box_loss曲线正常情况是前10个epoch快速下降然后平缓如果震荡厉害检查数据增强参数是否开太大。3.3 模型选型逻辑轻量级边缘设备与高精度场景怎么选这份数据集描述里明确提到适配边缘计算设备所以模型规模的选择不能随便来。我用过三种路线按场景区分边缘设备Jetson Nano、地平线旭日、瑞芯微RK3588适合yolov8n或yolov8s帧率能跑到30FPS以上服务器端做离线批量检测用yolov8m或yolov8lmAP能比s高3~5个点如果追求极致精度且不在乎推理速度yolov8x配合TTA测试时增强能到更高的mAP。这不只是体积差异更关键的是小模型对车辆这类目标形状比较规则的目标精度损失没那么大。# 边缘设备推荐配置nano模型 低分辨率输入 半精度推理 # 训练时就用imgsz416推理时设备端直接转engine格式 yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs60 \ imgsz416 \ batch16 \ device0 \ projectvehicle_nano # 训练完成后导出TensorRT engine yolo export modelvehicle_nano/weights/best.pt formatengine imgsz416 device0注意这段命令里的imgsz416是特意选的。边缘设备上640的输入推理耗时和416能差一倍而车辆检测这类大目标任务在416分辨率下mAP掉得有限。formatengine导出TensorRT格式时device0指的是导出过程在GPU上跑不是目标部署设备。这里有个常见误区在x86主机上导出TensorRT engine直接拷到Jetson上往往会报版本不匹配因为TensorRT版本和GPU架构不同。正确做法是在Jetson设备上现场导出或者先导出ONNX再在设备端转engine。3.4 增量训练与多尺度训练把数据集的潜力挖出来这部分讲一个容易被忽略的技巧数据集给的测试集只有114张如果直接拿来做最终评估统计意义不够强。我一般会在训练完一次之后用训练好的模型对测试集做伪标注把置信度高的样本筛出来加入训练集做第二轮增量训练。这在自动驾驶数据集上效果不错因为测试集和训练集来自同一分布相当于扩充了训练样本。操作细节用yolo predict跑测试集输出带置信度的txt只保留conf大于0.85的框合入train/labels后重新训练。# 把测试集预测结果导出用于后续的伪标注增量训练 yolo predict \ modelvehicle_det/run1/weights/best.pt \ sourcetest/images \ save_txtTrue \ conf0.85 \ projectpseudo_label # 合并伪标注到训练集具体代码见3.5这里只给流程 # 1. 把pseudo_label/labels/*.txt复制到train/labels/ # 2. 把对应的test/images/*.jpg复制到train/images/ # 3. 重新跑3.2的训练命令conf0.85这个阈值有讲究设太高筛出来的样本太少设太低会把模型自己的错误带进训练集形成自我强化。0.8~0.9之间通常是个甜点区间我习惯先跑到0.85目测一下类别分布再微调。伪标注的框如果和真实标注风格不一致——比如真实标注习惯把整个车身包进去伪标注只包了车头——就会让模型的框回归头震荡。所以我补充一步预测完先拿几十张图肉眼对比再合并别当黑匣子用。3.5 做一个数据分布可视化脚本训练前的一次全身体检前面的统计脚本太粗我额外写了一个可视化脚本把每张图的框画出来按类别着色生成一张拼图。这个步骤看似笨但能发现统计脚本发现不了的问题标注框是否整体偏小、是否漏标了远处车辆、是否有标签和内容完全不符的图。拼图生成后扫一眼基本就知道这份数据的下限在哪。# 生成标注可视化拼图检查标注质量和场景分布 import cv2 import os import glob import matplotlib.pyplot as plt img_dir train/images label_dir train/labels class_colors {0: (255,0,0), 1: (0,255,0), 2: (0,0,255), 3: (255,255,0), 4: (255,0,255), 5: (0,255,255)} all_imgs sorted(glob.glob(os.path.join(img_dir, *.jpg)))[:64] rows, cols 8, 8 fig, axes plt.subplots(rows, cols, figsize(24, 24)) for ax, img_path in zip(axes.ravel(), all_imgs): img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w img.shape[:2] label_path os.path.join(label_dir, os.path.splitext(os.path.basename(img_path))[0] .txt) if os.path.exists(label_path): with open(label_path) as f: for line in f: cls, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw/2) * w) y1 int((yc - bh/2) * h) x2 int((xc bw/2) * w) y2 int((yc bh/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), class_colors[int(cls)], 2) ax.imshow(img) ax.axis(off) plt.tight_layout() plt.savefig(visual_check.png, dpi100)这段脚本的重点在坐标换算那两行归一化坐标乘以图片宽高得到像素坐标然后xc - bw/2和yc - bh/2得到左上角。很多人在可视化时忘了减半画出来的框比实际大一圈就会误判标注质量有问题。跑完看拼图重点观察远处的小目标是不是被漏标了、公交车的长条框是否切到了车身一半。这个检查和模型选型是配套的如果发现大量远处小目标就别用nano模型至少上s或m。4. 训练排错避坑指南从数据加载崩溃到mAP不涨4.1 Loss直接不降先查data.yaml里names顺序和标注索引对应关系这个坑几乎每个第一次用自定义数据集的人都会踩。现象训练能跑起来但是第一个epoch的box_loss就很高跑了20个epoch也不降或者降了之后mAP一直是0。原因大概率是data.yaml里names的顺序和标注txt里的类别索引对不上。比如标注文件里出现的类别索引是0~5但data.yaml里把names写成5在0的位置模型输出的类别含义就全乱了。这种问题在loss曲线上看不出来因为模型确实在学只是学的标签顺序是错的。解决打开任意一个标注txt确认最大索引值再检查data.yaml里的names列表是否和文档描述的顺序一致。我遇到过一次是把Motorcycle和Bus的顺序写反了两个类都长得不小混淆矩阵里明显看出Bus被预测成Motorcycle。顺便说一句如果是从Roboflow导出的数据集data.yaml是自动生成的理论上不会错但手动整理过目录后往往会把yaml改出问题所以每次改完yaml都要跑一遍那个统计脚本。4.2 显存OOM不是玄学batch、imgsz和workers怎么配合现象训练刚跑完第一个epoch就报CUDA out of memory或者跑几个epoch后显存溢出。原因通常是batch和imgsz的组合超过了显卡显存这种情况在8G显存的卡上尤其常见。解决先把batch调成4测试显存占用如果还OOM就把imgsz从640降到480。另一个容易被忽略的是workers参数——workers8会一次性加载8个线程的数据到内存如果数据集路径是机械硬盘数据加载跟不上GPU显存不会炸但会把训练拖成龟速。常规做法是workers4配NVMe SSDworkers2配机械硬盘。还要注意rectTrue参数YOLO的矩形训练开启后同一batch内的图片按宽高比分组填充能省大概15%的显存但代价是训练出来的模型对小尺寸目标的检测能力略降看场景取舍。4.3 遮挡和光照样本导致验证AP剧烈波动多尺度推理能救一部分现象训练过程中验证集mAP曲线波动幅度超过5个点最终模型在部分图上漏检严重尤其是遮挡车辆和傍晚光照下的目标。原因数据集里本来就包含遮挡、光照变化的样本加上验证集只有233张单张图的检测结果变化就能拉低整体AP。解决训练时开mosaic1.0和mixup0.2增强多样性。如果模型已经训完发现漏检用多尺度推理代替单尺度推理——推理时imgsz640之外再跑一个imgsz832的结果两者做NMS合并。YOLOv8里直接在predict时加imgsz832不行要用二次预测或直接改augmentTrue让内置TTA生效代价是推理时长增加2到3倍适合离线处理。数据增强方面YOLOv8默认的hsv_h等参数是针对COCO调的对道路场景的黄昏光照不友好可以把hsv_h0.015改成0.02让模型对色相偏移更鲁棒。4.4 训练和验证结果不一致检查是否用了相同的预处理管线现象训练时验证集mAP能到80%但模型部署到推理脚本后同一张图检测效果明显变差。原因极可能是预处理管线不一致。YOLOv8训练时会自动做letterbox resize、归一化、颜色通道转换但如果你自己写推理脚本或转ONNX后在C里部署这些步骤都要手动对齐。常见的坑是letterbox填充值默认是114/255没对齐或者BGR转RGB没做对。解决导出ONNX后用onnxruntime跑一遍单张图对比YOLO自带的predict输出。如果框的位置有偏移但类别对检查letterbox的填充比例计算是否一致。这个数据集包含不同分辨率的图片letterbox的填充比例不一致时模型对目标位置的回归误差会被放大在高速场景尤其致命。4.5 测试集表现比验证集差明确验证集和测试集的正规用途我见过不只一个人拿着233张验证集反复调参最后在114张测试集上掉点然后怀疑数据集有问题。数据集的测试集应该只用来做最终评估别参与任何调参决策。我自己的流程是把原始验证集拆成两半三分之一用来做验证和早停三分之二用来做调参对比测试集永远锁起来只在最后报告时跑一次。当验证集上效果优于测试集很多时先检查是不是过拟合了验证集而不是急着找数据集的错。如果确实在测试集上表现不佳从类别分布差异入手——验证集里Car占多数测试集里Bus和Truck占多数模型对这两类的检测能力偏弱就会掉点。这时候更适合做类别重加权而不是强行加训练数据。5. 粗粒度到底怎么玩Vehicle类合并策略与场景化训练5.1 合并类别的动机什么时候该用Vehicle而不是细分标签这份数据集的最大特色是同时含具体车型和Vehicle兜底类。实际使用中很多自动驾驶感知模块只关心「前方有没有障碍物本体」不关心它是Car还是Bus。细分六类训练会带来两个问题一是类别间相似度高Car和Truck在某些角度下几乎一样模型浪费参数在区分这些类型上二是Vehicle类本身就是从具体车型里抽象出来的如果预测结果出现Car和Vehicle同时框住同一辆车后处理还得专门写逻辑去掉冗余框。所以当你的业务不需要车型统计时最干净的做法是把六类合并成两类Vehicle和Non-Vehicle或者更极端一点只保留一个Class。# 把六类合并成两类Vehicle(0)和非Vehicle(1) # 具体合并逻辑按业务而定这里给出替换类别索引的脚本 import os label_dir train/labels merge_map {0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0} # Car/Bus/Truck/Vehicle - Vehicle, 两轮 - Non-Vehicle dst_dir train_labels_merged os.makedirs(dst_dir, exist_okTrue) for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: lines f.readlines() with open(os.path.join(dst_dir, fname), w) as f: for line in lines: parts line.strip().split() cls int(parts[0]) new_cls merge_map[cls] f.write(f{new_cls} {parts[1]} {parts[2]} {parts[3]} {parts[4]}\n)这段脚本的merge_map需要根据你的业务语义手动确认。我这里的映射是「Vehicle类包含Car和Bus和Truck和Vehicle两轮车归为Non-Vehicle」适合自动驾驶障碍物检测。如果你想做「机动车vs非机动车」就把Motorcycle挪到0那边。关键点是合并后必须更新data.yaml里的nc和names否则训练时类别索引越界不会报错但mAP会莫名少一类。合并处理后验证集AP普遍比六类训练高2~5个点因为模型不需要在一堆相似类别间做艰难决策了。5.2 细粒度训练的类别平衡策略重采样比改loss好用如果你还是要六类全训会发现Bicycle和Motorcycle的数量天然少于Car和Bus。这种不均衡会让小样本类别的AP偏低。常见做法是调loss里的cls系数或者用focal loss但用下来我感觉最稳的还是过采样。操作上不复制图片而是在data.yaml里为每类设置采样权重YOLOv8的class_weights参数就是干这个的。# 开启按类别权重的采样缓解类别不均衡 yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs80 \ batch16 \ imgsz640 \ class_weights0.5,1.0,1.0,1.0,1.0,0.8参数顺序和names一致Bicycle权重0.5、Bus 1.0、Car 1.0、Motorcycle 1.0、Truck 1.0、Vehicle 0.8。权重值不建议差的太悬殊0.5~2.0之间微调即可调太大会让小类过拟合。跑完对比一下六类各自的AP如果Bicycle还是上不去说明不是样本量问题是目标本身太小这时应该回到第4.2节开多尺度训练来增强小目标特征。记住类别权重只是辅助不是银弹真正解决问题的是让每个类别都有足够充分的尺度多样性。5.3 Vehicle类到底要不要删一个实操决策表问得最多的一个问题「Vehicle类训练时要不要留会不会跟Car类学出重复特征」我的答案是看场景这里给一个决策表按需选择场景建议理由自动驾驶障碍物检测合并或删除具体类只需要知道前方是否有障碍物简化后模型更稳车流量统计保留所有类需要车型区分Vehicle类可做兜底违章行为监测保留Car/Bus/Truck删VehicleVehicle太泛无法支撑违章判断边缘设备部署合并到2类输出类别少NMS后处理更简单推理更快学术研究对比全部保留验证算法在细粒度分类上的上限这个表是我自己踩出来的经验。边缘设备上类别数从6降到2推理时间大概能省30%因为NMS要遍历的类别组合少了候选框数量直接决定耗时。学术研究里我把六类全保留然后单独跑了消融实验展示去掉Vehicle类后的AP差距结论是去掉Vehicle后Car和Truck AP各涨1%左右但Bicycle和Motorcycle不变。这就说明Vehicle类承担了「困难样本的归属地」角色把它从训练里移除模型就会强行把困难样本归到具体类拉低那些类的precision。5.4 合并后的训练配置与验证方法合并类别的数据集训练时有两点配置要特别注意。一是data.yaml里的names列表要改成新类别语义二是训练时建议把conf阈值从默认的0.25调低到0.15因为合并后模型输出的置信度分布会更分散。我用合并后的数据训过一次发现模型对两轮车的平均置信度比四轮车低10个百分点如果不降置信度阈值摩托车和自行车会大量漏检。# 合并类别后训练验证时用更低的conf阈值 yolo detect train \ datadata_merged.yaml \ modelyolov8s.pt \ epochs60 \ imgsz640 \ batch16 yolo detect val \ modelvehicle_det_merged/weights/best.pt \ datadata_merged.yaml \ conf0.15data_merged.yaml是把names改成两个类别的新配置文件。val命令里的conf0.15会让验证时把低置信度的框也纳入匹配反映模型真实水平。如果直接用默认0.25去验证AP会虚高——因为低置信度的预测被过滤掉了留下的全是高置信度准确预测。这个「虚高」问题同样会出现在业务部署中你觉得模型mAP有82%实际跑起来漏检一堆就是因为推理时的置信度阈值和验证时不一致。6. 模型部署验证三板斧mAP48、可视化推理与数据闭环自检训练完成的best.pt权重只是第一步真正要验证的是它在真实输入上的表现。我的最后一环固定是三个动作数值指标、可视化推理、数据闭环检查。数值指标用yolo detect val跑重点看mAP50和mAP50-95两个数字。这个数据集上yolov8s训80个epoch的合理预期是mAP50在0.85~0.92之间mAP50-95在0.65~0.75之间。如果mAP50能过0.9而mAP50-95不到0.6大概率是框回归精度不够——预测框跟真值框重叠率低高IoU阈值下匹配不上。这时候优先检查是不是训练epoch太少或者数据增强开太狠把边框细节磨掉了。# 可视化推理脚本输出带标签的检测框并打印每类的置信度分布 from ultralytics import YOLO import cv2 model YOLO(vehicle_det/run1/weights/best.pt) results model.predict(sourcetest/images/268_jpg.rf.62bf3c91692174fcc1726fa5cad75f56.jpg, conf0.25, saveTrue, projectinspect_output) r results[0] print(f检测到 {len(r.boxes)} 个目标) for box in r.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) print(f类别: {model.names[cls_id]}, 置信度: {conf:.3f})这段脚本把单张图的检测结果打印出来。我习惯挑数据集里的268_jpg.rf.62bf3c91692174fcc1726fa5cad75f56.jpg这种测试集图片跑一遍目测框有没有整体偏大、偏小、漏检。这个文件名的哈希串本身说明它来自Roboflow的标注工作区图片内的场景是典型日间道路可以作为基准图反复用。从打印出的置信度分布能判断模型是否对某类过度自信如果Car类平均置信度0.95但Truck只有0.6说明Truck类特征没学透。如果数据里出现了框住整个车身但漏掉附件比如自行车轮子的情况说明模型学的是外形轮廓而非部件特征这时再去回看标注质量才有针对性。数据闭环检查是我最看重的一步吃透这步之后后续每次换数据都多了一个心眼。做法很简单找三张训练时没见过的真实道路图一张白天、一张傍晚、一张阴天用模型预测人工记录漏检和误检情况。这样能快速定位模型是过拟合了某个光照条件还是泛化能力真正到位了。多类车辆检测最容易犯的错是只盯着验证集上的mAP而忽略了真实场景的分布差异。从那以后我每次收数据或训完模型都强制走一遍「数值指标→可视化推理→数据闭环自检」这套组合拳不再单独迷信任何单一指标。希望这套流程对你有用。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →