告别手动转换!用Python脚本一键搞定Labelme到YOLO-OBB的标注格式转换

张开发
2026/4/16 5:19:00 15 分钟阅读

分享文章

告别手动转换!用Python脚本一键搞定Labelme到YOLO-OBB的标注格式转换
告别手动转换用Python脚本一键搞定Labelme到YOLO-OBB的标注格式转换在计算机视觉领域数据标注是模型训练的基础环节而标注格式的转换往往是项目流程中最容易被忽视却又最耗费时间的步骤之一。许多研究者在使用Labelme完成实例分割标注后发现需要将数据转换为YOLO-OBBOriented Bounding Box格式时不得不面对繁琐的手动转换过程。这不仅效率低下还容易引入人为错误最终影响模型训练效果。本文将介绍一个开箱即用的Python脚本解决方案它能自动将Labelme的JSON标注文件转换为YOLO-OBB所需的TXT格式。这个工具特别适合那些希望将标注数据快速应用于旋转目标检测任务的研究者和开发者。通过简单的配置你可以将这个脚本无缝集成到现有的数据预处理流水线中彻底告别手动转换的烦恼。1. 环境准备与脚本安装在开始使用转换脚本之前需要确保你的开发环境已经安装了必要的Python库。这些库大多可以通过pip直接安装pip install opencv-python numpy matplotlib tqdm建议使用Python 3.7或更高版本以获得最佳兼容性。脚本的核心功能依赖于以下几个关键库OpenCV用于计算最小外接矩形和处理图像NumPy进行高效的数值计算Matplotlib可选的可视化支持tqdm提供进度条显示提升用户体验将脚本保存为labelme_to_yolo_obb.py后你可以通过命令行直接运行它。脚本设计时考虑了以下原则无依赖污染不修改系统环境或全局配置透明操作所有转换过程都有清晰的日志输出可中断恢复支持中途停止后继续执行2. 脚本参数详解与配置理解脚本的各个参数是高效使用它的关键。以下是主要函数和参数的详细说明2.1 核心转换函数labelme_to_obb是执行实际转换工作的核心函数它接受以下参数参数名类型必需默认值说明img_pathstr是-原始图像文件路径label_pathstr是-Labelme生成的JSON标注文件路径save_dirstr是-转换后的TXT文件保存目录if_testbool否False是否生成测试图像用于验证2.2 路径配置在主函数__main__部分你需要配置以下路径变量path_img [ /path/to/train/images, # 训练集图像路径 /path/to/val/images # 验证集图像路径 ] img_save_path [ /path/to/yolo_obb/images/train, # 训练集图像保存路径 /path/to/yolo_obb/images/val # 验证集图像保存路径 ] label_save_path [ /path/to/yolo_obb/labels/train, # 训练集标签保存路径 /path/to/yolo_obb/labels/val # 验证集标签保存路径 ]注意脚本会自动创建不存在的目录但需要确保你有相应的写入权限。3. 转换流程深度解析理解脚本的内部工作原理有助于你更好地调试和定制它。让我们深入分析转换过程的关键步骤3.1 数据读取与验证脚本首先会读取Labelme生成的JSON文件并验证其有效性。这一阶段会检查图像尺寸信息是否存在标注形状是否完整类别标签是否符合预期with open(label_path, r) as f: label_data json.load(f) # 验证基本结构 assert imageWidth in label_data, Missing image width in JSON assert imageHeight in label_data, Missing image height in JSON assert shapes in label_data, No shapes found in JSON3.2 关键转换算法转换的核心在于将Labelme的多边形标注转换为YOLO-OBB所需的旋转矩形框。这一过程使用OpenCV的minAreaRect函数实现# 计算最小外接矩形 points np.array(shape[points], dtypenp.int32) rect cv2.minAreaRect(points) box cv2.boxPoints(rect) # 归一化坐标 obb box / np.array([[img_w, img_h]])提示minAreaRect返回的矩形角度信息在YOLO-OBB格式中不需要因此脚本只使用四个角点坐标。3.3 输出格式规范转换后的TXT文件遵循YOLO-OBB的标准格式class_id x1 y1 x2 y2 x3 y3 x4 y4其中class_id是类别索引从0开始x1,y1到x4,y4是旋转矩形的四个角点坐标归一化到[0,1]4. 高级功能与集成建议4.1 可视化验证启用if_testTrue参数时脚本会生成带标注框的测试图像。这在以下场景特别有用验证转换是否正确调试标注问题制作演示材料生成的图像会保存在save_dir_test目录中文件名与原始图像相同。4.2 批量处理与性能优化脚本已经内置了批量处理功能通过tqdm库提供了进度显示。对于大规模数据集可以考虑以下优化措施并行处理使用Python的multiprocessing模块加速内存优化处理完一批数据后及时释放内存增量处理记录已处理的文件支持断点续传from multiprocessing import Pool def process_single(args): # 包装单文件处理逻辑 pass with Pool(processes4) as pool: pool.map(process_single, file_list)4.3 自定义类别映射脚本默认处理数字1-24和字母X/Y的类别。要支持自定义类别需要修改classe_names列表和对应的类别ID映射逻辑# 自定义类别示例 custom_classes [car, pedestrian, cyclist, traffic_light] # 在labelme_to_obb函数中替换classe_names classe_names custom_classes5. 常见问题与解决方案在实际使用中你可能会遇到以下典型问题问题1转换后的标注框位置不正确检查原始Labelme标注是否准确验证图像尺寸是否与JSON中的声明一致确认坐标归一化计算是否正确问题2部分类别未被正确转换检查classe_names列表是否包含所有需要的类别确保Labelme中的标签命名与脚本预期一致考虑添加标签名称的模糊匹配逻辑问题3处理大量数据时内存不足分批处理数据而不是一次性加载所有文件禁用测试图像生成功能以减少内存使用增加系统的交换空间swap space对于更复杂的应用场景比如处理视频序列或特殊图像格式你可能需要扩展脚本的功能。这时可以考虑添加对视频帧的支持增加更多图像格式的兼容性实现更灵活的路径配置方式在实际项目中这个脚本已经帮助团队将标注转换时间从数小时缩短到几分钟同时显著降低了人为错误的发生率。特别是在处理数千张图像的航空影像数据集时自动化的优势体现得尤为明显。

更多文章