labelme的使用

labelme的使用,第1张

一、安装步骤

在自己的新建的虚拟环境中,安装以下包

1. pip install labelme
2. pip install pyqt5
3. pip install pillow==4.0.0
二、示例步骤演示

2.点击save,进行保存

三、对labelme的标签结果进行验证

1.opencv-python读取图片和lableme标注的json文件并显示mask

import cv2
import numpy as np
import json

json_path = './1.json'                                                      # json文件的路径
img_path = './1.jpg'                                                        # 图片的路径

labelme_json = json.load(open(json_path, encoding='utf-8'))                 # 读取json文件
img = cv2.imread(img_path)                                                  # 读取图片

# (2160, 3840, 3) 图片的高为2160, 宽为3840
mask = np.zeros((2160, 3840, 1), dtype=np.uint8)
mask2 = np.zeros((2160, 3840, 3), dtype=np.uint8)
points = labelme_json['shapes'][0]['points']                                # 拿出第一个物体的坐标
points = np.array(points)                                                   # 转化成ndarray
points = points.reshape(-1, 1, 2)                                           # : (18, 1, 2)
points = points.astype(np.int32)                                            # 把坐标点的类型由float64转化为int32

cv2.fillConvexPoly(mask, points, (255,))                                    # 单个多边形填充,
cv2.fillConvexPoly(mask2, points, (255, 255, 255))

# 显示mask
cv2.namedWindow("mask", 2)                                                  # WINDOW_NORMAL参数可以手动改变窗口的大小
cv2.imshow('mask', mask)
cv2.waitKey(0)

# new_image = cv2.bitwise_and(img, mask)
new_image = cv2.bitwise_and(img, mask2)                                     # 对图像(灰度图像或彩色图像)每个像素值进行二进制“与” *** 作
# new_image[mask2==255] = 100
# 显示mask区域图像
cv2.namedWindow("new_image", 2)
cv2.imshow('new_image', new_image)
cv2.waitKey(0)

2.画 mask( json文件由 labelme 标注 )
3.将使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果(参考这个,这个相当于是用labelme中的命令进行可视化)

使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果

# 1.单文件json格式标签转为png格式
'''
直接cmd终端运行:
  labelme_json_to_dataset 文件名.json
可得到一个文件夹,有4个文件
    img.png,源文件图像
    label.png,标签图像
    label_names.txt,标签中的各个类别的名称
    label_viz.png,源文件与标签融合文件

注:JPG是有损压缩,而PNG是无损压缩,png图像会大于jpg图像。
'''

import os
import shutil


# 2.批量json格式标签转为png格式
# os模块多次调用CMD命令,os.popen() 或 os.system()
# 多次调用labelme_json_to_dataset,为每个json生成一个目录文件(包含4个文件)
def json2png(json_folder, root_folder):
    #  获取文件夹内的文件名
    FileNameList = os.listdir(json_folder)
    print(FileNameList)
    #  激活labelme环境
    os.system("activate labelme")
    for i in range(len(FileNameList)):
        #  判断当前文件是否为json文件
        x = os.path.splitext(FileNameList[i])
        if (x[1] == ".json"):
            json_file = os.path.join(json_folder, FileNameList[i])
            out_file = os.path.join(root_folder, x[0] + '_json')
            #  将该json文件转为png
            #  用法:labelme_json_to_dataset [-h] [-o OUT] json_file
            os.system("labelme_json_to_dataset " + ' -o ' + out_file + ' ' + json_file)


# 3.将文件批量转化成标准格式(即,所有原图像一个文件夹,所有label一个文件夹,所有可视化图像一个文件夹)
def file_split(folder):
    root_folder, Paste_PNG_folder, Paste_label_folder, Paste_label_viz_folder = folder[0], folder[1], folder[2], folder[
        3]

    #  获取文件夹内的文件名
    PathNameList = os.listdir(root_folder)
    print(PathNameList)
    NewFileName = 1
    for i in range(len(PathNameList)):
        #  判断当前文件是否为json文件
        x_folder = os.path.splitext(PathNameList[i])[0]
        print(x_folder)
        img_file = os.path.join(root_folder, x_folder)
        print(img_file)
        FileNameList = os.listdir(img_file)
        # print(FileNameList)

        #  复制img.png文件
        PNG_file = os.path.join(img_file, "img.png")
        new_PNG_file = Paste_PNG_folder + "\" + str(NewFileName) + ".png"
        shutil.copyfile(PNG_file, new_PNG_file)

        #  复制label.png文件
        label_file = os.path.join(img_file, "label.png")
        new_label_file = Paste_label_folder + "\" + str(NewFileName) + ".png"
        shutil.copyfile(label_file, new_label_file)

        #  复制label_viz.png文件
        label_viz_file = os.path.join(img_file, "label_viz.png")
        new_label_viz_file = Paste_label_viz_folder + "\" + str(NewFileName) + ".png"
        shutil.copyfile(label_viz_file, new_label_viz_file)

        #  文件序列名+1
        NewFileName = NewFileName + 1


if __name__ == '__main__':
    json_folder = "./"
    #  保存中间生成文件的文件夹, 每个子目录下有4个文件:img.png,label.png,label_names.txt,label_viz.png
    root_folder = "./spore"
    # 保存最终生成文件的文件夹,原图像、label、label_viz
    Paste_PNG_folder = "./img1"
    Paste_label_folder = "./label1"
    Paste_label_viz_folder = "./label_viz"

    folder = [root_folder, Paste_PNG_folder, Paste_label_folder, Paste_label_viz_folder]
    for folder_x in folder:
        if not os.path.exists(folder_x):
            os.makedirs(folder_x)

    # 用json生成png
    json2png(json_folder, root_folder)
    # 文件分开
    file_split(folder)

4.自己想实现的功能,直接从打标签生成的json文件中,读取坐标点的信息,然后根据坐标点的信息,进行多边形的绘制。

自己实现的代码:

import json
import cv2
from matplotlib import pyplot as plt
from matplotlib.cbook import pts_to_midstep
import numpy as np

print(cv2.__version__)

label_json = json.load(open('1.json', encoding='utf-8'))

value = label_json['shapes']

length = len(value)

img = cv2.imread(r'1.jpg')
fig = img.copy()
all = []
for i in range(length):
    points = value[i]['points']

    pts = np.array(points, dtype=np.int)
    # print(type(new_points))
    # pts = pts.reshape((-1, 1, 2))
    # print(pts)
    all.append(pts)

    # print(fig.shape)
    # print(sum(fig - img))
    # print(sum(fig - img).shape)
    # print(sum(sum(fig - img)))
    # cv2.polylines(fig, [pts], isClosed=True, color=(255, 125, 125), thickness=5)
    # print(sum(sum(fig - img)))
cv2.polylines(fig, all, isClosed=True, color=(255, 125, 125), thickness=5)
cv2.namedWindow('image', 2)
cv2.imshow('image', fig)
cv2.waitKey(0)

要注意dtype的类型要转化成np.int,cv2.polylines()第二个参数的形式[pts]。

import json
import cv2
import numpy as np

print(cv2.__version__)

label_json = json.load(open('1.json', encoding='utf-8'))
# print(label_json)

# print(label_json.keys())

value = label_json['shapes']
# print(value)
# print(len(value))
length = len(value)
# print(length)
for i in range(length):
    points = value[i]['points']
    # print(points)
    # print(type(points))

    pts = np.array(points, dtype=np.int)
    # print(type(new_points))
    # pts = pts.reshape((-1, 1, 2)) 
    # print(pts)

    img = cv2.imread(r'1.jpg')
    fig = img.copy()
    # print(fig.shape)
    print(sum(fig - img))
    print(sum(fig - img).shape)
    print(sum(sum(fig-img)))
    cv2.polylines(fig, [pts], isClosed=True, color=(255, 125, 125), thickness=5)
    print(sum(sum(fig-img)))
    cv2.namedWindow('image', 2)
    cv2.imshow('image', fig)
    cv2.waitKey(0)
    break
# 此处只画了一个目标
# cv2.fillPoly()的使用注意事项同cv2.polylines
import json
import cv2
from matplotlib import pyplot as plt
import numpy as np

label_json = json.load(open('./1.json', encoding='utf-8'))

value = label_json['shapes']

length = len(value)

for i in range(length):
    points = value[i]['points']

    new_points = np.array(points, dtype=np.int)
    # print(type(new_points))
    # print(new_points)

    img = cv2.imread('./1.jpg')

    cv2.fillPoly(img, [new_points], (2, 255, 255))
    cv2.namedWindow("draw_0", 2)
    cv2.imshow("draw_0", img)  # 显示画过矩形框的图片
    cv2.waitKey(0)
    cv2.destroyWindow("draw_0")

    break

5.[详细教程]新版labelme标注后的json文件,提取不同的标签后批量注入到新的背景中作为人工数据集

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/801195.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-07
下一篇2022-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存