当前位置: 首页 > article >正文

FCOS训练自己的数据?从Labelme标注到VOC格式转换,这份避坑指南请收好

FCOS训练自定义数据集从Labelme标注到VOC格式的完整避坑指南当你已经用Labelme完成了图像标注却卡在数据格式转换这一步时这篇文章将成为你的救星。FCOS作为一款优秀的全卷积目标检测模型对输入数据格式有着严格的要求而官方文档往往不会详细告诉你如何从零开始准备数据。本文将手把手带你走过这段充满陷阱的旅程。1. 理解FCOS的数据需求FCOS默认支持两种数据格式COCO和VOC。对于大多数自定义数据集场景VOC格式更为简单直接。但问题在于Labelme生成的JSON标注文件与VOC的XML格式完全不同这就是我们需要跨越的第一道鸿沟。VOC格式的核心目录结构如下dataset/ ├── Annotations/ # 存放XML标注文件 ├── ImageSets/ # 存放训练/验证/测试集划分文件 │ ├── Main/ │ │ ├── train.txt │ │ ├── val.txt │ │ └── test.txt └── JPEGImages/ # 存放原始图像文件关键差异点Labelme使用相对坐标0-1之间而VOC使用绝对像素坐标Labelme的JSON结构更自由VOC XML有严格的字段要求Labelme支持多边形标注而FCOS通常只需要矩形框2. 从Labelme JSON到VOC XML的转换实战转换过程的核心是提取Labelme JSON中的关键信息并按照VOC XML的格式重新组织。以下是一个Python脚本示例可以批量完成这个转换import json import os import xml.etree.ElementTree as ET from xml.dom import minidom def labelme_to_voc(json_path, output_dir, class_mapping): # 读取Labelme JSON文件 with open(json_path, r) as f: data json.load(f) # 创建XML根节点 annotation ET.Element(annotation) # 添加基本信息 folder ET.SubElement(annotation, folder) folder.text VOC2007 filename ET.SubElement(annotation, filename) filename.text os.path.basename(data[imagePath]) size ET.SubElement(annotation, size) width ET.SubElement(size, width) width.text str(data[imageWidth]) height ET.SubElement(size, height) height.text str(data[imageHeight]) depth ET.SubElement(size, depth) depth.text 3 # 假设是RGB图像 # 处理每个标注对象 for shape in data[shapes]: if shape[shape_type] ! rectangle: continue # FCOS通常只需要矩形框 obj ET.SubElement(annotation, object) name ET.SubElement(obj, name) name.text class_mapping.get(shape[label], shape[label]) # 其他必要字段 ET.SubElement(obj, pose).text Unspecified ET.SubElement(obj, truncated).text 0 ET.SubElement(obj, difficult).text 0 # 边界框坐标 bndbox ET.SubElement(obj, bndbox) points shape[points] xmin str(min(points[0][0], points[1][0])) ymin str(min(points[0][1], points[1][1])) xmax str(max(points[0][0], points[1][0])) ymax str(max(points[0][1], points[1][1])) ET.SubElement(bndbox, xmin).text xmin ET.SubElement(bndbox, ymin).text ymin ET.SubElement(bndbox, xmax).text xmax ET.SubElement(bndbox, ymax).text ymax # 美化XML输出 rough_string ET.tostring(annotation, utf-8) reparsed minidom.parseString(rough_string) pretty_xml reparsed.toprettyxml(indent ) # 保存XML文件 xml_filename os.path.splitext(os.path.basename(json_path))[0] .xml xml_path os.path.join(output_dir, xml_filename) with open(xml_path, w) as f: f.write(pretty_xml) # 使用示例 class_mapping {cat: cat, dog: dog} # 可选的标签映射 output_dir Annotations os.makedirs(output_dir, exist_okTrue) for json_file in os.listdir(labelme_jsons): if json_file.endswith(.json): labelme_to_voc( os.path.join(labelme_jsons, json_file), output_dir, class_mapping )常见陷阱及解决方案坐标溢出问题Labelme允许标注框超出图像边界但VOC格式不允许解决方法在转换时对坐标进行裁剪xmin max(0, min(points[0][0], points[1][0])) ymin max(0, min(points[0][1], points[1][1])) xmax min(data[imageWidth], max(points[0][0], points[1][0])) ymax min(data[imageHeight], max(points[0][1], points[1][1]))标签名称不一致不同标注人员可能使用不同的大小写或缩写建议建立统一的标签映射表图像路径问题Labelme JSON中的imagePath可能是相对路径确保图像能被正确找到或者统一复制到JPEGImages目录3. 构建完整的VOC数据集结构转换完标注文件只是第一步接下来需要组织完整的VOC数据集结构。以下是关键步骤创建标准目录结构mkdir -p dataset/{Annotations,ImageSets/Main,JPEGImages}移动文件到正确位置将转换好的XML文件放入Annotations目录将原始图像文件放入JPEGImages目录确保文件名一致仅扩展名不同生成ImageSet划分文件 通常需要将数据集划分为训练集、验证集和测试集。以下是一个简单的划分脚本import os import random # 获取所有图像文件名不带扩展名 image_names [os.path.splitext(f)[0] for f in os.listdir(JPEGImages) if f.endswith(.jpg)] random.shuffle(image_names) # 划分比例 total len(image_names) train_ratio 0.7 val_ratio 0.15 test_ratio 0.15 train_end int(total * train_ratio) val_end train_end int(total * val_ratio) # 写入文件 def write_to_file(names, filepath): with open(filepath, w) as f: f.write(\n.join(names)) write_to_file(image_names[:train_end], ImageSets/Main/train.txt) write_to_file(image_names[train_end:val_end], ImageSets/Main/val.txt) write_to_file(image_names[val_end:], ImageSets/Main/test.txt)重要检查点确保每个XML文件都有对应的图像文件检查标注框是否合理没有负坐标或超出图像边界验证类别名称的一致性4. FCOS配置适配你的数据集数据准备好了接下来需要告诉FCOS如何读取你的数据。这涉及到几个关键配置文件修改paths_catalog.py 找到fcos/FCOS/fcos_core/config/paths_catalog.py添加你的数据集DATASETS { # ... 其他数据集配置 voc_2007: { data_dir: your_dataset_path, split: train }, voc_2007_custom_train: { img_dir: your_dataset_path/JPEGImages, ann_file: your_dataset_path/Annotations, split: train }, voc_2007_custom_val: { img_dir: your_dataset_path/JPEGImages, ann_file: your_dataset_path/Annotations, split: val } }更新类别定义 修改fcos/FCOS/fcos_core/data/datasets/voc.py中的CLASSESCLASSES ( __background__, your_class_1, your_class_2, # ... 你的其他类别 )调整模型配置 在训练配置文件中如fcos_imprv_R_50_FPN_1x.yaml更新类别数MODEL: FCOS: NUM_CLASSES: 5 # 包括背景类常见错误排查类别数不匹配会导致训练失败路径错误会导致数据加载失败VOC格式不正确会导致标注无法解析5. 验证数据是否正确加载在开始长时间训练前先验证数据是否正确加载可视化检查 修改demo脚本检查标注框是否正确显示from fcos_core.data.datasets import VOCDataset import matplotlib.pyplot as plt dataset VOCDataset( your_dataset_path/JPEGImages, your_dataset_path/Annotations, ImageSets/Main/train.txt, transformsNone ) # 可视化第一个样本 img, target, _ dataset[0] plt.imshow(img) for box in target.bbox: plt.gca().add_patch(plt.Rectangle( (box[0], box[1]), box[2]-box[0], box[3]-box[1], fillFalse, edgecolorr, linewidth2 )) plt.show()数据加载性能检查 确保数据加载不会成为训练瓶颈python -m torch.distributed.launch --nproc_per_node1 tools/train_net.py \ --config-file configs/fcos/fcos_imprv_R_50_FPN_1x.yaml \ --skip-test \ DATALOADER.NUM_WORKERS 4 \ OUTPUT_DIR output/debug如果一切正常你应该能看到训练开始并且损失值在逐步下降。如果遇到问题最常见的根源还是数据格式问题回到前面的步骤仔细检查。

相关文章:

FCOS训练自己的数据?从Labelme标注到VOC格式转换,这份避坑指南请收好

FCOS训练自定义数据集:从Labelme标注到VOC格式的完整避坑指南 当你已经用Labelme完成了图像标注,却卡在数据格式转换这一步时,这篇文章将成为你的救星。FCOS作为一款优秀的全卷积目标检测模型,对输入数据格式有着严格的要求&#…...

配电箱国家标准最新解读:GB/T 7251系列关键更新与合规要点

作为低压配电系统的核心设备,配电箱的质量直接关乎电力安全与人民生命财产安全。近年来,GB/T 7251《低压成套开关设备和控制设备》系列标准持续迭代升级,为行业规范化发展提供了重要技术支撑。本文从行业观察视角,系统梳理该系列标…...

无守护进程容器镜像构建:Tiny Builder 原理、实践与CI/CD集成指南

1. 项目概述:一个极简的容器镜像构建器最近在折腾容器化部署和CI/CD流水线时,我一直在寻找一个足够轻量、纯粹的镜像构建工具。Docker本身当然没问题,但有时候,尤其是在一些资源受限的环境(比如GitHub Actions的免费Ru…...

Perplexity引用溯源失效的5个致命盲区:从数据管道到渲染层的全链路修复手册

更多请点击: https://intelliparadigm.com 第一章:Perplexity引用透明度优化的底层逻辑与设计哲学 Perplexity 作为衡量语言模型输出不确定性的核心指标,其引用透明度(Referential Transparency)并非天然具备——当同…...

从田野录音到语法树生成:NotebookLM语言学研究闭环实战(含濒危方言ASR微调参数集·限24小时下载)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM语言学研究辅助 NotebookLM 是 Google 推出的基于 LLM 的研究型笔记工具,专为学术工作者设计,其核心能力在于对用户上传的 PDF、TXT 等文本资料进行深度语义理解与上下…...

终极Windows热键冲突解决方案:Hotkey Detective一键定位占用程序

终极Windows热键冲突解决方案:Hotkey Detective一键定位占用程序 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

Claude API预算与性能优化实战:四层策略降本增效

1. 项目概述:一个为Claude设计的预算与性能优化技能 最近在折腾Claude API的时候,发现了一个挺有意思的开源项目,叫 budget_and_performance_optimization_claude_skill 。简单来说,这是一个专门为Claude(特别是Clau…...

ARM Cortex-M0+极限性能优化:从超频到外设压榨的嵌入式实战

1. 项目概述:一次基于经典平台的极限性能探索“飞思卡尔Freedom打造新记录!”这个标题,对于很多嵌入式领域的老兵而言,瞬间就能勾起一段充满挑战与激情的回忆。飞思卡尔(Freescale,现为NXP的一部分&#xf…...

3步轻松解锁Cursor Pro完整功能:免费使用AI编程助手的终极指南

3步轻松解锁Cursor Pro完整功能:免费使用AI编程助手的终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …...

TegraRcmGUI完整指南:Windows上最简单快速的Switch注入工具教程

TegraRcmGUI完整指南:Windows上最简单快速的Switch注入工具教程 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是Windows平台上最简…...

Revelation光影包:物理渲染与启发式算法的视觉革命

Revelation光影包:物理渲染与启发式算法的视觉革命 【免费下载链接】Revelation An explorative shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation Revelation不仅仅是一个Minecraft光影包——它是基于物理渲…...

嵌入式 C 语言宏的高级编程技巧~

嵌入式情报局 嵌入式 C 语言宏的高级编程技巧~ 用VSCode打造嵌入式 Linux 开发的终极 IDE...

单调栈:高效解决边界查找问题

一、上期回顾 学完并查集 DSU:初始化、查找、合并、路径压缩,连通块、集合合并类题目直接秒杀。今天攻坚单调栈,属于刷题必备、面试常问的线性时间算法。二、单调栈核心概念1. 什么是单调栈栈内元素保持严格递增 / 严格递减,始终维…...

基于Circuit Playground与柔性3D打印的可穿戴设备制作全攻略

1. 项目概述:当创客遇上柔性穿戴如果你玩过Arduino,或者对智能硬件有点兴趣,那你大概率听说过Adafruit的Circuit Playground。这块板子挺有意思,它把一堆传感器、LED灯、小喇叭和按钮都塞进了一个硬币大小的板子上,号称…...

【NotebookLM海洋学研究辅助实战指南】:20年海洋数据科学家亲授AI笔记法,3步构建专属科研知识图谱

更多请点击: https://intelliparadigm.com 第一章:NotebookLM海洋学研究辅助 NotebookLM 是 Google 推出的基于用户上传文档进行深度语义理解与推理的 AI 工具,特别适用于海洋学这类多源异构、长周期、高专业性的科研场景。研究人员可将 PDF…...

OpenClaw-RUH:基于深度学习的机器人灵巧抓取框架解析与实践

1. 项目概述:当AI遇上“机械爪”最近在AI和机器人交叉的圈子里,一个名为“OpenClaw-RUH”的项目引起了我的注意。乍一看这个标题,你可能会觉得它又是一个开源的机械臂控制项目。但当我深入其代码仓库和社区讨论后,发现它的野心远不…...

基于帕尔贴效应的智能冷饮机制作:从热电制冷原理到嵌入式控制实践

1. 项目概述与核心思路在炎热的夏天,没有什么比一杯冰镇饮料更让人舒爽的了。但传统的加冰方式往往会稀释饮料的风味,而市面上的小型制冷设备要么体积庞大,要么价格不菲。作为一名热衷于将电子技术与生活创意结合的爱好者,我一直在…...

Perplexity搜索精度暴跌?揭秘92%开发者忽略的4个底层参数配置陷阱

更多请点击: https://intelliparadigm.com 第一章:Perplexity搜索精度暴跌?揭秘92%开发者忽略的4个底层参数配置陷阱 Perplexity 作为评估语言模型输出质量的核心指标,其数值异常飙升(如从 12.3 暴增至 89.7&#xff…...

对比按需计费与 Token Plan 在 Taotoken 平台上的长期成本差异感受

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按需计费与 Token Plan 在 Taotoken 平台上的长期成本差异感受 在构建和运营依赖大模型能力的应用时,成本控制是一…...

性价比高的AI应用厂家

核心结论: 当前市面上AI应用厂商众多,但真正能做到“高性价比”的,必须同时满足三个条件:功能覆盖企业核心痛点(管理、销售、运营)、落地效果可量化(降本增效有数据支撑)、成本可控&…...

如何通过LizzieYzy围棋AI分析工具在30天内实现棋力突破:从入门到实战的完整指南

如何通过LizzieYzy围棋AI分析工具在30天内实现棋力突破:从入门到实战的完整指南 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 在围棋AI技术飞速发展的今天,LizzieYzy作为一…...

Linux SSH身份验证全解析:从密码到证书的六种方法与实践指南

1. SSH身份验证:守护远程访问的第一道门在Linux世界里,SSH(Secure Shell)就是那把打开远程服务器大门的钥匙。无论是管理云服务器、部署应用,还是进行日常运维,我们几乎每天都在和它打交道。但很多人可能没…...

【Microsystems Nanoengineering】利用多功能液晶偏振光栅抑制微型光学泵浦磁力计中的激光功率噪声

【Microsystems &Nanoengineering】利用多功能液晶偏振光栅抑制微型光学泵浦磁力计中的激光功率噪声 摘要 传统单光束光泵磁力仪(OPM)依赖分立偏振光学元件,体积大、装调复杂,且易受激光功率噪声限制。 本文提出 ** 多功能液晶…...

终极指南:用foo2zjs驱动100+型号打印机在Linux上完美工作

终极指南:用foo2zjs驱动100型号打印机在Linux上完美工作 【免费下载链接】foo2zjs A linux printer driver for QPDL protocol - copy of http://foo2zjs.rkkda.com/ 项目地址: https://gitcode.com/gh_mirrors/fo/foo2zjs 核心关键词:foo2zjs Li…...

第五课:YOLOv5-Lite模型适配AK3918AV130转换实战

文章目录一、课程导学二、课程核心关键词三、模型转换整体原理与流程概述四、YOLOv5-Lite转ONNX标准化实战五、安凯微工具链模型适配与量化实战六、AK3918AV130专属模型编译实战七、模型仿真校验与异常排查八、课堂实操示例九、本节课核心总结十、课后作业十一、课程回顾总结上…...

2025届必备的五大降AI率工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 伴随人工智能内容生成被广泛运用,其潜在风险愈发明显地呈现出来。为了应对这些具…...

BilibiliDown:如何轻松下载B站视频的终极免费工具指南

BilibiliDown:如何轻松下载B站视频的终极免费工具指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…...

从Excel到Python:用Pandas的fillna优雅处理缺失值,数据分析效率翻倍

从Excel到Python:用Pandas的fillna优雅处理缺失值,数据分析效率翻倍 当你在Excel中处理上千行数据时,是否曾被那些零散的#N/A或空白单元格折磨得焦头烂额?CtrlF查找替换、IFERROR函数嵌套、手动拖拽填充柄...这些操作在小型数据集…...

Diablo Edit2:终极暗黑破坏神2角色存档编辑器完全指南

Diablo Edit2:终极暗黑破坏神2角色存档编辑器完全指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中反复刷装备?是否因为技能点分配错误而不…...

HyperMesh网格划分许可不够用?自动释放,仿真前处理加速

HyperMesh网格划分许可不够用?别慌,自动释放才是真本事前两天我被一个项目组找去救火,说他们的HyperMesh突然卡死,分分钟延迟两天交工。排查下来才发现,连累了整个分析流程的不是软件bug,是许可证池里没剩下…...