ObjectDatasetTools --->readme の翻訳

## 結論から先に話します。ObjectDatasetTools は使いにくいです。効果的な方法については、私の他のブログを参照してください。リンクは次のとおりです。効果的な方法 :
https://blog.csdn.net/weixin_41837701/article/詳細/122799717?spm=1001.2014.3001.5502

- - - - - - - 分割線 - - - - - - - -

1 はじめに

このライブラリは、RGB-D カメラでキャプチャされたオブジェクト シーケンスのマスク、境界ボックス ラベル、および 3D 再構成オブジェクト ネットワーク (.ply) を作成するための純粋な Python スクリプトです。このプロジェクトでは、6D 姿勢推定プロジェクト、マルチターゲット検出プロジェクト (高速 rcnn)、インスタンス セグメンテーション プロジェクト (マスク rcnn) など、さまざまな深層学習プロジェクト用のトレーニング データセットとテスト データセットを準備できます。RealSense カメラと MeshLab または Blender の経験がある場合、理想的には、カスタム データセットの作成は、数行のコマンドを実行するのと同じくらい簡単です。

このライブラリのコードは、aruco マーカーと ICP 登録によるオリジナル 3D モデルの取得を実現します。結果として得られる生の 3D モデルは、メッシュ処理ソフトウェアで処理してノイズを除去する必要があります。このステップの後、必要なラベル関数が自動的に生成されます。

現在、コードはフレームごとに 1 つの対象オブジェクトに対して書かれています。フレーム内に複数のアイテムを含むデータセットを作成するように変更できます。

2.インストール

このライブラリは Ubuntu16.04、Python2.7 https://hub.fastgit.org/F2Wang/ObjectDatasetTools/blob/master/doc/installation.mdでテストされましたが、Python3 と互換性がある必要があります。さまざまな Intel RealSense ドライバーと Python パッケージのインストールが含まれます。

3. カスタム データセット

(1) 準備

arucomarkers フォルダー内の適切なサイズの aruco マーカー (ID 1 ~ 13) を使用して PDF をカラー印刷します。図のように対象オブジェクトの周囲にマーカーを配置し、重複する ID を持つマーカーがないことを確認します。

(2) シーケンスターゲットシーケンスを記録する

オプション 1: RealSense カメラで録画 (SR300 を推奨)

古いモデルには Record.py を使用し、librealsense SDK 2.0 には Recordf2.py を使用します。

Python Record.py LINEMOD/OBJECTNAME

例: 次のコードを通じてシュガー ボックスを記録します。

Python Record.py LINEMOD/sugar

デフォルトでは、スクリプトは 5 のカウントダウン後に 40 秒間記録します。「q」を押すと、記録間隔を変更したり、記録を終了したりできます。次に、カメラを着実に動かして、常に 2 ~ 3 個のマーカーをカメラの視野内に保ちながら、オブジェクトのさまざまなビューを取得します。

このプロジェクトでは、すべてのシーケンスが「LINEMOD」という名前のフォルダーに保存されていることを前提としているため、他のフォルダー名を使用するとエラーが報告されることに注意してください。

Record.py を使用してシーケンスを作成すると、カラー画像、深度マップ、およびカメラのパラメーターがシーケンス ディレクトリに自動的に保存されます。

オプション 2: 既存のシーケンスを使用するか、別のカメラで録画する

別のカメラを使用する場合は、カラー画像 (.jpg) を「JPEGImages」というフォルダーに置き、その深度画像を「深度」フォルダーに置きます。注: このアルゴリズムは、深度マップをカラー マップに合わせて調整します。カラー画像に0.jpg、1.jpg、...、600.jpg、対応する深度画像に0.png、...、600.pngの順に名前を付け、「intrinsics.json」ファイルという名前のファイルを作成します。をクリックし、次の形式でカメラ パラメータを手動で入力します。

{"fx": 614.4744262695312、"fy": 614.4745483398438、"高さ": 480、"幅": 640、"ppy": 233.29214477539062、"ppx": 308.8282470703125、"ID": "6 20201000292"}

カメラの本質がわからない場合は、大まかな見積もりを入力できます。必須パラメータは fx、fy、cx、xy です。このうち、一般に fx=fy は画像の幅に等しく、cx=cy は画像の中心となります。例: 解像度が 640*480 の画像の場合、fx,fy=640、cx=320、cy=240。

(3) フレーム変形の取得

指定された間隔で最初のフレームのフレームの変換を計算し (間隔は config/registrationParameters で変更可能)、変換 (4*4 同型変換) を numpy 配列 (.npy) として保存します。

python compute_gt_poses.py LINEMOD/sugar

(4) すべてのフレームを登録し、登録したシーンのメッシュを作成します。

python register_scene.py LINEMOD/sugar

オリジナルの registeredScene.ply は、指定されたディレクトリ (例: LINEMOD/sugar) に保存されます。registerScene.ply は、ある程度のノイズ キャンセリングが施された、デスクトップ、マーカー、およびスキャン中に露出したその他のオブジェクトを含む、シーンの登録された点群です。結果のメッシュは次のようになります。これは、ステップ 5 で手動で処理する必要があります。

あるいは、register_scene の代わりに register_segmented を試して、すべての手動作業をスキップしてみることもできます。

python register_segmented.py LINEMOD/sugar

デフォルトでは、 register_segmented は不要な背景をすべて削除し、サーフェスの再構成を実行して、登録された点群を三角形メッシュに変換しようとします。MESHING が false に設定されている場合、スクリプトは背景のみを削除し、非表示の底部を平らな面で自動完成させようとします (FILLBOTTOM が true に設定されている場合)。ステップ 5 を実行する必要があります。

ただし、 register_segmented は背景をセグメント化するためにいくつかの特別なメソッドを使用するため、失敗する可能性があります。そのため、オブジェクトで機能するようにいくつかのパラメータを調整する必要がある場合があります。調整する最も重要なノブは「MAX_RADIUS」です。これは、観察された aruco マーカーの中心までのユークリッド距離が指定された値より大きい深度読み取り値をカットします。この値は現在 0.2m に設定されていますが、より大きなオブジェクトがある場合は、オブジェクトの一部が切り落とされないようにこの値を大きくする必要がある場合があります。register_segmented を実行した結果は次のようになります。

(5) 登録した点群を手動で加工する(オプション)

register_segmented の実行結果に満足している場合は、ステップ 5 をスキップできます。

登録された点群は次のように処理する必要があります。

  1. 興味のない背景を削除します。
  2. サーフェスの再構成を実行して欠落した側面を完成させたり、その逆も同様です。
  3. 再構築されたネットワークで作業します (一部を切り取って、欠けている側をやり直す必要がある場合があります)。
  4. 処理されたメッシュに孤立したノイズがないことを確認してください。

結果は、アルゴリズムで生成された登録された点群ではなく、三角形メッシュになります。

次のビデオ リンクは、点群からメッシュへの変換、点群からメッシュへの再構成 (MeshLab)、および著者が記録した簡単なチュートリアルですhttps://www.youtube.com/watch?v=38mt3kpsxd4    https://www.youtube. com/watch?v=lHKOJ1dbyJI    https://www.youtube.com/watch?v=BPX-j9xE2EQ

メッシュを生成する目的がマスクを取得すること、またはそれをシングルショット ポーズ認識などのプロジェクトに使用することである場合、正確なメッシュ ジオメトリのみが必要であり、外観は必要ありません。したがって、平らな領域では、ビデオに示されている「閉じた穴」が許容されます。さらに、対称オブジェクトの場合は、対称を通じて手動で行われます。欠落した面の正確なテクスチャ情報が必要な場合は、欠落した面の別のシーケンスを取得し、手動で点群に位置合わせする必要があります。

(6) 画像マスクとラベルファイルの生成

カスタム オブジェクトの手順 1 ~ 4 を完了したら、次のコードを実行します。

python create_label_files.py すべて

また

python create_label_files.py LINEMOD/sugar

このステップでは、原点を中心とし、OBB と同じ寸法の AABB を持つ、foldername.ply (例: Sugar.ply) という名前の新しいメッシュを作成します。同時に、イメージ マスク (マスク ファイルに保存)、新しいグリッドの 4*4 同次変換 (transforms に保存)、ラベル ファイルがラベル ファイルに保存され、ラベルは2D 画像内の 3D バウンディング ボックス。マスク ファイルは、mask-rcnn などの深層学習プロジェクトのトレーニングとテストに使用できます。

以下を実行して、作成された 3D バウンディング ボックスとマスクが正確であることを視覚的に確認します。

Python InspectionMasks.py LINEMOD/sugar

(オプション) シングルショットポーズの作成に必要な追加ファイル

シングルショットポーズ用のメッシュ ファイルを作成する場合は、これらの新しいメッシュ ファイルを MeshLab で開き、バイナリ形式オプションのチェックを外して再度保存する必要があります。これらのメッシュは、singleshotpose によって評価と姿勢推定の目的で使用されますが、singleshotpose はバイナリ エンコードされたメッシュを読み取ることができません。

手順 6 で作成したマスクとラベルは、シングルショットポーズと互換性があります。現在、クラス ラベルはハッキングな方法 (すべてのシーケンス フォルダー内のフォルダーの順序など) で割り当てられていますが、フォルダーごとに create_label を呼び出すと、同じラベルが割り当てられるため、印刷出力を読み、create_label_files.py でクラス ラベルを手動で変更します。

さらに、次のコードを使用してトレーニング イメージとテスト イメージを作成する必要があります。

python makeTrainTestfiles.py

他の必要なパス ファイルを作成します。

カスタム ターゲットごとに、cfg フォルダーに objectname.data ファイルを作成します。

オブジェクトのスケール (固定小数点の最大距離) を取得するには、次のコードを実行します。

Python getmeshscale.py

上記は、singleshotpose のカスタム データ セットを作成するために必要なすべての手順ですが、singleshotpose のカメラ キャリブレーション パラメータを更新する必要があることに注意してください。

(オプション) オブジェクト検出プロジェクトの境界ボックス ラベルを作成する

ステップ 6 (つまり、イメージ マスクの生成) を完了した後、次のコードを実行します。

Python get_BBs.py

このコードは、LINEMOD フォルダーの下にあるすべての画像のクラス ラベルと境界ボックス情報を含む annotations.csv を作成できます。

おすすめ

転載: blog.csdn.net/weixin_41837701/article/details/122747086
おすすめ