云计算百科
云计算领域专业知识百科平台

labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)

引言:为什么选择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 等。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!