面向极端天气的智慧交通感知:一个3868张VOC+YOLO格式多类别目标检测数据集构建实践 📅 发布时间:2026/7/9 0:02:56 👁️ 浏览次数: 1. 为什么我们需要一个“坏天气”的交通数据集如果你做过计算机视觉项目尤其是目标检测肯定用过COCO、VOC这些大名鼎鼎的公开数据集。拿它们训练出来的模型在阳光明媚、视野清晰的测试图片上效果往往不错。但一旦你把模型部署到真实的交通监控场景里尤其是在下雨、下雪、起雾的天气效果可能就惨不忍睹了。模型可能会把雨滴误识别成行人把雾中的车灯当成交通信号灯或者干脆“看不见”被雪覆盖了一半的汽车。这就是我当初遇到的真实困境。当时我们在为一个城市的智慧交通项目开发感知模块客户要求系统必须能应对各种极端天气。我翻遍了公开数据集发现一个尴尬的现实绝大多数数据集都是在“好天气”下采集的。即便有少数包含雨雪场景要么类别不全要么数据量太小根本不够训练一个鲁棒的模型。模型在实验室里表现优异一到实际恶劣环境中就“失灵”这种落差让我下定决心必须自己动手构建一个专门面向极端天气的交通目标检测数据集。这个数据集的核心价值就在于它的“场景特异性”。它不是为了追求大而全而是精准地瞄准了智慧交通在恶劣天气下的感知盲区。3868张图片听起来可能不如动辄几十万的数据集震撼但每一张都包含了雨、雪、雾、夜间降雨等复杂条件。我们标注了“bicycle”, “bus”, “car”, “motorcycle”, “person”, “traffic light”, “train”, “truck”这8类交通场景中最关键的目标。最终我们不仅生成了通用的Pascal VOC格式的XML文件还为流行的YOLO系列模型准备了TXT格式的标注让研究者拿到手就能直接用。2. 数据采集寻找那些“不完美”的瞬间构建数据集的第一步也是最关键的一步就是找“料”。我们的目标很明确不要干净的、理想的图片专挑那些让算法“头疼”的场景。2.1 来源与渠道我主要从三个渠道获取原始素材公开视频资源在一些允许研究使用的交通监控视频网站、驾驶数据集如BDD100K中截取恶劣天气片段中手动截取包含雨、雪、雾、夜间湿滑路面的关键帧。这里要注意版权确保用于非商业研究目的。模拟器与合成数据使用像CARLA这类自动驾驶模拟器可以灵活地设置天气参数暴雨、大雪、浓雾生成大量可控的、带有精确真值Ground Truth的图片。虽然存在域差异但作为数据补充非常高效。合作伙伴与实地采集如果有条件与一些交通管理部门或研究机构合作获取脱敏后的真实恶劣天气监控画面这是最宝贵的数据源。2.2 筛选原则什么是“有效”的恶劣天气图片不是所有模糊的图片都有用。在筛选中我制定了几个硬性标准能见度分级将雾、大雨、暴雪按能见度粗略分为轻、中、重三级确保数据集覆盖不同程度的遮挡。目标可见性即使天气再差标注的目标也必须至少有部分轮廓是肉眼可辨的。完全被淹没在暴雨或浓雾中的物体标注没有意义。场景多样性包括城市道路、高速公路、十字路口、隧道出口等不同交通场景避免数据过于单一。时间分布特意包含了大量黄昏、夜间以及夜间加雨雪的“地狱级”场景这些是感知算法真正的挑战。最终我从近万张候选图片中精选出了3868张构成了这个数据集的核心。这个数量是经过权衡的既要保证每个类别有足够的样本尤其是小目标如交通灯、行人又要控制人工标注的成本在可承受范围内。3. 标注实战在模糊中划定清晰的边界数据有了接下来就是最耗时、也最考验耐心的环节——标注。我们选用的是开源的LabelImg工具因为它简单、稳定且直接支持导出Pascal VOC格式。3.1 标注规范与挑战我们定义了清晰的8个类别。标注规则很简单用矩形框Bounding Box将目标紧密地框选出来。但实际操作起来在极端天气下每一个框都充满争议。挑战一边界模糊。大雨中行驶的汽车轮廓因为雨滴和地面反光而变得模糊不清。我的原则是以目标主体固有为边界忽略动态附着物。比如汽车溅起的水花不框入但被雪覆盖了半个车身的汽车要尽可能根据车型轮廓估算出整个车身。挑战二部分遮挡。雾中的行人可能只露出上半身。这时只标注可见部分还是推测并标注完整人体为了模型学习到遮挡关系我选择了后者但会在标注笔记中记录遮挡情况。对于被严重遮挡超过50%的目标则不予标注。挑战三小目标识别。远处的交通信号灯在雾中可能只是几个模糊的色块。这类目标必须标注因为它们是关键交通元素。我会放大图片仔细辨认确保每个可识别的信号灯都被框住。挑战四类别混淆。大雨夜晚公交车的尾灯和卡车的尾灯可能很像。这时必须结合车辆的整体形状、比例和场景上下文来判断。拿不准的时候会和小组成员一起讨论确定。3.2 质量控制与一致性一个人标注难免主观。为了确保质量我们采取了两个措施多人交叉校验随机抽取20%的已标注图片由另一位标注员进行复核。针对有分歧的标注框一起回顾并确定最终标准。定期校准会议每周开一次短会把本周遇到的“疑难杂症”图片拿出来集体讨论统一标注口径确保整个数据集的标注风格一致。这个过程虽然繁琐但至关重要。一个内部不一致的数据集会给模型训练引入噪声导致性能下降。最终我们统计出总共26,721个标注框其中“car”和“person”、“traffic light”数量最多这也符合实际交通场景的分布。4. 双格式生成一份数据两种“吃法”标注完成得到的是LabelImg默认生成的Pascal VOC格式的XML文件。这种格式信息丰富包含了图片尺寸、目标类别和边界框的精确坐标基于图片左上角。但对于像YOLO这类现代检测模型它们通常需要一种更简洁的格式TXT文件里面存储的是归一化后的中心点坐标和宽高。4.1 为什么需要两种格式这就好比你有了一份菜的原料VOC XMLYOLO模型要的却是切配好的半成品YOLO TXT。直接提供两种格式大大提升了数据集的易用性。VOC格式通用性强方便进行数据可视化、分析以及用于一些传统或需要丰富信息的训练框架。YOLO格式开箱即用直接可以丢进YOLOv5/v7/v8、Ultralytics等训练脚本里省去了格式转换的麻烦。4.2 自动化转换脚本手动转换近4000张图片的标注是不可能的。我写了一个Python脚本来自动完成这个工作。核心思路很简单解析每个XML文件提取出目标类别和框的绝对坐标然后进行归一化计算。import xml.etree.ElementTree as ET import os # 类别列表必须和LabelImg中定义的顺序一致 classes [bicycle, bus, car, motorcycle, person, traffic light, train, truck] def convert_voc_to_yolo(xml_path, txt_save_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_width int(size.find(width).text) img_height int(size.find(height).text) with open(txt_save_path, w) as f: for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes: continue # 忽略不在列表中的类别 cls_id classes.index(cls_name) xmlbox obj.find(bndbox) xmin float(xmlbox.find(xmin).text) ymin float(xmlbox.find(ymin).text) xmax float(xmlbox.find(xmax).text) ymax float(xmlbox.find(ymax).text) # 计算归一化后的中心点坐标和宽高 x_center (xmin xmax) / 2.0 / img_width y_center (ymin ymax) / 2.0 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height # 写入TXT文件格式: class_id x_center y_center width height f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n) # 遍历所有XML文件进行转换 voc_annotations_dir path/to/your/VOC/Annotations yolo_labels_dir path/to/save/YOLO/labels os.makedirs(yolo_labels_dir, exist_okTrue) for xml_file in os.listdir(voc_annotations_dir): if xml_file.endswith(.xml): xml_path os.path.join(voc_annotations_dir, xml_file) txt_name xml_file.replace(.xml, .txt) txt_path os.path.join(yolo_labels_dir, txt_name) convert_voc_to_yolo(xml_path, txt_path)注意脚本中的classes列表顺序至关重要它决定了类别ID的映射关系例如bicycle对应0bus对应1。这个顺序必须和YOLO训练时读取的classes.txt文件完全一致。我们在发布数据集时会同时提供这个文件。4.3 最终数据集结构运行脚本后你会得到一个结构清晰的文件夹Extreme_Weather_Traffic_3868/ ├── images/ # 存放所有3868张JPG图片 │ ├── train/ # 按需划分的训练集图片 │ └── val/ # 按需划分的验证集图片 ├── annotations_voc/ # Pascal VOC格式的3868个XML文件 ├── labels_yolo/ # YOLO格式的3868个TXT文件 │ └── classes.txt # 记录类别列表的文本文件 └── train.txt, val.txt # 划分好的图片路径列表文件这样的结构无论是想用MMDetection、Detectron2读VOC还是想用YOLO系列读TXT都能立刻上手。5. 数据集使用指南与效果初探数据集准备好了怎么用才能发挥最大价值呢这里分享一些我的使用经验和初步实验结果。5.1 数据划分建议3868张图片我建议按照大约8:1:1的比例随机划分成训练集约3094张、验证集约387张和测试集约387张。切记一定要确保随机划分并且让训练集和验证/测试集在天气类型雨、雪、雾、场景白天、夜晚上分布均匀否则评估结果会有偏差。划分好后将对应的图片路径分别写入train.txt和val.txt。5.2 使用YOLOv8进行快速验证以目前流行的Ultralytics YOLOv8为例使用这个数据集进行训练非常简单。首先准备好一个YAML配置文件比如extreme_weather.yaml# extreme_weather.yaml path: /path/to/Extreme_Weather_Traffic_3868 # 数据集根目录 train: images/train # 训练图片路径相对path val: images/val # 验证图片路径相对path # 类别数和类别名 nc: 8 names: [bicycle, bus, car, motorcycle, person, traffic light, train, truck]然后只需一行命令即可开始训练yolo detect train dataextreme_weather.yaml modelyolov8n.pt epochs100 imgsz6405.3 训练技巧与观察在恶劣天气数据集上训练有几个参数需要特别关注数据增强Data Augmentation这是关键除了常规的翻转、裁剪要谨慎使用色彩抖动、模糊等增强因为我们的数据本身已经包含了大量的自然“噪声”雨丝、雪点、雾效。过度增强可能会破坏这些真实噪声的分布。我建议重点使用Mosaic、MixUp这类能丰富背景和上下文信息的增强。输入分辨率恶劣天气下小目标更难识别。如果计算资源允许可以尝试将输入分辨率从640提高到1280这对检测远处的交通灯和行人会有帮助。学习率与损失函数由于场景复杂模型可能需要更长时间收敛。可以适当增加训练周期epochs并采用余弦退火等动态学习率调度策略。5.4 初步效果对比作为对比我分别用COCO预训练的YOLOv8n模型和在我们自建极端天气数据集上微调Fine-tune的模型在同一个恶劣天气测试集上做了评估。模型mAP0.5 (整体)mAP0.5 (行人)mAP0.5 (交通灯)备注COCO预训练模型0.4520.3810.287在清晰图片上表现好但恶劣天气下漏检、误检严重极端天气数据集微调模型0.6830.6250.521对雨雪雾干扰有明显抗性目标定位更准可以看到在恶劣天气这个特定场景下使用场景专用数据集微调后的模型性能提升是巨大的尤其是对“行人”和“交通灯”这类关键但易受干扰的目标。这充分证明了构建高质量场景数据集的必要性。6. 踩过的坑与未来优化方向回顾整个数据集构建过程并不是一帆风顺这里分享几个我踩过的“坑”希望能帮你避雷。6.1 标注一致性是最大的挑战初期不同标注员对“雾中车辆边界”的判断标准不一导致同类目标的框大小差异很大。后来我们通过制作“标注范例手册”并定期复核才解决了这个问题。建议在标注开始前花时间制定详尽的标注规范文档并先用几十张图片做一轮试标和校准。6.2 类别不平衡问题我们的数据中“car”的数量远超“bus”和“train”。虽然这反映了真实路况但可能会让模型对少数类别不敏感。解决方法有两种一是在数据采集阶段有意识地多找一些包含公交车、火车的恶劣天气场景二是在训练时使用类别权重Class Weight或过采样Oversampling技术。6.3 数据格式转换的陷阱最初转换YOLO格式时我忽略了图片可能含有EXIF方向信息有些手机拍的图片会旋转。导致一些图片用OpenCV读取时方向是错的转换出来的归一化坐标全是错的。务必在转换前先用工具如PIL.Image统一读取并校正图片方向或者确保所有图片都已转为标准方向。6.4 关于数据集的局限性这个3868张的数据集是一个起点而非终点。它主要覆盖了静态监控视角的恶劣天气场景对于剧烈抖动如车载摄像头在颠簸路面、极端动态模糊高速运动的车辆等情况覆盖不足。此外8个类别对于更细粒度的应用如区分不同型号的卡车、识别交警手势还不够。未来的优化方向一是持续扩充数据量和场景多样性二是考虑引入实例分割标注因为在下雪天车辆上的积雪部分是否应该算作车体的一部分用分割掩码Mask可能比矩形框更能精确描述。三是探索半自动标注先用一个在清晰数据上训练的模型对恶劣天气图片进行初标注再由人工修正这能极大提升效率。构建数据集是个苦力活但当你看到自己亲手标注的数据训练出的模型在暴雨如注的监控画面中依然能稳定地框出每一辆汽车和行人时那种成就感是无与伦比的。这个3868张的数据集就是我交出的第一份答卷。希望它的存在能让更多开发者和研究者少走一些弯路更快地让AI视觉技术在风雨无阻的智慧交通中落地生根。
iPerf3源代码下载全攻略:从GitHub到本地编译的完整流程 iPerf3 源码深度探索:从云端仓库到本地可执行文件的构建艺术 对于网络性能测试,iPerf3 早已是工程师工具箱里的瑞士军刀。但你是否想过,这把军刀是如何锻造的?当标准二进制版本无法满足你的定制化需求,或者你渴望深入其… 2026/7/4 1:58:51
INVICTA英维克塔BLz80-230/6振动电机 INVICTA英维克塔BLz80-230/6振动电机是一款专为重载工业场景设计的底座安装式电动振动电机,具备高激振力、强抗振性与防尘认证,适用于矿山、冶金、建材等连续作业环境。一、核心参数与工作原理型号解析:BLz80-230/6“BLz”表示该电机为底… 2026/7/7 22:06:36
【版本兼容】解决Flask与Werkzeug版本冲突导致的ImportError问题 1. 问题重现:那个让人头疼的ImportError 最近在折腾一个数据可视化项目,想把PyEcharts做的酷炫图表整合到Flask开发的Web应用里。代码写起来挺顺手的,图表配置也调得差不多了,结果一运行,迎面就是一个大写的错误提示&a… 2026/7/3 19:53:30
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
Ansible的AWX与作业模板调度 在当今快速迭代的IT运维与开发领域,自动化已成为提升效率、保障一致性的核心支柱。Ansible作为一款强大的IT自动化工具,以其无代理、简单易用的特点广受欢迎。而AWX,作为Ansible上游项目提供的企业级Web界面、API及任务引擎,则将A… 2026/7/8 23:59:03
Unity WebGL部署Apache Tomcat:MIME配置、Gzip压缩与缓存优化实战 1. 项目概述:当Unity WebGL遇上Apache Tomcat如果你是一名Unity开发者,想把精心制作的WebGL游戏或应用部署到自己的服务器上,那么Apache Tomcat大概率是你绕不开的一环。这不仅仅是把一堆构建出来的文件扔进一个文件夹那么简单。我见过太多项… 2026/7/8 23:59:03
终极Adobe Illustrator脚本工具箱:20+插件快速提升设计效率300% 终极Adobe Illustrator脚本工具箱:20插件快速提升设计效率300% 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts Adobe Illustrator脚本集合是一个专门为设计师打造的强大… 2026/7/8 23:57:01
Halcon OCV 24.11 多字符核验优化:1个模型输出5个字符分数,效率提升80% Halcon OCV 24.11 多字符核验工业级优化:单模型批量处理实战在工业视觉检测领域,字符验证(OCV)一直是产线质量控制的关键环节。传统方案要求每个待检字符单独训练模型,当面对序列号、日期码等多字符场景时,… 2026/7/8 23:57:01
【JAVA毕设源码分享】基于SpringBoot的课堂考勤系统设计与实现(程序+文档+代码讲解+一条龙定制) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/8 23:55:01
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08