はじめに
前回は 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 を導入していきます。
 
  
  
  
  



コメント