今日、複雑な問題に遭遇しました。Huaweiのセマンティックセグメンテーションストリートビューデータセットはjsonファイルであり、生成されたラベル画像ではありません。最初はどうしたらいいかわからなかったので、cityscapesデータセットのmasterツールであるcityscapesScriptsで作りたかったのですが、長い間結果が出ませんでした。
だから、車輪なしで自分で作りたいです。。。。。。ええと、ええと、不快
下の画像をさらに面倒なことなく見ると、実際にはjsonファイルが辞書であることがわかります。カスタマイズで最も重要なのは、外接する閉じたポリゴンの頂点座標を含む赤いボックス内のものです。各オブジェクトの。理解できない場合この文を数回読んでください。私たちの目標は、これらの囲まれた領域が対応するターゲット値で満たされるように画像を生成することです
実際、ここでの各オブジェクトの各頂点座標は接続されてアウトラインを形成し、問題はアウトライン内の色付けの問題に変換されます。したがって、これは簡単です。opencvのfillPoly関数を使用することで簡単に実現できます。cv2.fillPolyにBaiduを使用する方法については、ここでは説明しません。
最初に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)
レンダリングは次のとおりです。