物体の三次元姿勢推定 CenterSnap -create_nocs_results.pyの説明- 【Python】

AI
スポンサーリンク
スポンサーリンク

はじめに

前回はオートエンコーダー学習用の中間ファイルの作成方法について説明しました。

今回は、中間ファイルを作成するためのプログラムの create_nocs_results.py について説明していきます。

前提条件

前提条件は以下の通りです。

プログラム再掲

cretae_nocs_results.py


import json
import numpy as np
import _pickle as cPickle
import os

filepath = "./scene_gt.json"
coco_path = "./scene_gt_coco.json"
gt_info_path = "./scene_gt_info.json"

with open(filepath, "r") as f:
    data = json.load(f)
with open(coco_path, "r") as f:
    coco_data = json.load(f)
with open(gt_info_path, "r") as f:
    info_data = json.load(f)

os.makedirs("gts", exist_ok=True)
os.makedirs("meta", exist_ok=True)

coco_anno = coco_data["annotations"]
RT_dict = {}
k = 0

for index in data:
    RT_temp = np.empty((4,4))
    i = 0
    j = 0
    class_ids_list = []
    bbox_list = []
    for d in data[str(index)]:
        
        bbox_info = info_data[str(index)][i]
        if bbox_info["visib_fract"] != 0:
        
            R_ = d["cam_R_m2c"]
            T_ = d["cam_t_m2c"]
            R = np.resize(np.array(R_), (3, 3))
            T = np.array(T_) / 1000.0
            RT = np.concatenate((R, T[:, None]), axis=1)
            RT = np.append(RT, [[0.0, 0.0, 0.0, 1.0]], axis=0)
            RT_temp = np.append(RT_temp, RT, axis=0)

            class_id = d["obj_id"]
            class_ids_list.append(class_id)
            
            bbox_list.append(coco_anno[j]["bbox"])

            j += 1
        
        i += 1
        
    gt_class_ids = np.array(class_ids_list, dtype="int64")
    gt_bboxes = np.array(bbox_list)
    
    RT_dict["image_id"] = int(index)
    RT_dict["gt_class_ids"] = gt_class_ids
    RT_dict["gt_handle_visibility"] = np.ones_like(gt_class_ids)
    RT_dict["gt_bboxes"] = gt_bboxes
    RT_dict["gt_RTs"] = RT_temp.reshape(j+1, 4, 4)

    save_path = "./gts/results_{:06}_{:04}.pkl".format(0, int(index))
    with open(save_path, 'wb') as f:
        cPickle.dump(RT_dict, f)

    save_path = "./meta/{:04}_meta.txt".format(int(index))
    with open(save_path, 'w') as f:
        for n in range(j):
            f.write(str(n)+" "+str(class_ids_list[n])+" "+"{:04}".format(class_ids_list[n]))
            f.write("\n")

実行方法は、以下となります。

cd makeNOCS/output_data/bop_data/lm/CAMERA/train/000000
python3  create_nocs_results.py

プログラムを上から順に説明していきます。

import json
import numpy as np
import _pickle as cPickle
import os

filepath = "./scene_gt.json"
coco_path = "./scene_gt_coco.json"
gt_info_path = "./scene_gt_info.json"

with open(filepath, "r") as f:
    data = json.load(f)
with open(coco_path, "r") as f:
    coco_data = json.load(f)
with open(gt_info_path, "r") as f:
    info_data = json.load(f)

bop_toolkit で作成した各種アノテーションデータを読込ます。

os.makedirs("gts", exist_ok=True)
os.makedirs("meta", exist_ok=True)

coco_anno = coco_data["annotations"]
RT_dict = {}
k = 0

出力するフォルダを作成し、COCO形式のアノテーションデータを変数に格納します。

for index in data:

scene_gt.json のデータをループしていきます。これは画像の枚数分繰り返します。

RT_temp = np.empty((4,4))
i = 0
j = 0
class_ids_list = []
bbox_list = []

変数を初期化していきます。scene_gt_info.json のインデックスが i, scene_gt_coco.json のインデックスが j となります。

RT_temp はカメラ行列なので 4×4 の空配列を作成しておきます。

for d in data[str(index)]:

各画像のインスタンス毎にループを回していきます。

bbox_info = info_data[str(index)][i]
if bbox_info["visib_fract"] != 0:

scene_gt_info.json から、該当する画像の bbox 情報を取得します。

R_ = d["cam_R_m2c"]
T_ = d["cam_t_m2c"]
R = np.resize(np.array(R_), (3, 3))
T = np.array(T_) / 1000.0
RT = np.concatenate((R, T[:, None]), axis=1)
RT = np.append(RT, [[0.0, 0.0, 0.0, 1.0]], axis=0)
RT_temp = np.append(RT_temp, RT, axis=0)

class_id = d["obj_id"]
class_ids_list.append(class_id)
            
bbox_list.append(coco_anno[j]["bbox"])

カメラパラメータを作成していきます。
カメラ行列は 4×4 となります。

さらに、class_ids_list に カテゴリ番号を、bbox_list に COCO 形式の bbox 情報を格納していきます。

gt_class_ids = np.array(class_ids_list, dtype="int64")
gt_bboxes = np.array(bbox_list)

リスト形式で作成した変数を np.array 形式に変換します。

RT_dict["image_id"] = int(index)
RT_dict["gt_class_ids"] = gt_class_ids
RT_dict["gt_handle_visibility"] = np.ones_like(gt_class_ids)
RT_dict["gt_bboxes"] = gt_bboxes
RT_dict["gt_RTs"] = RT_temp.reshape(j+1, 4, 4)

今までの情報を保存が簡単な辞書形式で保存します。

save_path = "./gts/results_{:06}_{:04}.pkl".format(0, int(index))
with open(save_path, 'wb') as f:
    cPickle.dump(RT_dict, f)

save_path = "./meta/{:04}_meta.txt".format(int(index))
with open(save_path, 'w') as f:
    for n in range(j):
        f.write(str(n)+" "+str(class_ids_list[n])+" "+"{:04}".format(class_ids_list[n]))
        f.write("\n")

gts, meta フォルダに対応する情報を保存します。

おわりに

今回は create_nocs_results.py について説明しました。

次回は、pose_data_custom.py のプログラムについて説明していきます。

その後、オートエンコーダーの学習に移ります。

コメント

タイトルとURLをコピーしました