はじめに
前回はオートエンコーダー学習用の中間ファイルの作成方法について説明しました。
今回は、中間ファイルを作成するためのプログラムの create_nocs_results.py について説明していきます。
前提条件
前提条件は以下の通りです。
- Windows11 (三次元モデルの準備にのみ使用)
- Ubuntu22 (モデル準備以降に使用)
- Python3.10.x
- CloudCompare
- open3d == 0.16.0
- こちらの記事を参考に 三次元モデルを作成していること
- シーンの作成が完了していること
- こちらの記事を参考に bop_toolkit_lib のインストールとプログラムの修正が完了していること
- マスクデータの作成が完了していること
- アノテーションデータの作成が完了していること
- オブジェクトのモデル情報の作成が完了していること
- ShapeNetCore の HDF5 ファイルの作成が完了していること
- object-deformnet 用の中間ファイル作成が完了していること
プログラム再掲
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 のプログラムについて説明していきます。
その後、オートエンコーダーの学習に移ります。
コメント