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 cv2import osfrom datetime import datetimedef 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 jsonimport osimport cv2import argparsefrom tqdm import tqdmdef 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_pathdef 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),每行一个类别名称,例如:
personcarbicycle
这将用于将类别名称映射为 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 等。