Python 如何在标有labelbox的数据集中从JSON转换为png?

Python 如何在标有labelbox的数据集中从JSON转换为png?,python,json,image-processing,Python,Json,Image Processing,我有一个JSON文件,其结构如下: json {'featureId': 'ckek0ugf2061y0ybwgunbdrt5', 'schemaId': 'ckek0jkvp081j0yaec2ap9a3w', 'title': 'Tree', 'value': 'tree', 'color': '#FFFF00', 'instanceURI': 'https://api.labelbox.com/masks/feature/ckek0ugf2061y0ybwgunbdrt5?tok

我有一个JSON文件,其结构如下:

json
{'featureId': 'ckek0ugf2061y0ybwgunbdrt5',
 'schemaId': 'ckek0jkvp081j0yaec2ap9a3w',
 'title': 'Tree',
 'value': 'tree',
 'color': '#FFFF00',
 'instanceURI': 'https://api.labelbox.com/masks/feature/ckek0ugf2061y0ybwgunbdrt5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'}
InstanceURI是我从使用Labelbox()的原始图像中分割出来的一棵树。我正在使用PSPNet城市景观。该模型需要一个png格式的验证阶段掩码。某些图像具有多个树(多个URI实例)。
如何在png图像中转换此JSON元素?

不是最快、最漂亮的脚本-但它对我很有用

从PIL导入图像、ImageColor、ImageDraw
从PIL导入未识别的DIMAGERROR
导入请求
导入json
导入argparse
导入路径库
导入操作系统路径
def手动_类():
"""
在下面更改您首选的颜色编码。
如果要使用手动着色,还需要更改标签类(标题)
"""
手动记录={
“树”:255,
“花”:85,
}
退货手册
def open_img(url):
尝试:
返回Image.open(requests.get(url,stream=True).raw)
除未识别的图像错误外:
一无所获
def open_json(路径):
打开(路径)作为文件:
返回json.load(文件)
def颜色提取程序(数据、颜色编码):
“”“获取给定的字典部分并提取所有需要的信息。还返回3种不同类型的颜色”“”
如果颜色_编码==“自动”:
color=ImageColor.getcolor(数据['color'],'RGBA')
elif颜色_编码==“手动”:
颜色=(手动类()[数据['title']],手动类()[数据['title']],手动类()[数据['title']],255)
elif color_coding=='binar':
颜色=(255255)
其他:
打印('未检测到有效的颜色代码-继续使用二进制标签')
颜色=(255255)
返回颜色
def img_颜色(img,颜色):
“”“相应地更改标签的颜色”“”
如果颜色==(255255):
返回img
img=img.convert('RGBA')
宽度、高度=img.size
对于范围内的x(宽度):
对于范围内的y(高度):
如果img.getpixel((x,y))==(255255):
图像像素((x,y),颜色)
返回img
def img_绘制多边形(大小、多边形、颜色):
“”“在图像上绘制多边形”“”
img=图像。新建('RGBA',大小,(0,0,0,0))
img=img.convert('RGBA')
draw=ImageDraw.draw(img)
#阅读要点
点数=[]
对于范围内的i(len(多边形)):
points.append((int(多边形[i]['x'])、int(多边形[i]['y']))
绘制多边形(点,填充=(颜色))
返回img
def progressBar(当前,总计,barLength=20):
百分比=浮动(当前)*100/总计
arrow='-'*int(百分比/100*barLength-1)+'>'
空格=“”*(条形长度-长度(箭头))
打印('进度:[%s%s]%d%%'(箭头、空格、百分比),结束='\r')
def main(输入目录、输出目录、颜色类型='auto'):
如果os.path.exists(input_dir)和os.path.exists(output_dir)和color_键入['auto'、'manual'、'binar']:
输入路径=路径库路径(输入路径)
label\u path\u sorted=sorted(列表(输入\u path.glob(“*.json”))
对于已排序的标签路径中的图像路径:
打印('converting:{}'。格式(os.path.basename(image_path)))
#打开json文件
数据=开放的json(图像路径)
#创建标签的图像列表
img_列表=[]
#读取原始图像
原始\u img=open\u img(数据[0][“标记数据])
尝试:
宽度、高度=原始尺寸
除例外情况外:
打印('无法调用原始图像数据。请提供图像宽度和高度')
对于范围内的i(len(数据[0]['Label']['objects']):
#读取路径并打开图像
img=open_img(数据[0]['Label']['objects'][i]['instanceURI'])
#如果路径不可读,请尝试读取多边形数据点
如果没有,img为无:
img=img\u颜色(img,颜色提取程序(数据[0]['Label']['objects'][i],颜色类型))
img_list.append(img)
其他:
尝试:
#img=img_draw_polygon(img,数据[0]['Label']['objects'][i]['polygon'],数据[0]['Label']['objects'][i]['title'])
img=img_draw_polygon((宽度、高度),数据[0]['Label']['objects'][i]['polygon'],颜色提取程序(数据[0]['Label']['objects'][i],颜色类型))
img_list.append(img)
除例外情况外:
打印('注意:标签{}没有可用的多边形数据点和web数据信息。.格式(i))
#打印当前进度状态
progressBar(i,len(数据[0]['Label']['objects']))
img=img\u列表[0]
对于范围内的i(1,len(img_列表)):
粘贴(img_列表[i],(0,0),mask=img_列表[i])
save(output_dir+os.path.basename(image_path).replace('.json',.png'))
其他:
打印('您的一个给定输入不正确-请重试')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
parser=argparse.ArgumentParser(description=“从labelbox2png转换注释”)
parser.add_参数(“--input”,help=“input directory”)
添加参数(“--output”,help=“output directory”)
parser.add_参数(“--color”,help=“binar,auto或manual”)
args=parser.parse_args()
main(args.input、args.output、args.color)
要运行它-只需保存此
python
-脚本并在命令中执行它:

C:\Users>python script.py--input\u目录/--output\u目录--color auto

通过输入
color
,您可以修改标签的颜色编码
auto
JSON
manual
中获取颜色,您必须修改并
binar
将所有内容都标记为白色。

不是最快最漂亮的脚本-但它适合我

从PIL导入图像、ImageColor、ImageDraw
来自PIL进口的未识别图像