通过labelme进行标签后,我们有时候只需要json中的一部分,所以只能按需提取。
分析json文件
{
"imageData": "something too long", # 原图像数据 通过该字段可以解析出原图像数据
"shapes": [ # 每个对象的形状
{ # 第一个对象
"points": [ # 边缘是由点构成,将这些点连在一起就是对象的边缘多边形
[
165.90909090909093, # 第一个点 x 坐标
36.909090909090935 # 第一个点 y 坐标
],
……
[
240.90909090909093,
15.909090909090935
],
[
216.90909090909093, # 最后一个点 会闭合到第一个点完成封闭的多边形 x 坐标
31.909090909090935 # y 坐标
]
],
"fill_color": null,
"label": "cat_1", # 第一个对象的标签
"line_color": null
},
{ # 第二个对象
"points": [
[
280.90909090909093,
31.909090909090935
],
……
[
362.90909090909093,
20.909090909090935
],
[
339.90909090909093,
32.909090909090935
]
],
"fill_color": null,
"label": "cat_2", # 第二个对象的标签
"line_color": null
}
],
"fillColor": [
255,
0,
0,
128
],
"imagePath": "/home/wu/1.jpg", # 原始图片的路径
"lineColor": [
0,
255,
0,
128
]
}
通过json文件提取信息
# -*- coding:utf-8 -*-
#!/usr/bin/env python
import argparse
import json
import matplotlib.pyplot as plt
from labelme import utils
def main():
parser = argparse.ArgumentParser()
parser.add_argument('json_file')
args = parser.parse_args()
json_file = args.json_file
data = json.load(open(json_file)) # 加载json文件
img = utils.img_b64_to_array(data['imageData']) # 解析原图片数据
lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes']) # 解析'shapes'中的字段信息,解析出每个对象的mask与对应的label lbl存储 mask,lbl_names 存储对应的label
# lal 像素取值 0、1、2 其中0对应背景,1对应第一个对象,2对应第二个对象
# 使用该方法取出每个对象的mask mask=[] mask.append((lbl==1).astype(np.uint8)) # 解析出像素值为1的对象,对应第一个对象 mask 为0、1组成的(0为背景,1为对象)
# lbl_names ['background','cat_1','cat_2']
captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
lbl_viz = utils.draw_label(lbl, img, captions)
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(lbl_viz)
plt.show()
if __name__ == '__main__':
main()
''' 其他
data['imageData'] # 原图数据 str
data['shapes'] # 每个对像mask及label list
len(data['shapes']) # 返回对象个数 int
data['shapes'][0]['label'] # 返回第一个对象的标签 str
data['shapes'][0]['points'] # 返回第一个对象的边界点 list
data['shapes'][0]['points'][0] # 返回第一个对象的边界点第一个点 list
data['imagePath'] # 原图路径 str
data['fillColor'] # 填充颜色(边界内部) list
data['lineColor'] # 边界线颜色 list
'''