简介Traffic-Net 是一个面向计算机视觉与深度学习实践者的交通场景图像数据集可用于训练交通状态识别、火灾检测与事故预警等模型适合具备 Python 基础、正在做目标检测或图像分类项目的开发者与学习者。资源包共 10 个文件以 jpg 图像为主体另含 1 个 Python 脚本、1 个 json 类别配置、1 个 md 说明文档和 1 个 license 授权文件压缩包约 707KB体积轻便便于快速下载与本地部署。数据集包含 4400 张图像覆盖事故、交通密集、火、稀疏流量四个类别每类 1100 张其中 900 张用于训练、200 张用于测试划分清晰可直接接入常见深度学习训练流程。配套脚本与类别映射文件能帮助读者快速完成数据加载、类别索引对照与模型训练验证省去自行整理标注的繁琐工作。目前已有 686 人学习下载适合作为交通监控与异常事件识别方向的入门或课程实验素材。1. 交通、火灾、事故图像数据集为什么你的检测模型总在真实场景翻车你拿 COCO 或 ImageNet 预训练的权重去跑路口监控白天还行一到夜间逆光或者雨雾天漏检率直接飙到让你怀疑人生。这不是模型结构的问题是训练数据分布和真实场景之间的鸿沟。交通、火灾、事故这三类图像数据集解决的就是这个鸿沟——它们提供的是特定场景下的标注样本让模型见过足够多的“坏情况”而不是只在干净图片上刷指标。这类数据集通常包含道路车辆、行人、交通标志、火焰烟雾、车辆碰撞与侧翻等类别标注格式以 VOC XML、COCO JSON 或 YOLO TXT 为主。适合谁用做智慧交通监控、工业消防预警、保险事故定损的算法工程师以及想用 Python 和深度学习跑通一个完整检测 pipeline 的学生。你不需要从零写标注工具但需要知道怎么把数据集喂给模型、怎么划分、怎么避免过拟合到某个摄像头视角。下面按“拿到数据 → 跑通训练 → 排查翻车”的顺序拆开讲。2. 数据集选型与 Python 环境搭建从下载到能跑通第一行代码2.1 交通、火灾、事故三类数据集的差异与合并策略交通类数据集通常来自固定摄像头或车载视角标注对象是车、人、信号灯特点是背景重复度高、目标尺度变化大。火灾类数据集更关注火焰和烟雾的纹理与颜色分布难点在于火焰形态不固定、烟雾半透明标注边界模糊。事故类数据集往往从交通数据中二次筛选标注碰撞、翻车、碎片散落等状态样本量通常最少但误检代价最高。我一般不会把三类直接混在一起训练一个多分类模型而是先分任务交通检测用 YOLO 系列火灾烟雾用语义分割或分类事故状态用检测加时序判断。如果你只有单帧图像事故类可以退化为“事故/非事故”二分类或者把碰撞车辆作为一个额外类别加入交通检测。合并时注意类别 ID 不要冲突比如交通数据集里 car 是 0事故数据集里 car 也是 0但 fire 是 1合并后要重新映射成统一字典。常见做法是建一个data.yaml描述路径和类别名YOLOv5/v8 都认这个格式。下面是一个合并后的示例# data_merged.yaml path: ./datasets/merged # 数据集根目录 train: images/train val: images/val test: images/test nc: 6 # 类别数 names: [car, person, traffic_light, fire, smoke, accident]逻辑说明path是根目录train/val/test是相对路径下的图片文件夹YOLO 会自动去找同名的labels文件夹读 TXT 标注。nc必须等于names长度否则训练时分类头维度对不上报错信息通常是IndexError: list index out of range。参数怎么改如果你只做交通检测把nc改成 3names只留前三类。注意类别顺序要和标注文件里的 class id 一致否则模型学出来的“car”可能是“fire”。2.2 Python 环境配置避开 vscode 和 conda 的版本坑热搜里一堆“python安装教程”“vscode python环境配置”但真正跑深度学习检测我建议直接用 conda 建虚拟环境别在系统 Python 里折腾。PyTorch 和 CUDA 版本对不上是新手翻车重灾区。截至我写这篇笔记时比较稳的组合是 Python 3.9 PyTorch 2.0 CUDA 11.8但你要根据自己显卡驱动去查对应表。# 创建虚拟环境 conda create -n detect python3.9 -y conda activate detect # 安装 PyTorchCUDA 11.8 示例具体命令去官网查 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLOv8 和常用图像库 pip install ultralytics opencv-python pillow matplotlib pandas逻辑说明conda create隔离依赖避免和系统包打架。--index-url指定 PyTorch 官方 wheel 源比默认源快且版本准。ultralytics包自带 YOLOv8 训练和推理接口opencv-python用来做数据增强和可视化。参数注意如果你没有 NVIDIA 显卡把cu118换成cpu但训练速度会慢到让你想放弃。验证安装是否成功import torch print(torch.__version__) print(torch.cuda.is_available()) # 有显卡应返回 True如果返回 False先检查显卡驱动再检查 CUDA 版本是否匹配。别急着装一堆包先把 torch 跑通再装其他。3. 从原始图片到 YOLO 格式标注转换与数据增强的实操细节3.1 VOC 转 YOLO坐标归一化和类别映射的四个边界坑很多交通和火灾数据集给的是 VOC XML每个 XML 对应一张图里面包含bndbox的xmin/ymin/xmax/ymax。YOLO 要的是归一化后的class_id x_center y_center width height全部除以图片宽高。转换脚本网上一搜一大把但下面这四个坑我全踩过。第一个坑图片尺寸不一致。XML 里不存图片宽高你得用 PIL 或 OpenCV 读原图。如果图片损坏或路径不对读出来宽高是 0除零直接报错。第二个坑坐标越界。标注时手抖把xmax写成大于图片宽度的值归一化后超过 1YOLO 训练时虽然不报错但会学到错误的位置。第三个坑类别名大小写和空格。Traffic Light和traffic_light会被当成两个类合并时要用strip().lower().replace( , _)统一。第四个坑空标注图片。有些负样本没有 XML转换后没有对应 TXTYOLO 默认会跳过但如果你手动生成了空 TXT反而会被当成背景训练。import os import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_dir, img_dir, out_dir, class_map): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() img_name root.find(filename).text img_path os.path.join(img_dir, img_name) if not os.path.exists(img_path): print(f图片缺失: {img_path}) continue with Image.open(img_path) as im: w, h im.size lines [] for obj in root.findall(object): name obj.find(name).text.strip().lower().replace( , _) if name not in class_map: continue cls_id class_map[name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 裁剪越界坐标 xmin max(0, min(xmin, w)) xmax max(0, min(xmax, w)) ymin max(0, min(ymin, h)) ymax max(0, min(ymax, h)) if xmax xmin or ymax ymin: continue x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) out_file os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_file, w) as f: f.write(\n.join(lines))逻辑说明class_map是类别名到 ID 的字典比如{car: 0, person: 1, fire: 2}。坐标裁剪保证不越界xmax xmin的无效框直接丢弃。归一化保留 6 位小数YOLO 读取时精度足够。参数注意如果你的数据集类别很多建议把class_map单独写成一个 JSON 文件训练和推理共用避免手滑写错。3.2 数据增强火灾烟雾场景别乱用马赛克增强YOLO 自带 mosaic、mixup、HSV 增强但火灾和烟雾检测要小心。Mosaic 把四张图拼成一张对交通检测提升明显因为车辆尺度变化大。但火焰和烟雾的纹理是连续的拼图后会出现不自然的边界模型可能学到“拼接线”而不是火焰特征。我一般对火灾数据关掉 mosaic只保留 HSV 和随机翻转。# 在 YOLOv8 训练配置里调整增强参数 from ultralytics import YOLO model YOLO(yolov8n.pt) model.train( datadata_merged.yaml, epochs100, imgsz640, batch16, mosaic0.0, # 火灾数据建议关掉 hsv_h0.015, # 色调增强火焰颜色敏感可调小 hsv_s0.7, hsv_v0.4, fliplr0.5, # 水平翻转交通和火灾都适用 flipud0.0, # 垂直翻转火焰倒置不自然关掉 degrees0.0, # 旋转角度交通场景可开 10 度以内 )逻辑说明mosaic0.0关闭马赛克hsv_h控制色调抖动火焰颜色是重要特征调太大会让红色火焰变成紫色模型学偏。flipud垂直翻转对火焰不自然关掉。degrees旋转对交通标志识别有帮助但火灾场景旋转后火焰方向改变可能引入噪声。参数怎么改如果你做交通检测mosaic1.0、degrees10.0都可以开火灾检测保守一点先跑 baseline 再逐项加增强看验证集 mAP 变化。4. 训练交通火灾事故检测模型参数、显存与收敛排查4.1 YOLOv8 训练命令与关键参数含义环境配好、数据转好直接上训练。下面是我常用的命令跑在单卡 8G 显存的机器上yolov8n是 nano 版本速度快但精度一般适合先跑通流程。yolo detect train \ datadata_merged.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ workers4 \ device0 \ projectruns/train \ nametraffic_fire_accident \ patience20 \ save_period10逻辑说明data指向 YAML 文件model是预训练权重epochs训练轮数imgsz输入尺寸batch批大小workers数据加载线程数device0用第一块 GPU。patience20表示验证集指标 20 轮不提升就早停省时间。save_period10每 10 轮存一次权重防止训练崩了没有后悔药。参数注意batch太大显存溢出报CUDA out of memory改成 8 或 4workers在 Windows 上有时会卡死设成 0 用主进程加载。训练开始后看控制台输出重点关注box_loss、cls_loss、mAP50。box_loss下降说明定位在变好cls_loss下降说明分类在变好。如果box_loss震荡不降检查标注框是否归一化正确如果cls_loss一直很高检查类别是否不平衡火灾和事故样本少可以加cls_pw或者过采样。4.2 显存不够时的降级方案与多尺度训练技巧8G 显存跑yolov8nimgsz640batch16基本是极限。如果你只有 6G 甚至 4G按下面顺序降先把batch降到 8再把imgsz降到 512还不行就换yolov8n的更小输入或者用梯度累积模拟大 batch。# 梯度累积示例batch4accumulate4等效 batch16 model.train( datadata_merged.yaml, epochs100, imgsz640, batch4, accumulate4, # 每 4 个 batch 更新一次权重 device0, )逻辑说明accumulate让模型在显存里只放 4 张图但梯度累加 4 次再更新效果接近 batch16。代价是训练速度稍慢但显存占用大幅下降。参数注意accumulate和batch的乘积不要超过你原本想要的等效 batch否则学习率要相应调整。多尺度训练是另一个技巧imgsz设成 640但训练时随机在 480 到 800 之间缩放让模型适应不同距离的目标。YOLOv8 默认开启多尺度但你可以通过scale参数控制幅度。交通场景中远近车辆尺度差异大多尺度能提升小目标召回。火灾场景中火焰大小不一同样受益。但多尺度会让 batch norm 统计量波动训练初期 loss 可能跳耐心等几个 epoch。5. 避坑与排查训练损失不降、误检火灾、事故漏检的常见原因5.1 损失不降反升标注格式和类别 ID 的隐形错误现象训练前几个 epoch loss 正常下降突然飙升或者一直震荡在很高值。原因最常见的是标注文件里 class id 从 1 开始但 YAML 里names从 0 开始导致模型把 car 学成 person。或者 TXT 文件里有空行、多余空格YOLO 解析时跳过整行实际训练样本变少。解决用脚本检查所有 TXT 文件确保每行 5 个值class id 在[0, nc-1]范围内坐标在[0,1]之间。import os def check_labels(label_dir, nc): for txt in os.listdir(label_dir): if not txt.endswith(.txt): continue with open(os.path.join(label_dir, txt)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: print(f{txt} 第{i1}行字段数不对: {line}) continue cls_id int(parts[0]) if cls_id 0 or cls_id nc: print(f{txt} 第{i1}行类别越界: {cls_id}) for v in parts[1:]: if not 0 float(v) 1: print(f{txt} 第{i1}行坐标越界: {v})逻辑说明逐行检查字段数、类别 ID 范围、坐标范围。参数注意nc要和 YAML 里的nc一致。这个脚本跑一遍能排除 80% 的标注格式问题。5.2 火灾误检把夕阳和车灯当成火焰现象模型在交通场景里把红色车尾灯、夕阳、橙色路锥识别成 fire。原因火灾数据集中火焰样本的背景太单一模型学到了“红色/橙色 火焰”的捷径没有学到火焰的纹理和动态特征。解决在训练集里加入负样本即包含红色物体但没有火焰的图片标注为空 TXT。同时降低hsv_h色调增强幅度避免颜色抖动过大让模型更依赖颜色。另外推理时提高conf阈值从 0.25 提到 0.5先保证不误报。5.3 事故漏检碰撞车辆被当成普通车辆现象模型能检测到车但碰撞、翻车的事故车被标成 car没有触发 accident 类别。原因事故样本太少且事故车和普通车在单帧图像里外观差异小模型倾向于把多数类 car 的权重学得很大。解决对 accident 类别过采样或者用 focal loss 让模型关注难样本。YOLOv8 分类损失默认是 BCE可以通过cls_pw给正样本加权但更直接的是在数据集中把事故图片复制多份或者用copy_paste增强把事故车粘贴到不同背景。5.4 验证集 mAP 高但实际测试翻车数据泄漏和场景过拟合现象验证集 mAP50 到 0.9但拿真实路口视频跑漏检严重。原因训练集和验证集来自同一段视频的相邻帧几乎一模一样模型只是记住了背景。解决按视频片段划分而不是随机按帧划分。同一段视频的帧只能出现在训练集或验证集之一。另外测试时用不同摄像头、不同天气的图片才能看出真实泛化能力。5.5 训练到一半显存爆炸数据加载线程和缓存问题现象前几个 epoch 正常突然CUDA out of memory。原因workers太多每个线程缓存了图片加上模型本身显存超了。或者验证时 batch 太大YOLO 默认验证 batch 是训练 batch 的两倍。解决把workers降到 2 或 0验证时设val_batch8。另外cacheTrue会把所有图片缓存到内存图片多的时候内存爆了也会影响显存分配关掉cache。6. 进阶技巧用少量事故样本做微调与推理加速如果你手头的事故图片只有几百张从零训练肯定不够。我一般用交通数据集预训练一个检测器再拿事故数据微调最后几层。具体做法先跑 100 epoch 交通检测得到best.pt然后加载这个权重把data换成事故数据集epochs设 30lr0调小到 0.001冻结 backbone 前 10 层。from ultralytics import YOLO model YOLO(runs/train/traffic/weights/best.pt) model.train( datadata_accident.yaml, epochs30, imgsz640, batch8, lr00.001, freeze10, # 冻结前 10 层 device0, )逻辑说明freeze10让前 10 层权重不变只训练后面的检测头防止小数据过拟合。lr0调小避免破坏预训练特征。参数注意freeze的层数根据模型结构定YOLOv8n 总共约 100 层冻结 10 层大概到第一个 C2f 模块之前。推理加速方面如果部署在边缘设备把 PyTorch 模型导出成 ONNX 或 TensorRT。ONNX 通用性好TensorRT 在 NVIDIA 设备上更快。导出命令yolo export modelbest.pt formatonnx imgsz640 halfTruehalfTrue用 FP16 精度速度提升明显精度损失很小。但火灾检测中火焰颜色细微FP16 可能让红色和橙色区分度下降建议导出后拿测试集验证一遍再上线。最后说个习惯我每次训练完都会把data.yaml、best.pt、results.csv和当时的git commit记在一个文本文件里过两周回头看能省掉大量“这个权重是哪个版本训的”这种玄学问题。希望帮到你。本文还有配套的精品资源点击获取
