使用labelme标注的json标签mask可视化

正文

利用os模块中的os.system()方法,多次调用CMD,利用labelme中的labelme_json_to_dataset方法实现,将使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果。

法一

分两步:(生成的中间文件会保存到新的目录中)

  1. 先批量json格式文件生成中间文件,多次调用labelme_json_to_dataset,在新目录下为每个json生成一个目录文件(包含4个文件)
  2. 将文件批量转化成标准格式(即,所有原图像一个文件夹,所有label一个文件夹,所有可视化图像一个文件夹)
# -*- coding: utf-8 -*-

# 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 = r"F:\python_Demo\DeepLearning\tools3\data01\volleyball"
    #  保存中间生成文件的文件夹, 每个子目录下有4个文件:img.png,label.png,label_names.txt,label_viz.png
    root_folder = r"F:\python_Demo\DeepLearning\tools3\data01\voll"
    # 保存最终生成文件的文件夹,原图像、label、label_viz
    Paste_PNG_folder = r"F:\python_Demo\DeepLearning\tools3\data01\img1"
    Paste_label_folder = r"F:\python_Demo\DeepLearning\tools3\data01\label1"
    Paste_label_viz_folder = r"F:\python_Demo\DeepLearning\tools3\data01\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)

法二

分两步进行:(生成的中间文件会保留在原始目录下)

  1. 批量json格式标签为png格式
  2. 将文件批量转移成标准格式

批量生成,批量生成我们需要在python里调用cmd,os模块调用CMD命令有两种方式:os.popen(),os.system() 都是用当前进程来调用。os.system是无法获取返回值的,当运行结束后接着往下面执行程序。

import os

json_folder = r"D:\RSimage"
#  获取文件夹内的文件名
FileNameList = os.listdir(json_folder)
#  激活labelme环境
os.system("activate labelme")
for i in range(len(FileNameList)):
    #  判断当前文件是否为json文件
    if(os.path.splitext(FileNameList[i])[1] == ".json"):
        json_file = json_folder + "\\" + FileNameList[i]
        #  将该json文件转为png
        os.system("labelme_json_to_dataset " + json_file)

将文件批量转移成标准格式

import os
import shutil

JPG_folder = r"F:\python_Demo\DeepLearning\tools3\data01\volleyball"
Paste_JPG_folder = r"F:\python_Demo\DeepLearning\tools3\data01\img2"
Paste_label_folder = r"F:\python_Demo\DeepLearning\tools3\data01\label2"
Paste_label_viz_folder = r"F:\python_Demo\DeepLearning\tools3\data01\label_viz"

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

#  获取文件夹内的文件名
FileNameList = os.listdir(JPG_folder)
NewFileName = 1
for i in range(len(FileNameList)):
    #  判断当前文件是否为json文件
    if(os.path.splitext(FileNameList[i])[1] == ".jpg"):

        #  复制jpg文件
        JPG_file = JPG_folder + "\\" + FileNameList[i]
        new_JPG_file = Paste_JPG_folder + "\\" + str(NewFileName) + ".jpg"
        shutil.copyfile(JPG_file, new_JPG_file)

        #  复制label文件
        jpg_file_name = FileNameList[i].split(".", 1)[0]
        label_file = JPG_folder + "\\" + jpg_file_name + "_json\\label.png"
        new_label_file = Paste_label_folder + "\\" + str(NewFileName) + ".png"
        shutil.copyfile(label_file, new_label_file)

        #  复制label_viz文件
        jpg_file_name = FileNameList[i].split(".", 1)[0]
        label_viz_file = JPG_folder + "\\" + jpg_file_name + "_json\\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

实例

源文件图像

使用labelme标注的json标签mask可视化_第1张图片

 标签图像

使用labelme标注的json标签mask可视化_第2张图片

 源文件与标签融合图像

使用labelme标注的json标签mask可视化_第3张图片

labelme官方代码中也给出多种方法:https://github.com/wkentaro/labelme#usage

个人可以参考来写。

参考博客

深度学习数据预处理_python批量转换labelme标注的json格式标签为png格式 - 知乎

你可能感兴趣的:(代码阅读系列,Python常用代码,json)