
简介本资源为面向YOLOv5目标检测实践的车辆检测数据集适合计算机视觉入门者、自动驾驶与交通监控方向的研究人员及学生使用可解决车类目标检测训练数据缺失的问题。压缩包共2000个文件约147.64MB包含1285个txt标签、1284张jpg图像和1284个xml标注文件txt提供边界框坐标xml记录类别、面积等详细信息图像与标注一一对应采用PASCAL VOC格式类别统一为car。目前已有4474人学习下载热度较高。读者可基于该数据集完成YOLOv5模型配置、数据预处理与增强、超参数调优及mAP评估等完整流程也可用于迁移学习与光照、遮挡、视角差异等场景下的检测优化实验是车辆检测任务中可直接上手训练与验证的实用数据资源。1. 拿到 car 车辆检测数据集.rar 之后先别急着解压训练你从某个渠道拿到一个叫car车辆检测数据集.rar的压缩包标题里还挂着 yolov5。多数人的第一反应是解压、改data.yaml、python train.py三连然后盯着 loss 曲线发呆。我见过太多人卡在这一步数据集里到底是什么格式、标注是不是 VOC、类别名是不是 car、图片有没有重复、训练集验证集怎么分全都没看就开跑最后 mAP 上不去回头怪模型不行。这篇笔记就围绕这个压缩包讲清楚一件事一份 car 车辆检测数据集从解压到用 yolov5 训出能用的权重中间到底要做哪些判断和动作。适合手里已经有类似数据集、想跑通车辆检测的工程师也适合准备做 yolov5 训练自己数据集这类任务、但还没理清数据侧工作的人。核心不是教你点按钮而是让你在动手前就知道这份数据能不能用、怎么用、哪里会翻车。2. 拆开 car 车辆检测数据集目录结构、标注格式与类别定义2.1 先看清压缩包里有什么再决定怎么处理拿到car车辆检测数据集.rar第一步不是解压到训练目录而是解压到一个临时目录单独看。车辆检测数据集常见的组织方式有三种VOC 风格AnnotationsJPEGImagesImageSets、YOLO 风格imageslabels每张图对应一个同名 txt、以及混合风格图片一堆、标注一个 csv 或 json。这三种的处理路径完全不同先看清楚能省掉后面大量返工。在 Linux 或 macOS 下我一般这样快速摸清结构# 解压到临时目录不要直接放进训练工程 mkdir -p /tmp/car_ds tar -xf car车辆检测数据集.rar -C /tmp/car_ds 2/dev/null || unrar x car车辆检测数据集.rar /tmp/car_ds/ # 看顶层目录和文件数量 find /tmp/car_ds -maxdepth 2 -type d | head -30 echo --- 图片数量 --- find /tmp/car_ds -type f \( -iname *.jpg -o -iname *.png -o -iname *.jpeg \) | wc -l echo --- 标注文件数量 --- find /tmp/car_ds -type f \( -iname *.xml -o -iname *.txt -o -iname *.json \) | wc -l这段命令做三件事解压到隔离目录、列出两层目录结构、分别统计图片和标注文件数量。参数上-maxdepth 2是为了不被深层目录刷屏-iname忽略大小写避免漏掉.JPG。如果图片数和标注数对不上比如 5000 张图只有 3000 个 xml那这份数据本身就有缺失得先决定是丢弃无标注图还是补标。提示.rar在部分 Linux 环境需要unrar没有的话先装如果解压报错先确认文件是否完整别在损坏的包上浪费时间。2.2 标注格式决定你后面所有脚本的写法看清结构后要确认标注格式。VOC 的 xml 里是bndbox的xmin/ymin/xmax/ymaxYOLO 的 txt 里是归一化的class cx cy w h。车辆检测数据集里如果类别只有 car 一类YOLO 格式每行第一个数就是 0。这里有个高频坑有些数据集号称 YOLO 格式但坐标没归一化还是像素值直接拿去训练会让 loss 爆炸。判断是否归一化很简单写个脚本抽查import os, glob label_dir /tmp/car_ds/labels # 按实际路径改 bad 0 for txt in glob.glob(os.path.join(label_dir, *.txt))[:200]: with open(txt) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad 1 continue vals [float(x) for x in parts[1:]] # YOLO 归一化坐标应在 0~1 之间 if max(vals) 1.5: bad 1 print(疑似未归一化或格式异常的行数:, bad)逻辑是抽查前 200 个标注文件逐行检查字段数和坐标范围。如果max(vals)远大于 1基本可以判定是像素坐标需要自己除以宽高归一化。参数上[:200]是抽样正式处理时要去掉切片全量跑一遍。类别定义也要确认有的数据集把 car、bus、truck 混在一起如果你只做 car得决定是保留多类还是过滤成单类。2.3 划分训练集验证集别用随机切分糊弄很多人直接random.shuffle切 8:2结果同一段视频的相邻帧被分到训练和验证两边验证集 mAP 虚高上线就翻车。车辆检测数据集如果来自视频抽帧必须按视频或场景切分。常见做法是先按文件名前缀或时间戳聚类保证同一来源的帧只进一个集合。import os, glob, random, shutil img_dir /tmp/car_ds/images out_root /tmp/car_split random.seed(42) imgs sorted(glob.glob(os.path.join(img_dir, *.jpg))) # 按文件名前缀分组模拟按场景切分 groups {} for p in imgs: key os.path.basename(p).split(_)[0] groups.setdefault(key, []).append(p) keys list(groups.keys()) random.shuffle(keys) split int(len(keys) * 0.8) train_keys, val_keys keys[:split], keys[split:] for name, ks in [(train, train_keys), (val, val_keys)]: os.makedirs(f{out_root}/images/{name}, exist_okTrue) os.makedirs(f{out_root}/labels/{name}, exist_okTrue) for k in ks: for p in groups[k]: shutil.copy(p, f{out_root}/images/{name}/) lp p.replace(/images/, /labels/).replace(.jpg, .txt) if os.path.exists(lp): shutil.copy(lp, f{out_root}/labels/{name}/)这段脚本按文件名前缀分组后再切分避免同源帧泄漏。random.seed(42)保证可复现0.8是训练占比可按数据量调整。复制时同步搬运同名 label缺失的跳过。跑完检查两个集合的图片数比例如果 val 太少比如不足 200 张评估结果波动会很大。3. 用 yolov5 训练 car 数据集配置、命令与超参数怎么定3.1 data.yaml 和模型配置三个必须改对的地方yolov5 训练入口认的是data.yaml里面train、val、nc、names四项必须和你的实际数据一致。车辆检测单类时nc: 1names: [car]。这里最常见的错误是路径写成相对路径但工作目录不对或者nc和 names 数量不匹配训练直接报错或类别错位。# /tmp/car_split/car.yaml train: /tmp/car_split/images/train val: /tmp/car_split/images/val nc: 1 names: [car]路径建议用绝对路径省得被工作目录坑。nc是类别数单类就是 1如果你保留了 bus、truck就要相应改大并补全 names。模型配置方面车辆检测一般从yolov5s.pt起步速度和精度平衡如果目标是小目标远距离车辆可以考虑yolov5m或调大输入尺寸。不要一上来就上yolov5x显存和训练时间会让你怀疑人生。3.2 训练命令与关键超参数别全用默认值yolov5 的训练命令本身不复杂难的是超参数。下面是我在单卡 8G 显存上跑车辆检测的常用起手式python train.py \ --data /tmp/car_split/car.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --project runs/car \ --name exp1 \ --cache逐项说--img 640是输入尺寸车辆目标如果普遍偏小可以提到 960但显存翻倍--batch 16在 8G 卡上比较稳爆显存就降到 8--epochs 100是起点车辆检测数据量小的话 50 到 80 也能收敛--hyp选 low 增强适合小数据集数据量大可以换hyp.scratch-high.yaml--cache把图片缓存到内存加速但数据量大时吃内存内存紧张就去掉。关于 yolov5 超参数重点盯三个学习率lr0、锚框anchors、以及数据增强里的mosaic。lr0默认 0.01小数据集可以降到 0.001 更稳anchors 如果和你的车辆尺度差很多可以用python utils/autanchor.py重新聚类mosaic 增强对车辆检测通常有帮助但如果你的场景里车辆密集重叠mosaic 可能引入不真实拼接可以适当降低概率。3.3 训练过程怎么看loss、mAP 和什么时候该停训练启动后终端会打印每轮的 box_loss、obj_loss、cls_loss 和验证集 mAP。box_loss 下降说明定位在收敛obj_loss 反映目标置信度cls_loss 在单类任务里意义不大。真正要看的是mAP0.5和mAP0.5:0.95。如果 mAP 在前 20 轮就卡住不动常见原因是学习率太大、标注质量差、或者数据里负样本太多。我一般会在训练中途用验证集跑一次推理肉眼看看漏检和误检python detect.py \ --weights runs/car/exp1/weights/best.pt \ --source /tmp/car_split/images/val \ --img 640 \ --conf-thres 0.25 \ --save-txt--conf-thres 0.25是置信度阈值调低能看漏检调高能看误检。--save-txt把预测框存下来方便和标注对比。如果发现大量车辆被漏检先别调模型回去看标注是不是漏标了如果误检多看看是不是把类似车辆的物体比如车尾广告牌标进去了。4. 车辆检测数据集训练的避坑与排查五条血泪经验4.1 现象训练 loss 正常但 mAP 极低原因通常是标注坐标和图片不匹配比如图片被 resize 过但标注没同步或者归一化时用错了宽高。解决方法是抽几张图把标注框画出来肉眼核对用cv2.rectangle叠加显示确认框的位置和大小对得上。4.2 现象训练到一半显存溢出原因可能是--cache把大量图片读进内存或者--img设太大、--batch没相应调小。解决办法是先去掉--cache把 batch 降到 8 或 4或者用--img 512过渡。如果还爆检查是不是 dataloader 的 worker 数太高--workers 4比较稳。4.3 现象验证集 mAP 很高但实际推理一塌糊涂这是典型的分布不一致。验证集和训练集同源实际场景光照、角度、车型都不同。解决办法是尽量让验证集覆盖真实场景或者从实际场景里补一批标注数据进训练集。别迷信验证集数字拿真实视频跑一遍 detect 才是硬道理。4.4 现象类别名对不上导致训练报错data.yaml里names写的是car但标注文件里类别索引是 1 而不是 0或者反过来。解决方法是统一检查所有 label 文件第一列的最大值确保它小于nc。单类任务里第一列必须全是 0。4.5 现象训练速度慢得离谱原因可能是图片分辨率过大、dataloader worker 太少、或者磁盘 IO 瓶颈。解决办法是把图片预 resize 到接近训练尺寸--workers设成 CPU 核数的 2 到 4 倍数据放在 SSD 上。如果用了--cache还是慢检查是不是内存不够导致频繁换页。5. 从训练到落地车辆检测模型的验证、导出与部署前检查训练出best.pt只是中间产物真正要用起来还得过验证和导出这两关。我习惯在训练结束后做三件事用独立测试集跑一次完整评估、导出 ONNX 检查算子兼容性、以及在目标硬件上做一次推理延迟测试。这三步能提前暴露大部分部署问题。独立测试集评估不要用训练时的验证集而是另外留一批完全没参与训练的数据。用 yolov5 自带的val.pypython val.py \ --weights runs/car/exp1/weights/best.pt \ --data /tmp/car_split/car.yaml \ --img 640 \ --task test \ --save-json--task test会走 test 分支前提是 data.yaml 里配了 test 路径。--save-json输出 COCO 格式结果方便和其他模型对比。重点看 mAP0.5 和 recall车辆检测里 recall 往往比 precision 更重要漏检一辆车可能比误检更严重。导出 ONNX 是为了脱离 PyTorch 环境部署比如上 ROS 无人小车或者 RK3568 这类边缘设备python export.py \ --weights runs/car/exp1/weights/best.pt \ --include onnx \ --img 640 \ --opset 12 \ --simplify--opset 12兼容性较好--simplify会做图优化。导出后务必用 onnxruntime 跑一张图对比 PyTorch 和 ONNX 的输出差异如果框位置偏差大说明有算子没对齐。部署到树莓派或 RK3568 时还要考虑量化INT8 量化能提速但可能掉点建议先用 FP16 试精度不够再回退。最后说个我自己的习惯每次训完模型我都会把best.pt、data.yaml、训练命令和当时的 git commit 记在一个train_log.md里。车辆检测数据集换一版、超参数改一个结果可能差很多没有记录就等于没有后悔药。这个习惯帮我省过好几次“上次那个能跑的配置到底是啥”的折腾。希望帮到你。本文还有配套的精品资源点击获取