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

从标注到部署:手把手教你用Labelme标注数据并转COCO格式,喂给SOLOv2做实例分割

从零构建实例分割数据集Labelme标注与COCO格式转换全流程实战在计算机视觉领域高质量的数据标注是模型成功的基础。不同于常规的目标检测任务实例分割要求精确到像素级别的标注这对数据准备工作提出了更高要求。本文将带您完整走通从原始图像标注到模型可读格式的全流程特别适合需要处理自定义数据集的研究者和工程师。1. 标注工具选择与Labelme基础操作Labelme作为MIT开源的图像标注工具以其轻量化和多边形标注能力成为实例分割数据准备的首选。与矩形框标注工具不同Labelme允许我们通过描点方式精确勾勒物体轮廓。安装与基础配置pip install labelme # 启动图形界面 labelme首次使用时建议进行以下配置调整在Preferences中设置默认保存路径开启Auto save功能防止意外丢失标注调整顶点大小(Point size)至3-5像素以获得更好的标注体验高效标注技巧使用Ctrl鼠标滚轮快速缩放图像按Esc键可快速完成当前多边形绘制右键点击顶点可进行编辑调整善用复制多边形功能处理相似物体提示对于复杂边缘物体建议先用较稀疏的点勾勒大致轮廓再逐步添加细节顶点这样比一次性密集标注效率更高。标注完成后每个图像会生成对应的JSON文件包含以下关键信息{ version: 5.1.1, flags: {}, shapes: [ { label: parking_space, points: [[x1,y1], [x2,y2], ...], shape_type: polygon } ], imagePath: image_001.jpg, imageHeight: 1080, imageWidth: 1920 }2. Labelme标注数据解析与质量检查获得原始标注后我们需要系统性地验证数据质量。常见问题包括多边形顶点顺序不一致顺时针/逆时针混用相邻物体标注存在重叠或间隙部分遮挡物体标注不完整使用Python进行批量检查import json from pathlib import Path def validate_labelme_json(json_path): with open(json_path) as f: data json.load(f) issues [] for shape in data[shapes]: # 检查顶点数量是否足够构成多边形 if len(shape[points]) 3: issues.append(f顶点不足: {shape[label]}) # 检查坐标是否超出图像范围 for x, y in shape[points]: if not (0 x data[imageWidth] and 0 y data[imageHeight]): issues.append(f坐标越界: {shape[label]}) return issues # 批量检查整个标注目录 label_dir Path(labels) for json_file in label_dir.glob(*.json): problems validate_labelme_json(json_file) if problems: print(f{json_file.name}存在问题:) print(\n.join(problems))常见修正方案问题类型检测方法修正手段顶点顺序不一致计算多边形面积符号使用cv2.contourAreaorientation统一方向相邻物体重叠IoU计算手动调整顶点或使用NMS算法处理标注不完整视觉检查补充标注或排除该样本3. COCO数据格式深度解析COCO格式作为实例分割领域的事实标准其数据结构设计值得深入理解。与Labelme的单图像单文件不同COCO采用集中式存储将所有标注信息整合在一个JSON文件中。COCO数据集的核心结构{ info: {...}, # 数据集元信息 licenses: [...], # 版权信息 images: [ # 图像列表 { id: int, # 唯一图像ID width: int, # 图像宽度 height: int, # 图像高度 file_name: str, # 文件名 license: int, # 许可协议ID coco_url: str # 可选下载URL } ], annotations: [ # 标注列表 { id: int, # 唯一标注ID image_id: int, # 对应图像ID category_id: int, # 类别ID segmentation: [ # 分割多边形 [x1,y1,x2,y2,...] # 单个多边形的顶点坐标 ], area: float, # 区域面积 bbox: [x,y,w,h], # 外接矩形框 iscrowd: 0/1 # 是否群体标注 } ], categories: [ # 类别列表 { id: int, # 类别ID name: str, # 类别名称 supercategory: str # 父类别 } ] }关键字段注意事项annotation.id必须全局唯一常见方案是采用image_id*1000 annotation_index的编码方式segmentation字段支持RLE或polygon格式实例分割通常使用后者area应基于实际多边形计算而非简单取bbox面积iscrowd标记会影响评估指标计算单个物体应始终设为04. 从Labelme到COCO的格式转换实战下面我们实现一个健壮的转换脚本处理各种边界情况import json import os import numpy as np from datetime import datetime from pathlib import Path from tqdm import tqdm class Labelme2COCO: def __init__(self, class_mapping): :param class_mapping: 字典将labelme标签映射到COCO类别ID self.class_mapping class_mapping self.coco { info: { description: Custom Dataset, url: , version: 1.0, year: datetime.now().year, contributor: , date_created: datetime.now().strftime(%Y-%m-%d %H:%M:%S) }, licenses: [{id: 1, name: Academic Use}], images: [], annotations: [], categories: [] } # 初始化类别信息 for name, cid in class_mapping.items(): self.coco[categories].append({ id: cid, name: name, supercategory: object }) def _calculate_area(self, segmentation): 计算多边形区域面积 poly np.array(segmentation).reshape(-1, 2) return 0.5 * np.abs(np.dot(poly[:, 0], np.roll(poly[:, 1], 1)) - np.dot(poly[:, 1], np.roll(poly[:, 0], 1))) def _get_bbox(self, segmentation): 从多边形坐标计算外接矩形 poly np.array(segmentation).reshape(-1, 2) x_min, y_min np.min(poly, axis0) x_max, y_max np.max(poly, axis0) return [float(x_min), float(y_min), float(x_max - x_min), float(y_max - y_min)] def convert(self, labelme_dir, output_path): 执行转换 labelme_files list(Path(labelme_dir).glob(*.json)) annotation_id 1 for image_id, json_file in enumerate(tqdm(labelme_files)): with open(json_file) as f: labelme_data json.load(f) # 添加图像信息 img_name labelme_data[imagePath] self.coco[images].append({ id: image_id, file_name: img_name, width: labelme_data[imageWidth], height: labelme_data[imageHeight], license: 1, date_captured: datetime.now().strftime(%Y-%m-%d %H:%M:%S) }) # 处理每个标注 for shape in labelme_data[shapes]: if shape[shape_type] ! polygon: continue # 转换多边形格式 segmentation [] for point in shape[points]: segmentation.extend(point) # 添加到COCO标注 self.coco[annotations].append({ id: annotation_id, image_id: image_id, category_id: self.class_mapping[shape[label]], segmentation: [segmentation], area: self._calculate_area(segmentation), bbox: self._get_bbox(segmentation), iscrowd: 0 }) annotation_id 1 # 保存结果 with open(output_path, w) as f: json.dump(self.coco, f, indent2) # 使用示例 converter Labelme2COCO({parking_space: 1, vehicle: 2}) converter.convert(path/to/labelme_jsons, output/coco_format.json)转换过程中的典型陷阱ID冲突确保image_id和annotation_id的生成策略不会导致重复坐标系统差异Labelme使用左上角原点需确认与模型要求是否一致类别映射遗漏所有Labelme标签必须能在class_mapping中找到对应项顶点顺序影响某些模型对多边形顶点顺序敏感建议统一为顺时针5. 数据验证与SOLOv2适配转换完成后我们需要验证数据能否被SOLOv2正确加载。推荐使用以下检查清单数据完整性验证from pycocotools.coco import COCO coco COCO(path/to/coco_format.json) print(f数据集包含 {len(coco.imgs)} 张图像) print(f共 {len(coco.anns)} 个标注实例) print(f类别分布: {coco.getCatIds()}) # 可视化检查 import matplotlib.pyplot as plt img_ids coco.getImgIds()[:3] for img_id in img_ids: img_info coco.loadImgs(img_id)[0] ann_ids coco.getAnnIds(imgIdsimg_id) annotations coco.loadAnns(ann_ids) # 显示图像和标注 img plt.imread(fimages/{img_info[file_name]}) plt.imshow(img) coco.showAnns(annotations) plt.show()SOLOv2特定适配要点修改mmdet/datasets/coco.py中的CLASSES元组为自定义类别调整配置文件中num_classes参数原始类别数1背景确保mask_feat_head的num_classes与特征维度匹配验证阶段可能出现显存不足问题可尝试减小验证批次大小使用torch.no_grad()降低输入图像分辨率性能优化建议对大量小物体场景调整scale_ranges参数修改num_grids参数平衡精度与速度使用DCNv2增强特征提取能力适当调整sigma参数控制mask生成质量在实际停车位分割项目中经过完整数据流程准备的数据集能使SOLOv2达到约85%的mask AP显著优于直接使用矩形框标注数据的性能。

相关文章:

从标注到部署:手把手教你用Labelme标注数据并转COCO格式,喂给SOLOv2做实例分割

从零构建实例分割数据集:Labelme标注与COCO格式转换全流程实战 在计算机视觉领域,高质量的数据标注是模型成功的基础。不同于常规的目标检测任务,实例分割要求精确到像素级别的标注,这对数据准备工作提出了更高要求。本文将带您完…...

智慧树刷课插件终极指南:3步实现视频自动化学习

智慧树刷课插件终极指南:3步实现视频自动化学习 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频学习流程而烦恼吗?每…...

别再乱刷题了!用Python/Java攻克PAT乙级甲级:一份来自知乎的保姆级题型分类与资源清单

用Python/Java高效攻克PAT:题型分类与实战资源全指南 当你第一次打开PAT题库时,面对数百道题目可能会感到无从下手。作为一位曾经用Python三个月从零基础到PAT甲级满分的过来人,我深刻理解选择合适的刷题策略有多么重要。与传统C刷题路径不同…...

STM32 DAP 烧录报错-最终解决方法的原理和操作逻辑

STM32 DAP 烧录报错(SWD/JTAG Communication Failure / Flash Download failed)最终解决方法的原理和操作逻辑针对遇到的 SWD/JTAG Communication Failure、Flash Download failed - Target DLL has been cancelled、Flash Download failed - "Cort…...

3步搭建智能媒体库:MoviePilot让NAS影视管理变简单

3步搭建智能媒体库:MoviePilot让NAS影视管理变简单 【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot MoviePilot是一个专注于NAS媒体库自动化管理的开源工具,通过智能化的设计和简洁…...

【技巧】用adb给quest眼镜安装apk

使用如下命令, #用usb连接quest眼镜 adb devices #显示连接设备 #如果显示unauthorized,则重新启动quest眼镜 adb install xxx.apk #安装apk软件...

从Java老手到Rust新手:我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录

从Java老手到Rust新手:我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录 第一次在IntelliJ IDEA里创建Rust项目时,我下意识地点击了"New Project"——就像过去十年里创建Java项目那样自然。然而接下来的半小时,我的表情从困惑变…...

项目介绍 MATLAB实现基于高斯过程回归(GPR)进行风电功率预测(含模型描述及部分示例代码) 专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

MATLAB实现基于高斯过程回归(GPR)进行风电功率预测的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)…...

设计研发费用加计扣除智能核算校核代码,测算AI核算金额与合规标准差值,精准识别核算不准的风险数据。

「研发费用加计扣除智能核算校核系统」的设计与实际方案,适合用于✅ 智能会计课程 / Python 财税实战 / 高新企业合规项目。一、实际应用场景描述在高新技术企业、科技型中小企业中,研发费用加计扣除是核心税收优惠,但存在复杂核算要求&#…...

Obsidian知识管理模板:告别信息碎片化,构建你的第二大脑

Obsidian知识管理模板:告别信息碎片化,构建你的第二大脑 【免费下载链接】obsidian-template Starter templates for Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-template 你是否经常感到信息过载?收藏的文章从未…...

别再只盯着I2C了!聊聊SoC里那个低调的音频管家:I2S协议详解

别再只盯着I2C了!聊聊SoC里那个低调的音频管家:I2S协议详解 当工程师们讨论SoC内部通信协议时,I2C和SPI总是最先被提及的明星。但如果你正在设计音频子系统,有一个更重要的协议却常常被忽视——它就是I2S。这个默默工作在幕后的音…...

暗黑3终极自动化指南:D3KeyHelper图形化宏工具5分钟快速上手教程

暗黑3终极自动化指南:D3KeyHelper图形化宏工具5分钟快速上手教程 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款免费开…...

FanControl深度体验:5个步骤打造你的专属智能风扇控制系统

FanControl深度体验:5个步骤打造你的专属智能风扇控制系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

利用重力势能为电子表供电的创新设计

1. 项目背景与设计初衷作为一名电子设备爱好者,我多年来一直使用Casio F91W这款经典数字手表。它的可靠性毋庸置疑,但每次更换CR2016纽扣电池时,总让我感到一丝不安。这种一次性锂电池虽然单颗仅含36毫克锂,但考虑到全球数以亿计的…...

别再手动切图了!用OpenCV实现智能图像自动分块与拼接(附C++完整源码)

别再手动切图了!用OpenCV实现智能图像自动分块与拼接(附C完整源码) 当面对一张分辨率高达数万像素的卫星影像、病理切片或街景全景图时,传统图像处理方法往往束手无策——GPU显存不足、模型输入尺寸受限、内存溢出等问题接踵而至。…...

第一个shell脚本

Bash脚本: 能够监控指定名称的进程sshd 如果进程存在,则输出其PID和状态信息 如果进程不存在,则自动尝试重启该进程(可假设进程启动命令已知),并记录日志(包含时间戳)shell脚本 #!/bin/bash #要监控的进程名 namessh #日志路径 lo…...

GLM-4-9B-Chat-1M快速体验:vLLM部署+Chainlit调用,零代码搭建AI对话平台

GLM-4-9B-Chat-1M快速体验:vLLM部署Chainlit调用,零代码搭建AI对话平台 1. 模型简介 GLM-4-9B-Chat-1M是智谱AI推出的最新一代开源对话模型,支持高达1M(约200万中文字符)的上下文长度。这个版本在语义理解、数学推理…...

三步重塑Windows 11纯净体验:Win11Debloat系统优化深度指南

三步重塑Windows 11纯净体验:Win11Debloat系统优化深度指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter a…...

终极指南:如何用unnpk工具破解网易游戏NPK资源包

终极指南:如何用unnpk工具破解网易游戏NPK资源包 【免费下载链接】unnpk 解包网易游戏NeoX引擎NPK文件,如阴阳师、魔法禁书目录。 项目地址: https://gitcode.com/gh_mirrors/un/unnpk 你是否曾好奇那些精美的游戏资源是如何被打包和保护的&#…...

3分钟掌握WindowResizer:彻底解决Windows窗口尺寸调整难题

3分钟掌握WindowResizer:彻底解决Windows窗口尺寸调整难题 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为Windows系统中那些顽固的、无法调整大小的应用程序窗口…...

Phi-3.5-mini-instruct效果展示:中文诗歌创作、对联生成、节日祝福文案实录

Phi-3.5-mini-instruct效果展示:中文诗歌创作、对联生成、节日祝福文案实录 1. 模型简介与特点 Phi-3.5-mini-instruct 是一款轻量级但功能强大的中文文本生成模型,特别适合创意写作类任务。与常规问答模型不同,它在诗歌、对联、祝福文案等…...

如何高效使用ComfyUI Essentials:5个实用技巧快速上手AI图像处理

如何高效使用ComfyUI Essentials:5个实用技巧快速上手AI图像处理 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials ComfyUI Essentials是一款专为ComfyUI设计的强大图像处理插件集,它为AI图…...

Unity 2021.1 + Skynet 服务端通信:从零搞定 Sproto 协议配置与心跳机制实战

Unity 2021.1与Skynet服务端通信:Sproto协议与心跳机制深度实践 当Unity客户端需要与Skynet服务端建立稳定通信时,协议设计与心跳机制往往是开发者最先遇到的两大技术门槛。本文将带你从零构建一个完整的通信Demo,不仅涵盖Sproto协议的基础配…...

笔记本EC与BIOS的‘暗号’:深入解读Q Event与GPIO SMI在电源、按键背后的协作

笔记本EC与BIOS的‘暗号’:深入解读Q Event与GPIO SMI在电源、按键背后的协作 当按下笔记本电源键时,这个看似简单的动作背后隐藏着一场精密的硬件交响乐。嵌入式控制器(EC)与BIOS通过Q Event和GPIO SMI这两种特殊通信机制&#…...

Adobe-GenP 3.0:三步快速激活Adobe全家桶的终极指南

Adobe-GenP 3.0:三步快速激活Adobe全家桶的终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费发愁吗&…...

CSGO服务器皮肤插件避坑指南:从Weapons到PTaH,完整安装与防封号提醒

CSGO服务器皮肤插件深度指南:安全部署与风险控制实战 在私人CSGO服务器上实现全武器皮肤和手套自定义,是许多服主提升玩家体验的常见需求。不同于基础服务器搭建,皮肤插件的部署涉及更多技术细节和潜在风险考量。本文将系统梳理从Weapons、Gl…...

PID控制器原理与嵌入式系统实现详解

1. PID控制器基础解析PID控制器作为工业控制领域的"瑞士军刀",已经存在了超过一个世纪。我第一次接触PID是在大学实验室调试温控系统时,当时那个老旧的模拟PID控制器让我既困惑又着迷。如今数字PID已成为嵌入式系统的标配,但许多开…...

PyTorch分布式训练卡住不动?手把手教你排查torch.distributed.launch的5个常见坑

PyTorch分布式训练卡住不动?手把手教你排查torch.distributed.launch的5个常见坑 当你第一次尝试在多个GPU或多个节点上运行PyTorch分布式训练时,最令人沮丧的莫过于看到程序卡在初始化阶段,既不报错也不继续执行。这种情况我遇到过太多次了—…...

从‘小隔间’到‘光晕’:用大白话拆解CCD/CMOS传感器那些事儿(附避坑指南)

从‘小隔间’到‘光晕’:用大白话拆解CCD/CMOS传感器那些事儿(附避坑指南) 想象你正用手机拍摄落日,太阳周围却糊成一团光斑;或是夜间拍照时,路灯变成了拖着长尾巴的彗星。这些让人头疼的成像问题&#xff…...

5分钟快速上手:Bulk Crap Uninstaller批量卸载工具完全指南

5分钟快速上手:Bulk Crap Uninstaller批量卸载工具完全指南 【免费下载链接】Bulk-Crap-Uninstaller Remove large amounts of unwanted applications quickly. 项目地址: https://gitcode.com/gh_mirrors/bu/Bulk-Crap-Uninstaller Bulk Crap Uninstaller&a…...