今天遇见了一个复杂的问题。华为语义分割街景数据集给的是json文件,并非已经生成的label图片。刚开始不知道怎么搞,想通过cityscapes数据集的cityscapesScripts-master工具制作,但是捣鼓半天未果。
于是想没有轮子自己造呗。。。。。。呃呃呃,难受
不扯别的看下图,你会发现其实,json文件里面是一个字典,自定里面最重要的就是红框里面的的东西,包含了每一个物体的外接封闭多边形的顶点坐标,如果不理解这句话多读几遍。我们的目标就是生成一幅图像,让这些封闭区域内都填充相应的目标值
其实这里的每一个物体的每一个顶点坐标连接起来就是一个轮廓,那么问题就转化成了在轮廓内着色问题。so这就简单了利用opencv的fillPoly函数能轻松实现,cv2 .fillPoly怎么用自己百度,不在此讲。
我们首先需要解析json文件,然后解析每种物体对应应该填充的值。再生成一个相应的0数组,最后在0数组的相应轮廓内填充相应的值即可。代码如下:
import numpy as np
import matplotlib.pyplot as plt
import cv2
import json
import glob
_json = glob.glob('./gtFine/*/*/*.json') # 所有json文件
# 不同类别的物体对应的值
name_dict = {'flat': 0,
'human': 1,
'vehicle': 2,
'construction': 3,
'object': 4,
'nature': 5,
'sky': 6}
for j in _json:
with open(j, 'r') as f:
r = f.read()
r = json.loads(r)
obj = r['objects']
# 0数组 ,这里的3通道是我按照cityscapes的方式保存的
# 其实三个通道两两相等
img = np.zeros((1024,2048,3))
# 填充
for i in obj:
name = i['label']
po = i['polygon']
n = name_dict[name]
cv2 .fillPoly(img,pts = [np.array(po)],color =(n,n,n))
# 保存
cv2.imwrite(j[:-4]+'png', img)
效果图如下: