从images_xmls到yolov5:三轮车违规停放数据集转换与训练实战
简介面向YOLOv5机器视觉识别与非机动车违规停放场景的三轮车标注数据集分包当前压缩包收录的是三轮车类别中tricycle1子类的全部数据共957张JPEG原图与953个XML标注文件文件总数1910个压缩包大小82.19MB。图片与标注一一对应XML采用VOC格式包含目标框类别与位置信息可直接用于YOLOv5训练、验证或迁移学习。该分包属于完整非机动车数据集的第一类完整体系还涵盖自行车、电动车、三轮车其余品牌子类方便按需分批下载。已有295人学习下载该资源适合正在积累非机动车检测样本、构建违规停放识别模型的研究者或开发者。拿到数据后可直接整理为YOLO格式并配合数据增强与模型微调完成三轮车检测任务有效解决真实场景中非机动车目标多样、标注成本高的问题。1. 非机动车违规停放识别为什么非得从三轮车“images_xmls”开始城市管理里的非机动车违规停放属于典型的“目标小、场景杂、要求却明确”的机器视觉识别问题。而三轮车tricycle又是里面最让检测模型头疼的种类车斗与货架形态差异极大颜色和背景混杂白天强光与夜晚阴影下轮廓会完全变形。这个标题里把“yolov5”和“已标注数据集”放在一起其实已经指明了落地路径——不是从零搭网络而是把手头已有的“images_xmls”也就是VOC格式的图片与XML标注转换成YOLO训练格式再把模型练出来。对刚接触yolov5训练自己的数据集的从业者来说这条路最难的不是模型结构而是数据工程和参数调优。这篇文章就是围绕这条路径把数据转换、训练命令、超参数调节和部署踩坑一次说清楚目标只有一个让你能尽快拿到一个在真实街景里也能稳定工作的违规停放检测器。2. 从images_xmls到yolov5训练格式转换脚本与四个边界坑2.1 VOC格式与YOLO格式的根本差异拿到“tricycle1_images_xmls”这类已标注数据集时首先要确认一件事标注文件的坐标系和存储结构。常见做法是图片放在images目录、同名XML放在xmls目录XML里的object节点保存每个目标的类别名和bndbox边界框xmin、ymin、xmax、ymax。这本质上是Pascal VOC格式坐标是绝对像素值。而yolov5训练需要的是每张图对应一个同名的.txt文件每行格式是class_id x_center y_center width height并且四个坐标值都归一化到0到1之间。这里class_id必须是整数从0开始计数顺序要和data/*.yaml里给出的类别列表一致否则训练出来的模型类别标签会全部错位。转换是整个流程里最容易出“暗坑”的一步。比如XML里类别名可能包含空格或中文注释直接拿来做目录名会出错又比如某些图片是EXIF旋转过的标注框坐标是按原始像素标的转换前必须先统一图片朝向。常见做法是先写一个小脚本把图片和XML成对读取先检查size节点里的width和height再计算归一化坐标最后按train/val随机划分输出。这里建议把脚本写成一次性工具不做太重的封装保存好原始数据集方便回滚。2.2 转换脚本的最小实现用python写一个voc2yolo.py核心逻辑如下import os import glob import random import xml.etree.ElementTree as ET # 类别列表顺序就是训练时的class_id CLASSES [tricycle, electric_bicycle, bicycle] def convert_xml_to_yolo(xml_path, out_txt_path): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASSES: continue # 跳过无关类别宁缺毋滥 class_id CLASSES.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h # 防御坐标超出[0,1]的框说明标注越界或图片尺寸读取有误 if not (0 x_center 1 and 0 y_center 1): print(f[warn] {xml_path} 中有越界框已跳过) continue lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) if lines: with open(out_txt_path, w, encodingutf-8) as f: f.write(\n.join(lines) \n) def main(): random.seed(42) xmls_dir xmls images_dir images out_labels_dir labels os.makedirs(out_labels_dir, exist_okTrue) xml_paths glob.glob(os.path.join(xmls_dir, *.xml)) random.shuffle(xml_paths) split_idx int(len(xml_paths) * 0.8) for i, xml_path in enumerate(xml_paths): base os.path.splitext(os.path.basename(xml_path))[0] img_path os.path.join(images_dir, base .jpg) if not os.path.exists(img_path): print(f[error] 缺少图片: {img_path}) continue out_txt os.path.join(out_labels_dir, base .txt) convert_xml_to_yolo(xml_path, out_txt) # 写入train/val划分文件 list_file train.txt if i split_idx else val.txt with open(list_file, a, encodingutf-8) as f: f.write(os.path.abspath(img_path) \n) print(转换完成已生成 labels 目录与 train.txt/val.txt) if __name__ __main__: main()这段代码里最关键的是归一化公式x_center (xmin xmax) / 2 / img_w它把绝对像素坐标变成相对坐标。很多新手第一次转换时会把xmin和ymin直接除以图片宽高结果框全部偏移到左上角训练出来的模型根本没法收敛。代码末尾把train.txt和val.txt写出来这是yolov5训练时--data参数需要的路径列表文件每一行指向图片的绝对路径模型会去找同名的.txt标签文件。2.3 数据目录结构和YAML配置文件yolov5训练时并不强制你把图片和标签放在同一个文件夹只要标签文件与图片同名同目录即可默认找到。我一般会用下面的目录结构dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── train.txt ├── val.txt └── data.yamldata.yaml里指定类别和路径train: ./dataset/train.txt val: ./dataset/val.txt nc: 3 names: [tricycle, electric_bicycle, bicycle]注意nc必须和names的长度一致否则训练会直接报错。这里有个非常容易被忽略的坑如果train.txt里是绝对路径那么迁移到别的机器时路径就失效了。我习惯把train.txt写成相对路径或者直接用images/train的目录路径交给yolov5自动扫图。2.4 已标注数据集的边界检查拿到手的数据集未必都是干净的尤其是“三轮车”这种特定类别标注质量会直接影响最终效果。建议在训练之前跑一遍脚本检查三个指标一是每张图的目标数量有的图可能只有1个框有的图有20多个极端不均衡会导致模型对少样本过拟合二是标注框面积占比如果大量框小于图片面积的2%说明这些目标过小机器视觉识别难度会显著上升需要考虑切图或者使用更大分辨率输入三是类别数量如果三轮车样本太少比如只有600张而电动车有18000张就需要考虑数据增强或者对三轮车类别做过采样。这些检查不需要写复杂脚本用几行python统计就行import os from collections import Counter label_dir labels/train class_counter Counter() box_area_ratio [] for txt in os.listdir(label_dir): with open(os.path.join(label_dir, txt)) as f: for line in f: parts line.strip().split() class_counter[int(parts[0])] 1 w, h float(parts[3]), float(parts[4]) box_area_ratio.append(w * h) print(各类别数量:, class_counter) print(平均框面积占比:, sum(box_area_ratio) / len(box_area_ratio))如果发现类别严重不均衡后面的训练参数就要做针对性调整后面章节会展开。3. yolov5训练自己的数据集网络结构、超参数与必要条件3.1 yolov5网络结构图里的三个关键部件为什么适本文还有配套的精品资源点击获取

相关新闻

AI大模型知识管理落地指南:从RAG到本地部署避坑实践

AI大模型知识管理落地指南:从RAG到本地部署避坑实践

简介:这份PPT是一份面向企业知识管理负责人、IT架构师及AI应用团队的解决方案演示文稿,聚焦AI大模型与知识图谱协同,解决知识推理生成、语义理解、多模态数据处理及企业级知识服务等核心问题。整份PPT为1个pptx文件,压缩包仅426KB…

2026/10/5 9:10:49 阅读更多 →
Browser Use:AI大模型驱动的浏览器自动化框架,自然语言操控浏览器

Browser Use:AI大模型驱动的浏览器自动化框架,自然语言操控浏览器

1. 浏览器自动化这个老问题,终于等来了一个像样的解法 做Web自动化的人都有一个共同的痛:写爬虫要跟反爬机制斗智斗勇,用Selenium要跟元素定位和等待时间反复拉扯,上Playwright虽然好了不少,但遇到动态渲染、多步骤交互…

2026/10/5 9:10:49 阅读更多 →
AI生成HTML演示稿转可编辑PPTX:原理、工具与实操全流程

AI生成HTML演示稿转可编辑PPTX:原理、工具与实操全流程

1. 为什么AI生成的HTML演示稿总是"看着美、改不动" 1.1 一个真实到让人头疼的场景 前阵子帮一个做企业内训的朋友处理课件,他用AI生成了一套HTML格式的演示页面,浏览器里打开确实漂亮——渐变背景、卡片式布局、动效丝滑。问题出在他想改内容…

2026/10/5 9:10:49 阅读更多 →

最新新闻

从淮师大6个月全量上线经验出发 省属高校数据治理型智慧校园落地全场景高频答疑

从淮师大6个月全量上线经验出发 省属高校数据治理型智慧校园落地全场景高频答疑

省属高校在已有数字化校园基础上启动智慧校园升级,合理的项目落地周期一般是多久?参考已落地的实操经验,适配省属高校存量系统的智慧校园升级项目,采用高效协同模式的前提下,招标后1个月即可完成核心平台搭建&#xff…

2026/10/5 9:46:38 阅读更多 →
Origin Pro 2023绘制Piper三线图全攻略:从数据换算到论文级出图

Origin Pro 2023绘制Piper三线图全攻略:从数据换算到论文级出图

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:46:38 阅读更多 →
LPC546xx USB VBUS检测设计:从阈值计算到冷启动排查

LPC546xx USB VBUS检测设计:从阈值计算到冷启动排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:46:38 阅读更多 →
工业级MRAM与PIC32嵌入式存储方案:高频写入与掉电保护实战

工业级MRAM与PIC32嵌入式存储方案:高频写入与掉电保护实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:46:38 阅读更多 →
均匀分布生成高斯分布的三大核心算法解析

均匀分布生成高斯分布的三大核心算法解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:46:38 阅读更多 →
安卓逆向学习路线:从应用层分析到Native层对抗

安卓逆向学习路线:从应用层分析到Native层对抗

这几年时不时就有人跑来问我:安卓逆向怎么学?是不是得会汇编?要不要先学破解?也有人直接在搜索框里敲“android 逆向学习路线”“安卓逆向教程”,然后被一堆零散的资料劝退。作为常年在这行折腾的人,我太清…

2026/10/5 9:45:38 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →