无论是做医学图像分割的小伙伴,还是做其他语义分割的小伙伴,一定都和我一样遇到过这个问题——用labelme制作了标签之后,我们的标签如何转化为图片呢?
其实,我们可以通过如下命令进行转化:
labelme_json_to_dataset -o files files\label.json
但是,这样每次只能转一张图片,并不是很方便。接下来,就教大家如何批量地将json转换为png。
现在,让我们来看一下数据。在目标文件夹中,每一个json文件都有一个与之对应的图片文件(如图1所示)。
图1 数据文件
最后我会附上完整代码,这里就告诉大家需要修改哪些地方,方便大家直接进行操作。
我使用的是3.16.7版本的labelme。
首先,是main函数。
num = 0
Yuan_path = "D:\Quanxigenge"
Jsontopng(Yuan_path, num)
这里,大家需要修改num和Yuan_path。
因为我最后的图像和标签需要按照“1,2,3,... "的顺序进行命名,num 是我设定的第一张图片的名称。如果大家要对多个文件夹的图片进行转化,记得每执行代码之前按需修改num的值!!!
Yuan_path是目标文件夹的路径。
其次,是Jsontopng函数。
这里,我是将标签转换为png文件,放入PNGLabel文件夹;原图转换为jpg文件,放入JPEGpic文件夹。(如果有想改成其他格式的小伙伴,在保存的时候改成其他格式就好)
jpgs_path = "D:\Quanxigenge\JPEGpic"
pngs_path = "D:\Quanxigenge\PNGLabel"
这里的jpgs_path和pngs_path需要改成对应的路径!!!
classes = ["_background_", "ACL", "femur", "femur_cartilage", "fibula", "LCL", "patella", "patella_cartilage", "patellar_ligament", "PCL", "tibia", "tibia_cartilage", "quadriceps_tendon", "meniscus"]
这里的classes需要按照自己的标签命名进行修改,第一个必须是"_background_"哦~
然后,在json文件转图片时,是不是有小伙伴也发现了,为什么明明是同一个标签,为什么转换之后两张图片同一个标签却显示的是不同的颜色呢?
接下来,我们就来解决这个问题。解决方案:指定label_name_to_value。
label_name_to_value = {'_background_': 0, 'ACL': 1, 'femur': 2, 'femur_cartilage': 3, 'fibula': 4, 'LCL': 5, 'patella': 6, 'patella_cartilage': 7, 'patellar_ligament': 8, 'PCL': 9, 'tibia': 10, 'tibia_cartilage': 11, 'quadriceps_tendon': 12, 'meniscus': 13}
for shape in data['shapes']:
label_name = shape['label']
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
label_values, label_names = [], []
for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
label_values.append(lv)
label_names.append(ln)
assert label_values == list(range(len(label_values)))
lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
这里需要大家按照自己的标签修改label_name_to_value。
最后的结果如图2所示。
图2 结果
最后附上完整代码,希望大家科研愉快鸭~
# -*- coding: utf-8 -*-
import base64
import json
import os
import os.path as osp
import numpy as np
import PIL.Image
from labelme import utils
def Jsontopng(Yuan_path, num):
jpgs_path = "D:\Quanxigenge\JPEGpic"
pngs_path = "D:\Quanxigenge\PNGLabel"
classes = ["_background_", "ACL", "femur", "femur_cartilage", "fibula", "LCL", "patella", "patella_cartilage",
"patellar_ligament", "PCL", "tibia", "tibia_cartilage", "quadriceps_tendon", "meniscus"]
count = os.listdir(Yuan_path)
print(count)
for i in range(0, len(count)):
path = os.path.join(Yuan_path, count[i])
print(path)
if os.path.isfile(path) and path.endswith('json'):
data = json.load(open(path))
if data['imageData']:
imageData = data['imageData']
else:
imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
with open(imagePath, 'rb') as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode('utf-8')
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {'_background_': 0, 'ACL': 1, 'femur': 2, 'femur_cartilage': 3, 'fibula': 4, 'LCL': 5,
'patella': 6, 'patella_cartilage': 7, 'patellar_ligament': 8, 'PCL': 9, 'tibia': 10,
'tibia_cartilage': 11, 'quadriceps_tendon': 12, 'meniscus': 13}
for shape in data['shapes']:
label_name = shape['label']
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
label_values, label_names = [], []
for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
label_values.append(lv)
label_names.append(ln)
assert label_values == list(range(len(label_values)))
lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
PIL.Image.fromarray(img).save(osp.join(jpgs_path, str(num) + '.jpg'))
new = np.zeros([np.shape(img)[0], np.shape(img)[1]])
for name in label_names:
index_json = label_names.index(name)
index_all = classes.index(name)
new = new + index_all * (np.array(lbl) == index_json)
utils.lblsave(osp.join(pngs_path, str(num) + '.png'), new)
print('Saved ' + count[i].split(".")[0] + '.jpg and ' + count[i].split(".")[0] + '.png')
num = num + 1
if __name__ == '__main__':
num = 0
Yuan_path = "D:\Quanxigenge"
Jsontopng(Yuan_path, num)