图像手动标注-labelme+yolo格式导出
conda环境
运行以下命令来激活你的虚拟环境:
conda activate labelme
如果你没有创建 labelme
环境,首先需要创建一个环境并安装 labelme
:
conda create -n labelme python=3.8
conda activate labelme
conda install -c conda-forge labelme
安装 Qt 相关依赖
conda install pyqt
激活环境后,在同一个命令行窗口中运行以下命令来启动 labelme
:
labelme
这条命令将会启动 labelme
图形界面,你可以开始加载图片并进行标注。
LabelMe
提供了几种常见的标注方式:
- 矩形框(RectBox):点击并拖动来标注矩形框,适用于目标检测任务。
- 多边形(Polygon):点击每个点来创建一个多边形,适用于不规则形状的目标。
- 线(Line):标注直线,用于某些特定任务。
- 点(Point):标注单个点,通常用于关键点检测任务。
保存标注
每次标注完成后,可以点击 “Save” 按钮来保存你的标注。LabelMe
会将标注保存为 JSON 格式文件,文件内容包含标注框的位置、类别以及图片的其他信息。
- 保存后的文件通常会以
.json
扩展名结尾。例如:image1.json
。
利用python将json文件关键信息导出为yolo格式便于使用
import json
import os
# 类别映射:定义 JSON 文件中的类别名称到 YOLO 编号的映射
class_mapping = {
"egret": 0,
"cattle_egret": 1,
"heron": 2,
"magpie": 3
}
# 数据集文件夹路径
base_folder = "E:/shixi/other_images/other_images" # 替换为你的数据集根目录
# 遍历每个类别文件夹
for class_name in ["egret", "cattle_egret", "heron", "magpie"]:
class_folder = os.path.join(base_folder, class_name)
# 遍历类别文件夹中的每个 JSON 文件
for file in os.listdir(class_folder):
# 查找 .json 文件
if file.endswith(".json"):
json_path = os.path.join(class_folder, file)
print(f"Processing JSON file: {json_path}")
# 打开 JSON 文件
with open(json_path, "r") as f:
data = json.load(f)
# 获取图像文件名前缀
image_name = file.replace(".json", "")
txt_filename = f"{image_name}.txt"
txt_path = os.path.join(class_folder, txt_filename)
# YOLO 格式的标注内容
yolo_lines = []
# 遍历 JSON 文件中的标注信息
for shape in data["shapes"]:
label = shape["label"]
if label in class_mapping:
class_id = class_mapping[label]
# 获取边界框的坐标
points = shape["points"]
x_min = min(points[0][0], points[1][0])
y_min = min(points[0][1], points[1][1])
x_max = max(points[0][0], points[1][0])
y_max = max(points[0][1], points[1][1])
# 计算 YOLO 格式的中心点和宽高
x_center = (x_min + x_max) / 2 / data["imageWidth"]
y_center = (y_min + y_max) / 2 / data["imageHeight"]
width = (x_max - x_min) / data["imageWidth"]
height = (y_max - y_min) / data["imageHeight"]
# 添加到 YOLO 格式的标注行
yolo_lines.append(f"{class_id} {x_center} {y_center} {width} {height}\n")
# 将 YOLO 格式的内容写入 .txt 文件
with open(txt_path, "w") as f:
f.writelines(yolo_lines)
print(f"Converted {json_path} to {txt_path}")