文章目录
- 一、Labelme是什么?
- 二、安装步骤
- 1.新建虚拟环境
- 2.安装Labelme
- 3.Labelme的使用
- 三、json2yolo
一、Labelme是什么?
Labelme是一个用于图像标注的开源工具,可以实现图像标注、语义分割、实例分割等。
本文记录一下labelme的安装与使用,主要是用于语义分割的,因为我只有一个类别~。
二、安装步骤
1.新建虚拟环境
我这边是新建了一个新的虚拟环境,这样看起来更直观一些。当然也可以在已安装的虚拟环境中安装,毕竟也只是一个工具模块。新建虚拟环境的推荐使用Annconda进行新建虚拟环境。在安装完成Annconda后,在菜单栏搜索界面中搜索Anaconda Prompt (Anaconda)并打开,输入conda create -n test python=3.8
创建虚拟环境。
conda create -n test python=3.8
输入y
确认安装。
命令会自动安装一些必要库,结束之后,虚拟环境就创建完成啦。
2.安装Labelme
-
查看本地使用annconda创建的所有虚拟环境,可以看到刚刚创建的
test
也在其中。conda env list
-
输入
conda activate test
激活虚拟环境,test
为刚刚创建的虚拟环境名称conda activate test
在输入了激活命令后,便由基础环境(base)
转到了(test)
,输入conda install pyqt
,这是在安装labelme之前需要安装的第一个库,安装过程中选择y
继续安装pyqt的相关库。
conda install pyqt
-
继续输入
conda install pillow
安装pillow模块conda install pillow
- 在安装labelme库的时候就不能在
conda
里面进行安装了,需要使用pip
命令。这里记录一个简便进入虚拟环境的方法。打开Annconda的安装目录D:\Anaconda3\envs
(这里是我的安装路径),在envs
里面就是所有创建的虚拟环境啦。进入刚刚创建的虚拟环境,在D:\Anaconda3\envs\test\Scripts
此目录下,在上方文件目录中输入cmd
就进入到虚拟环境中了。
连接清华镜像源后进行安装
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
至此,模块的安装部分就结束了,在命令行中输入labelme
,便会打开labelme的操作界面。
ps:在安装pyqt和pillow的时候也可以像安装labelme一样在文件中打开虚拟环境,连接镜像源进行安装。
3.Labelme的使用
在控制台输入labelme
打开Labelme。
在labelme软件中,最主要的几个功能如下:
1️⃣打开:只打开一张图像进行标注,建议通过第二个功能打开包含图像的文件夹,进行标注。
2️⃣打开目录:点击后会弹出一个窗口,选择一个文件夹,文件夹中包含要进行标注的图像。
3️⃣上一幅:在打开目录的情况下,点击后可切换到上一张图片,也可以使用快捷键a
。
4️⃣下一幅:在打开目录的情况下,点击后可切换到下一张图片,也可以使用快捷键d
。
5️⃣保存:在标注完成后,会生成标签文件。保存选项即选择本地的一个文件夹保存标签文件。建议在选择完打开目录
后,便选择一个文件夹路径保存将要生成的标签文件。
6️⃣创建多边形:这一个功能是最重要的,选择了一张图像后便可以进行标注,选择这个功能后即可这对界面中显示的图像进行分割标注,注意标注点要尽可能贴合目标,也可以使用快捷键w
。
❗ 注意在标注的时候,最后一个点要首尾相连。完成后会弹出一个窗口,在窗口内输入标签,确认后一幅图像就标注完成啦。这样便会在保存目录中生成标签的json文件。
在json文件中,
shapes
用于内存放目标的相关信息;
imagePath
表示被标注图像的相对存储路径;
imageData
表示被存储的图像的编码数据;
imageHeight
表示该图像的高度;
imageWidth
表示该图像的宽度。
shapes
内中的label
是目标名称,points
内保存了标注过程中点的坐标,从左上角(0,0)开始算起。
三、json2yolo
为了能够满足yolo模型的训练,其传入的标签格式是txt的,所以需要将标注的json格式的数据转成txt格式,代码如下:
import cv2
import os
import json
import glob
import numpy as np
def convert_json_label_to_yolov_seg_label():
json_path = r"D:\\image_denoising_test\\self_test\\RestLabel" # 本地json路径
json_files = glob.glob(json_path + "/*.json")
print(json_files)
# 指定输出文件夹
output_folder = "D:/image_denoising_test/self_test/RestLabel/txt" # txt存放路径
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for json_file in json_files:
print(json_file)
with open(json_file, 'r') as f:
json_info = json.load(f)
img = cv2.imread(os.path.join(json_path, json_info["imagePath"]))
height, width, _ = img.shape
np_w_h = np.array([[width, height]], np.int32)
txt_file = os.path.join(output_folder, os.path.basename(json_file).replace(".json", ".txt"))
with open(txt_file, "w") as f:
for point_json in json_info["shapes"]:
txt_content = ""
np_points = np.array(point_json["points"], np.int32)
norm_points = np_points / np_w_h
norm_points_list = norm_points.tolist()
txt_content += "0 " + " ".join([" ".join([str(cell[0]), str(cell[1])]) for cell in norm_points_list]) + "\n"
f.write(txt_content)
convert_json_label_to_yolov_seg_label()