引言:为什么选择labelme?
在人工智能和机器学习领域,高质量的标注数据是训练优秀模型的基础。而 labelme作为一款开源、跨平台的图像标注工具,凭借其强大的功能和易用性,成为了数据标注领域的热门选择。
它支持多种标注类型,如矩形框、多边形、线段、点、文本等,能满足目标检测、图像分割、姿态估计等多种任务的标注需求。更重要的是,它操作简单,对于新手非常友好,同时生成的标注数据格式规范,便于后续的模型训练。
本文将从labelme的下载安装开始,详细介绍其界面功能、各种标注类型的操作流程、标注数据的保存与格式转换,以及常见问题的解决方法,带你一站式掌握 labelme数据标注技能。
labelme数据标注保姆级教程:从安装到格式转换全流程
一、labelme 下载与安装
1.1 安装前的准备
在安装 labelme之前,需要确保你的电脑已经安装了 Python 环境。因为 labelme 是基于 Python 开发的,Python 版本建议选择 3.6 及以上,以保证兼容性。
可以在 Python 官方网站(https://www.python.org/)下载并安装适合自己操作系统的 Python 版本。安装完成后,建议配置好环境变量,以便在命令行中能够直接使用 Python 和 pip 命令。
建议直接参考我们之前的内容: 【打怪升级 – 01】保姆级机器视觉入门指南:硬件选型 + CUDA/cuDNN/Miniconda/PyTorch/Pycharm 安装全流程(附版本匹配秘籍+文末有视频讲解)
1.2 安装 labelme
labelme 的安装非常简单,通过 pip 命令即可完成。
打开命令行窗口(Windows 系统可以使用 Win+R 组合键打开运行窗口,输入 cmd 后回车;Mac 和 Linux 系统可以直接打开终端),输入以下命令:
pip install labelme
等待安装完成即可。如果安装过程中出现网络问题,可以尝试使用国内的镜像源(非常推荐),例如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple labelme
安装完成后,在命令行中输入 “labelme” 并回车,如果能够成功启动 LabelMe 软件,则说明安装成功。
二、labelme 界面介绍
成功启动 labelme后,我们先来熟悉一下它的界面布局,以便后续操作更加顺畅。
2.1 菜单栏
-
文件:包含新建标注文件、打开图像、保存标注结果、关闭等基本文件操作。
-
编辑:提供撤销、重做、复制、粘贴等编辑功能,方便在标注过程中进行修改。
-
视图:可以控制一些界面元素的显示与隐藏,如标注工具栏、状态栏等。
-
帮助:包含软件的帮助文档、关于信息等,当遇到问题时可以查阅。
2.2 标注工具栏
标注工具栏位于界面左侧,包含了各种标注工具,从左到右依次为:
-
Open:打开一张图像进行标注。
-
Save:保存当前的标注结果。
-
Create Rectangle:创建矩形框标注,适用于目标检测任务中对目标进行框选。
-
Create Polygon:创建多边形标注,常用于图像分割任务,能够精确地勾勒出目标的轮廓。
-
Create Circle:创建圆形标注。
-
Create Line:创建线段标注,可用于标注道路、边缘等。
-
Create Point:创建点标注,适合标注关键点,如人脸特征点、物体的角点等。
-
Create Text:创建文本标注,用于对图像中的区域进行文字说明。
-
Edit Polygons:编辑多边形标注,可以调整多边形的顶点位置。
-
Delete Selected Shape:删除选中的标注形状。
-
Duplicate Shape:复制选中的标注形状。
2.3 图像显示区
界面中间的大部分区域是图像显示区,用于显示待标注的图像以及标注的结果。在标注过程中,可以通过鼠标滚轮放大或缩小图像,也可以按住鼠标左键拖动图像来调整显示位置。
2.4 标注信息区
界面右侧是标注信息区,当创建一个标注形状后,这里会显示该标注的相关信息,如标注的类别名称、坐标信息等。可以在这里修改标注的类别名称,也可以对标注的坐标进行精确调整。
三、labelme标注流程
前期准备:视频转图片
import cv2
import os
from datetime import datetime
def video_to_images(video_path, output_folder=None, interval=1, prefix="frame"):
"""
将视频文件转换为图片
参数:
video_path (str): 视频文件路径
output_folder (str): 输出图片文件夹,默认为视频名+_frames
interval (int): 提取帧的间隔(秒),默认为1秒
prefix (str): 图片文件名前缀,默认为"frame"
"""
# 检查视频文件是否存在
if not os.path.exists(video_path):
print(f"错误: 视频文件 '{video_path}' 不存在")
return
# 创建输出文件夹
if output_folder is None:
video_name = os.path.splitext(os.path.basename(video_path))[0]
output_folder = f"{video_name}_frames_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
os.makedirs(output_folder, exist_ok=True)
print(f"图片将保存到: {output_folder}")
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 检查视频是否成功打开
if not cap.isOpened():
print(f"错误: 无法打开视频文件 '{video_path}'")
return
# 获取视频帧率
fps = cap.get(cv2.CAP_PROP_FPS)
if fps <= 0:
fps = 30 # 默认帧率
print(f"视频帧率: {fps:.2f} FPS")
# 计算每隔多少帧提取一次(根据间隔时间)
frame_interval = int(fps * interval)
print(f"每隔 {interval} 秒提取一帧,即每隔 {frame_interval} 帧")
frame_count = 0
saved_count = 0
# 循环读取视频帧
while True:
ret, frame = cap.read()
# 如果读取失败,退出循环
if not ret:
break
# 按照指定间隔保存帧
if frame_count % frame_interval == 0:
# 生成文件名
image_name = f"{prefix}_{saved_count:06d}.jpg"
image_path = os.path.join(output_folder, image_name)
# 保存帧为图片
cv2.imwrite(image_path, frame)
saved_count += 1
# 每100帧打印一次进度
if saved_count % 100 == 0:
print(f"已保存 {saved_count} 张图片")
frame_count += 1
# 释放资源
cap.release()
print(f"转换完成,共保存 {saved_count} 张图片")
if __name__ == "__main__":
# 示例用法
video_file = "30122904208-1-192.mp4" # 替换为你的视频文件路径
output_dir = None # 设为None将自动创建文件夹
time_interval = 15 # 每隔1秒提取一帧
video_to_images(
video_path=video_file,
output_folder=output_dir,
interval=time_interval
)
3.1 打开图像
点击标注工具栏中的 “Open” 按钮,或者在菜单栏中选择 “File”->“Open”,在弹出的文件选择窗口中找到需要标注的图像,选中后点击 “打开”,图像就会显示在图像显示区。
3.2 矩形框标注(目标检测)
点击标注工具栏中的 “Create Rectangle” 按钮。
在图像显示区,用鼠标左键点击目标的左上角,然后拖动鼠标到目标的右下角,松开鼠标左键,即可创建一个矩形框。
此时在标注信息区会出现一个 “label” 输入框,在其中输入目标的类别名称,如 “car”“person” 等,然后按回车键确认。
如果需要调整矩形框的位置或大小,可以用鼠标拖动矩形框的边或角来进行调整。
重复上述步骤,对图像中的所有目标进行矩形框标注。
3.3 多边形标注(图像分割)
点击标注工具栏中的 “Create Polygon” 按钮。
用鼠标左键依次点击目标轮廓上的关键点,每点击一次就会创建一个顶点,这些顶点会自动用线段连接起来。
当标注到最后一个顶点时,双击鼠标左键,即可完成多边形的创建,此时多边形会自动闭合。
在标注信息区的 “label” 输入框中输入目标的类别名称,按回车键确认。
如果需要编辑多边形,可以点击 “Edit Polygons” 按钮,然后用鼠标拖动多边形的顶点来调整形状。
对于图像中的每个目标,都进行多边形标注。
3.4 点标注(关键点检测)
点击标注工具栏中的 “Create Point” 按钮。
在图像中需要标注关键点的位置点击鼠标左键,即可创建一个点标注。
在标注信息区输入该关键点的类别名称,如 “eye” “nose” 等。
按照同样的方法,标注出所有需要的关键点。
3.5 保存标注结果
完成图像的标注后,点击标注工具栏中的 “Save” 按钮,或者在菜单栏中选择 “File”->“Save”,会弹出保存文件窗口。建议将标注结果与图像保存在同一个文件夹中,文件名可以与图像文件名相同,标注文件的格式为.json。
四、标注数据格式转换
labelme 生成的标注文件是.json 格式的,这种格式虽然便于存储和编辑,但在很多深度学习框架中,需要将其转换为特定的格式(如 COCO 格式、VOC 格式)才能用于模型训练。下面介绍如何将 labelme 的.json 格式标注数据转换为常用的格式。
4.1 转换为 YOLO标签格式
import json
import os
import cv2
import argparse
from tqdm import tqdm
def convert_labelme_to_yolo(json_path, output_dir, class_names):
"""
将单个LabelMe JSON文件转换为YOLO格式
参数:
json_path: LabelMe标注的JSON文件路径
output_dir: 输出YOLO格式标签的目录
class_names: 类别名称列表,用于将类别名称映射为索引
"""
# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)
# 读取JSON文件
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 获取图像宽高
img_width = data['imageWidth']
img_height = data['imageHeight']
# 获取输出文件名(与图片名相同,后缀改为txt)
img_name = os.path.splitext(os.path.basename(data['imagePath']))[0]
txt_path = os.path.join(output_dir, f"{img_name}.txt")
# 处理每个标注
with open(txt_path, 'w', encoding='utf-8') as f:
for shape in data['shapes']:
# 获取类别名称并转换为索引
label = shape['label']
if label not in class_names:
print(f"警告: 类别 '{label}' 不在类别列表中,已跳过")
continue
class_id = class_names.index(label)
# 获取标注点并归一化
points = shape['points']
normalized_points = []
for (x, y) in points:
# 归一化到[0,1]范围
norm_x = x / img_width
norm_y = y / img_height
normalized_points.append(f"{norm_x:.6f} {norm_y:.6f}")
# 对于多边形,YOLO格式为: 类别ID x1 y1 x2 y2 … xn yn
line = f"{class_id} " + " ".join(normalized_points) + "\\n"
f.write(line)
return txt_path
def batch_convert(input_dir, output_dir, class_names_path):
"""
批量转换目录中的所有LabelMe JSON文件
参数:
input_dir: 包含LabelMe JSON文件的目录
output_dir: 输出YOLO格式标签的目录
class_names_path: 类别名称文件路径
"""
# 读取类别名称
with open(class_names_path, 'r', encoding='utf-8') as f:
class_names = [line.strip() for line in f if line.strip()]
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 获取所有JSON文件
json_files = [f for f in os.listdir(input_dir) if f.endswith('.json')]
if not json_files:
print(f"警告: 在目录 '{input_dir}' 中未找到任何JSON文件")
return
# 批量转换
print(f"找到 {len(json_files)} 个JSON文件,开始转换…")
for json_file in tqdm(json_files):
json_path = os.path.join(input_dir, json_file)
try:
convert_labelme_to_yolo(json_path, output_dir, class_names)
except Exception as e:
print(f"转换文件 '{json_file}' 时出错: {str(e)}")
print(f"转换完成,结果保存在: {output_dir}")
if __name__ == "__main__":
# 解析命令行参数
parser = argparse.ArgumentParser(description='将LabelMe标注的JSON文件转换为YOLO格式')
parser.add_argument('–input', type=str, required=True, help='输入JSON文件或包含JSON文件的目录')
parser.add_argument('–output', type=str, required=True, help='输出YOLO格式标签的目录')
parser.add_argument('–classes', type=str, required=True, help='包含类别名称的文本文件路径')
args = parser.parse_args()
# 检查输入是文件还是目录
if os.path.isfile(args.input) and args.input.endswith('.json'):
# 单个文件转换
with open(args.classes, 'r', encoding='utf-8') as f:
class_names = [line.strip() for line in f if line.strip()]
convert_labelme_to_yolo(args.input, args.output, class_names)
print(f"转换完成,结果保存在: {args.output}")
elif os.path.isdir(args.input):
# 批量转换
batch_convert(args.input, args.output, args.classes)
else:
print(f"错误: 输入 '{args.input}' 不是有效的JSON文件或目录")
使用说明:
首先需要准备一个类别名称文件(例如 classes.txt),每行一个类别名称,例如:
person
car
bicycle
这将用于将类别名称映射为 YOLO 所需的数字索引。
安装必要的依赖库:
pip install opencv-python tqdm
使用方法:
-
转换单个 JSON 文件:
python labelme2yolo.py ––input path/to/annotation.json ––output path/to/output_dir ––classes path/to/classes.txt
-
批量转换目录中的所有 JSON 文件:
python labelme2yolo.py ––input path/to/json_dir ––output path/to/output_dir ––classes path/to/classes.txt
转换说明:
- 脚本会保持与原图片相同的文件名,但扩展名改为.txt
- YOLO 格式采用归一化坐标(0-1 范围),格式为:类别ID x1 y1 x2 y2 … xn yn
- 支持多边形标注(LabelMe 中的 polygon 类型)
- 对于不在类别列表中的标注会发出警告并跳过
五、常见问题与避坑指南
5.1 标注过程中软件崩溃
-
原因:可能是图像过大、电脑内存不足,或者 labelme 软件存在 bug。
-
解决方法:尽量选择合适大小的图像进行标注,避免标注过大的图像;定期保存标注结果,以防止数据丢失;如果频繁崩溃,可以尝试更新 LabelMe 到最新版本,或者重新安装。
5.2 标注的类别名称错误
-
原因:在输入类别名称时不小心输错。
-
解决方法:在标注信息区找到对应的标注,直接修改 “label” 输入框中的内容,然后按回车键确认即可。
5.3 格式转换失败
-
原因:可能是标注文件不完整、类别名称与 labels.txt 文件中的不一致,或者转换工具安装出现问题。
-
解决方法:检查标注文件是否完整,确保每个标注都有正确的类别名称;核对 labels.txt 文件中的类别名称是否与标注中的一致;重新安装转换工具,确保安装成功。
5.4 无法打开图像
-
原因:图像路径包含特殊字符,或者图像格式不被支持。
-
解决方法:将图像路径修改为不包含特殊字符的路径;尝试将图像转换为常见的格式,如.jpg、.png 等。
评论前必须登录!
注册