华为街景语义分割数据集json文件转换为label标签

今天遇见了一个复杂的问题。华为语义分割街景数据集给的是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)

效果图如下:

   

猜你喜欢

转载自blog.csdn.net/qq_39197555/article/details/112155822