物体の三次元姿勢推定 CenterSnap -オブジェクト情報の作成- 【Python】

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

はじめに

前回は COCO 形式のアノテーションデータを作成しました。

今回は、オブジェクトのモデル情報を作成していきます。

前提条件

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

オブジェクト情報の作成

オブジェクト情報の作成は、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 を導入していきます。

コメント

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