从零到一:手把手教你用LabelImg打造专属VOC/YOLO目标检测数据集 1. 环境准备与LabelImg安装目标检测的第一步是准备好标注工具。LabelImg作为开源图像标注工具中的佼佼者支持VOC和YOLO两种主流格式。这里以Windows系统为例演示安装过程其他系统类似Python环境配置# 创建虚拟环境推荐 python -m venv labelimg_env labelimg_env\Scripts\activate # 安装LabelImg pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后直接在命令行输入labelimg即可启动工具。第一次运行时建议准备两个文件夹JPEGImages/存放待标注的原始图片Annotations/用于保存标注结果注意如果遇到PyQt相关报错可以尝试先安装pip install pyqt5 lxml。Linux用户可能需要额外执行sudo apt-get install pyqt5-dev-tools2. 数据标注实战技巧2.1 标注界面详解启动LabelImg后你会看到这样的工作区左侧图片显示区域右侧标注类别列表顶部工具栏保存、切换图片等常用功能高效标注的3个关键设置在View菜单中勾选Auto Save mode切换图片自动保存开启Display Labels实时显示标注框和标签启用Advanced Mode让标注框持续显示2.2 快捷键大全记住这些快捷键能提升3倍效率W创建标注框 A上一张图片 D下一张图片 Ctrl鼠标滚轮缩放图片 Del删除当前标注框 Space标记为已校验 CtrlS手动保存2.3 类别管理技巧在标注前建议先创建predefined_classes.txt文件定义所有类别例如cat dog person car启动时通过命令加载预设类别labelimg JPEGImages/ predefined_classes.txt3. 标注结果格式解析3.1 VOC格式详解选择PascalVOC格式时每个图片会生成对应的XML文件包含以下关键信息annotation size width800/width height600/height /size object namedog/name bndbox xmin100/xmin ymin200/ymin xmax300/xmax ymax400/ymax /bndbox /object /annotation坐标系统以图片左上角为原点(0,0)向右为x正方向向下为y正方向。3.2 YOLO格式解析选择YOLO格式会生成txt文件其内容示例0 0.25 0.5 0.1 0.2 1 0.75 0.3 0.15 0.15每行表示一个物体五个数字分别代表类别ID对应classes.txt中的顺序中心点x坐标归一化到0-1中心点y坐标框宽度框高度4. 构建VOC标准数据集4.1 目录结构规范完整的VOC数据集应包含以下结构VOCdevkit/ └── VOC2024/ ├── Annotations/ # 存放XML标注文件 ├── JPEGImages/ # 存放原始图片 ├── ImageSets/ │ └── Main/ # 划分训练集/验证集 │ ├── train.txt │ └── val.txt4.2 自动划分训练集使用Python脚本快速划分数据集import os import random img_dir VOCdevkit/VOC2024/JPEGImages all_imgs [f.split(.)[0] for f in os.listdir(img_dir)] random.shuffle(all_imgs) split int(0.8 * len(all_imgs)) # 80%训练集 with open(VOCdevkit/VOC2024/ImageSets/Main/train.txt, w) as f: f.write(\n.join(all_imgs[:split])) with open(VOCdevkit/VOC2024/ImageSets/Main/val.txt, w) as f: f.write(\n.join(all_imgs[split:]))5. VOC转YOLO格式实战5.1 转换原理转换的核心是将VOC的绝对坐标(xmin,ymin,xmax,ymax)转换为YOLO的相对坐标def voc_to_yolo(size, box): dw 1./size[0] dh 1./size[1] x (box[0] box[1])/2.0 y (box[2] box[3])/2.0 w box[1] - box[0] h box[3] - box[2] return (x*dw, y*dh, w*dw, h*dh)5.2 批量转换脚本使用这个脚本一键转换整个数据集import xml.etree.ElementTree as ET import os classes [cat, dog] # 替换为你的类别 def convert(size, box): # ...同上... for xml_file in os.listdir(Annotations): tree ET.parse(fAnnotations/{xml_file}) root tree.getroot() with open(flabels/{xml_file.replace(.xml,.txt)}, w) as f: for obj in root.findall(object): cls obj.find(name).text cls_id classes.index(cls) xmlbox obj.find(bndbox) b (float(xmlbox.find(xmin).text), float(xmlbox.find(xmax).text), float(xmlbox.find(ymin).text), float(xmlbox.find(ymax).text)) bb convert((w,h), b) f.write(f{cls_id} { .join([str(a) for a in bb])}\n)6. 常见问题解决方案问题1标注时出现重复类别解决方法删除labelImg/data/predefined_classes.txt文件问题2YOLO格式转换后坐标异常检查点确保图片尺寸读取正确XML中的width/height与实际图片一致问题3标注框漂移技巧使用方向键微调选框位置按住Shift加速移动在实际工业质检项目中我发现保持标注一致性至关重要。建议团队制定明确的标注规范例如对于部分遮挡物体标注可见部分小物体至少占图片面积5%才标注模糊物体标记为difficult