正文
利用os模块中的os.system()方法,多次调用CMD,利用labelme中的labelme_json_to_dataset方法实现,将使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果。
法一
分两步:(生成的中间文件会保存到新的目录中)
- 先批量json格式文件生成中间文件,多次调用labelme_json_to_dataset,在新目录下为每个json生成一个目录文件(包含4个文件)
- 将文件批量转化成标准格式(即,所有原图像一个文件夹,所有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)
法二
分两步进行:(生成的中间文件会保留在原始目录下)
- 批量json格式标签为png格式
- 将文件批量转移成标准格式
批量生成,批量生成我们需要在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官方代码中也给出多种方法:https://github.com/wkentaro/labelme#usage
个人可以参考来写。
参考博客
版权声明:本文为m0_61899108原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。