はじめに
前回は COCO 形式のアノテーションデータを作成しました。
今回は、オブジェクトのモデル情報を作成していきます。
前提条件
前提条件は以下の通りです。
- Windows11 (三次元モデルの準備にのみ使用)
- Ubuntu22 (モデル準備以降に使用)
- Python3.10.x
- CloudCompare
- open3d == 0.16.0
- こちらの記事を参考に 三次元モデルを作成していること
- シーンの作成が完了していること
- こちらの記事を参考に bop_toolkit_lib のインストールとプログラムの修正が完了していること
- マスクデータの作成が完了していること
- アノテーションデータの作成が完了していること
オブジェクト情報の作成
オブジェクト情報の作成は、bop_toolkit/scripts/calc_model_info.py を使用します。
bop_toolkit/scripts/calc_model_info.py
# Author: Tomas Hodan (hodantom@cmp.felk.cvut.cz)
# Center for Machine Perception, Czech Technical University in Prague
"""Calculates the 3D bounding box and the diameter of 3D object models."""
from bop_toolkit_lib import config
from bop_toolkit_lib import dataset_params
from bop_toolkit_lib import inout
from bop_toolkit_lib import misc
# PARAMETERS.
################################################################################
p = {
# See dataset_params.py for options.
'dataset': 'lm',
# Type of input object models.
'model_type': None,
# Folder containing the BOP datasets.
'datasets_path': "/path/to/makeNOCS/output_data/bop_data",
}
################################################################################
# Load dataset parameters.
dp_model = dataset_params.get_model_params(
p['datasets_path'], p['dataset'], p['model_type'])
models_info = {}
for obj_id in dp_model['obj_ids']:
misc.log('Processing model of object {}...'.format(obj_id))
model = inout.load_ply(dp_model['model_tpath'].format(obj_id=obj_id))
# Calculate 3D bounding box.
# ref_pt = map(float, model['pts'].min(axis=0).flatten())
# size = map(float, (model['pts'].max(axis=0) - ref_pt).flatten())
ref_pt = list(map(float, model['pts'].min(axis=0).flatten()))
size = list(map(float, (model['pts'].max(axis=0) - ref_pt).flatten()))
# Calculated diameter.
diameter = misc.calc_pts_diameter(model['pts'])
models_info[obj_id] = {
'min_x': ref_pt[0], 'min_y': ref_pt[1], 'min_z': ref_pt[2],
'size_x': size[0], 'size_y': size[1], 'size_z': size[2],
'diameter': diameter
}
# Save the calculated info about the object models.
inout.save_json(dp_model['models_info_path'], models_info)
print(dp_model['models_info_path'])
上記を実行します。
cd maskeNOCS/bop_toolkit
python3 scripts/calc_model_info.py
すると、models_info.json が作成されます。
{
"1": {"diameter": 130.31476576756023,
"min_x": -72.36944580078125,
"min_y": -32.762535095214844,
"min_z": -5.148738861083984,
"size_x": 106.82658386230469,
"size_y": 71.57212448120117,
"size_z": 48.13855743408203}
}
作成された models_info.json を makeNOCS/output_data/bop_data/lm/models_obj に配置してください。
プログラムの説明
# Author: Tomas Hodan (hodantom@cmp.felk.cvut.cz)
# Center for Machine Perception, Czech Technical University in Prague
"""Calculates the 3D bounding box and the diameter of 3D object models."""
from bop_toolkit_lib import config
from bop_toolkit_lib import dataset_params
from bop_toolkit_lib import inout
from bop_toolkit_lib import misc
# PARAMETERS.
################################################################################
p = {
# See dataset_params.py for options.
'dataset': 'lm',
# Type of input object models.
'model_type': None,
# Folder containing the BOP datasets.
'datasets_path': "/path/to/makeNOCS/output_data/bop_data",
}
################################################################################
この辺は今までと変わりません。
# Load dataset parameters.
dp_model = dataset_params.get_model_params(
p['datasets_path'], p['dataset'], p['model_type'])
ますはモデルのデフォルトパラメータを読み込んでいきます。
models_info = {}
for obj_id in dp_model['obj_ids']:
misc.log('Processing model of object {}...'.format(obj_id))
model = inout.load_ply(dp_model['model_tpath'].format(obj_id=obj_id))
オブジェクトの ply ファイルを読み込んでいきます。
# Calculate 3D bounding box.
# ref_pt = map(float, model['pts'].min(axis=0).flatten())
# size = map(float, (model['pts'].max(axis=0) - ref_pt).flatten())
ref_pt = list(map(float, model['pts'].min(axis=0).flatten()))
size = list(map(float, (model['pts'].max(axis=0) - ref_pt).flatten()))
3D の bbox を作成していきます。
元ファイルは map 形式でしたが、Python のバージョン変更により、list 形式に変換して取り扱います。
# Calculated diameter.
diameter = misc.calc_pts_diameter(model['pts'])
直径を算出します。最大距離をもつ2点間の距離を直径とします。
models_info[obj_id] = {
'min_x': ref_pt[0], 'min_y': ref_pt[1], 'min_z': ref_pt[2],
'size_x': size[0], 'size_y': size[1], 'size_z': size[2],
'diameter': diameter
}
models_info.json に記載する内容を辞書形式にまとめていきます。
# Save the calculated info about the object models.
inout.save_json(dp_model['models_info_path'], models_info)
print(dp_model['models_info_path'])
最後に、json 形式に保存して終了します。
おわりに
今回は、オブジェクトの情報を作成しました。
ようやく折り返し地点といった進捗です。
次回は、形状認識用に ShapeNetCore を導入していきます。
コメント