投稿

UnityのPerception Packageを使ったオブジェクト位置姿勢推定用学習データの作成(1/6)

イメージ
この記事では、部屋の中にあるオブジェクトの位置姿勢を推定するための学習データを、Unityを使って生成する環境の構築を目指します。学習データを生成するために、Domain Randomizationの機能があるperception packageをベースに開発していきます。perception packageは、コンピュータビジョンのための大規模な合成データセットを生成するツールキットであり、インスタンスセグメンテーションやオブジェクト検出などのタスクに対応しています。また、Domain Randomizationという手法を用いて、シーン内のオブジェクトや光源やカメラなどのパラメータをランダムに変化させることで、合成データの多様性や汎化性能を向上させることができます。 さらに、オブジェクト指向設計を学ぶために、利用するperception packageの機能がどのように設計・実装されているかも、利用する機能から順に解析していきたいと思います。 ## 目標設定 今回のプロジェクトの目標は、部屋にあるオブジェクトの位置姿勢を推定するための学習データ生成、になります。 想定する学習モデルとしては、家の中で撮影した画像から何がどの位置姿勢にあるかを出力するモデルを想定しています。そのため、学習データとしては下記データを作成する予定です。 - インスタンスセグメンテーション用ラベル:画像内の各ピクセルに対してオブジェクトIDやカテゴリIDを割り当てた画像 - 各オブジェクトのバウンディングボックス:画像内でオブジェクトが占める領域を表す四角形 - 各オブジェクトの位置姿勢:3次元空間内でオブジェクトが持つ座標と回転角度 ## データ生成の流れ データ生成の流れは以下を想定しています。 1. ベースの部屋を初期状態に設定 1. 部屋の中にオブジェクトをランダムに配置 1. 光源をランダムに設定 1. カメラでランダムな位置姿勢で複数撮影 1. 一定数上記を繰り返す ランダム化する要素としては下記を想定しています。 - オブジェクトの位置姿勢やスケール - オブジェクトの種類や数 - オブジェクトの色やテクスチャや形状 - 光源の位置や色や強度 - カメラの位置や回転や視野角 ## 勉強会の実施ステップ 以下の順番で記事を作成して環境...

デザインパターンのまとめ記事

# オブジェクト指向とデザインパターン この記事では、Unityのパッケージを解析していく前に、プログラムの設計に使われるデザインパターンについて網羅的に記載したいと思います。 また、パッケージを解析しながら使われているパターンについて説明を随時追加していきたいと思います。 ## オブジェクト指向とは何か? オブジェクト指向とは、プログラムを「オブジェクト」というフィールドとメソッドの一体化した単位に分割して設計する方法です。オブジェクト指向は、現実世界に存在する対象や事象をプログラムで表現しやすくするための仕組みです。 例えば、人間をオブジェクトとして表すとすると、以下のようになります。 |フィールド|データ| |---|---| |name|人間の名前| |age|人間の年齢| |メソッド|コード| |---|---| |talk|人間が話す操作| |walk|人間が歩く操作| このように、オブジェクトは自分自身のフィールドとメソッドを持ちます。オブジェクトはメッセージという形で他のオブジェクトに要求や応答を送受信することができます。これにより、オブジェクト間の通信や協調が容易になります。 オブジェクト指向プログラミングは、オブジェクト指向以前の手法(例えば手続き型プログラミング)と比較すると以下のような特徴があります。 |特徴|オブジェクト指向プログラミング|手続き型プログラミング| |:----|:----|:----| |プログラムの単位|オブジェクト(データとコードの一体化)|モジュール(手続きや関数)| |データの管理|カプセル化(オブジェクトが自分のデータを管理し、外部からのアクセスを制限する)|グローバル(データは共通の場所に置かれ、どのモジュールからでも参照できる)| |処理の流れ|地方分権(オブジェクト同士がメッセージをやり取りしながら処理を進める)|中央集権(メインプログラムがモジュールを呼び出して順番に処理を進める)| |再利用性|継承(オブジェクトは他のオブジェクトから機能や特徴を引き継ぐことができる)|ポリモーフィズム(モジュールは他のモジュールと同じ名前や形式であれば異なる処理を行うことができる)| |現実との対応|現実の物体や概念に対応しやすい|現実の物体や概念に対応しにくい| ## なぜオブジェクト指向が...

Unityの複雑形状干渉判定:無料のV-HACDを使ったコライダーの作り方と使い方

イメージ
# はじめに Unityを使用して3Dアプリケーションを開発する場合、干渉判定は重要な機能の一つです。干渉判定とは、オブジェクト同士の接触を検出することで、物理的な反応をシミュレートするための機能です。例えば、プレイヤーキャラクターが壁にぶつかった場合、キャラクターの動きを止めたり、衝撃を与えたりする必要があります。このような反応をシミュレートするには、オブジェクト同士の干渉を正確に判定することが不可欠です。 Unityには、干渉判定に使用するコライダーという機能があります。この記事では、Unityにおける干渉判定と、干渉判定に必要なコライダーについて解説します。 ## Unityでの干渉判定について Unityの干渉判定システムは、コライダーと呼ばれるオブジェクトを使用して、オブジェクト同士の干渉を検出します。コライダーは、オブジェクトの形状を表すメッシュを指定することができ、干渉判定はコライダー同士の接触を検出することで行われます。 # 干渉判定のためのコライダー Unityには、干渉判定に使用する様々な種類のコライダーがあります。しかし、それぞれのコライダーには特定の問題点があります。以下では、Mesh ColliderとConvex Hull Colliderについて解説します。 ## Mesh Colliderの問題点 Mesh Colliderは、3Dメッシュモデルを基にしたコライダーであり、自動的に生成されます。しかし、凸ではない形状を持つメッシュに対しては、うまく機能しないことがあります。 例えば、U字形の3Dメッシュモデルがあるとき、Mesh Colliderを使って干渉判定を行うと、U字形状の空洞に物体が侵入することができてしまいます。これは、Mesh Colliderが自動生成されたコライダーであるため、凸の形状でなければうまく干渉判定を行えないためです。 ## Convex hullの問題点 凹形状のオブジェクトに対して、Convex hull(凸包)を使用したコライダーを設定することができます。しかし、オブジェクトが複雑である場合、Convex hullは適切にコライダーを作成できないことがあります。また、Convex hullによって作成されたコライダーが、オブジェクトの形状に完全に合っていない場合もあります。 # V...

UnityのパッケージについてCSharp to PlantUmlを使ってクラス構造を出力する方法

# はじめに Unityの開発に取り組むプログラマーです。オブジェクト指向プログラミングの知識を深めるために、クラス設計についても学んでいます。今回は、UnityのPerceptionパッケージを対象に、クラス構造を解析することで、クラス設計についての理解を深めることを目的としています。 クラス設計の理解を深めるために、CSharp to PlantUmlを使用してUnityのパッケージのクラス構造を視覚化することで、クラス設計をより具体的に理解できると考えています。CSharp to PlantUmlは、C#のコードをPlantUML形式に変換することができるツールであり、PlantUMLを使用することでクラス図を簡単に作成することができます。本記事では、CSharp to PlantUmlを使用して、UnityのPerceptionパッケージのクラス構造を出力する方法を紹介します。 # Unityのパッケージの格納場所 UnityのPerceptionパッケージのように手動でパッケージをインストールした場合、パッケージはUnityプロジェクトのLibrary/PackageCacheディレクトリに格納されます。このディレクトリには、インストールされたすべてのパッケージが含まれます。 また、Unityのエディタ上でも、インストールされたパッケージの格納場所を確認することができます。Unityのエディタ上で、”Packages”に含まれるパッケージリストから確認したいパッケージを選択し、右クリックメニューから”show in explorer”を選択します。すると、パッケージの格納場所がファイルエクスプローラーで表示されます。 Perceptionパッケージの場合は、`\Library\PackageCache\com.unity.perception@1.0.0-preview.1`に格納されています。 # CSharp to PlantUmlとは CSharp to PlantUMLは、C#のクラスファイルからPlantUMLのクラス図を自動生成するツールです。PlantUMLは、テキストでクラス図を書けるツールであり、CSharp to PlantUMLを使用することで、C#のクラスファイルをテキストファイルに変換し、PlantUMLのクラ...

Perception Synthetic Data Tutorialの要約

イメージ
Unity-Technologiesのgithubで公開されているPerception Synthetic Data Tutorialについて、日本語で要約してみました。 # [Perception Synthetic Data Tutorial](https://github.com/Unity-Technologies/com.unity.perception/blob/main/com.unity.perception/Documentation~/Tutorial/TUTORIAL.md) Perceptionパッケージは、オブジェクト検出、セマンティックセグメンテーション、姿勢推定などのパーセプションベースの機械学習タスクで使用するための合成データセットを生成するためのさまざまなツールを提供しています。これらのデータセットは、シミュレートされたセンサーを使用してキャプチャされたフレームの形式で提供されます。これらのフレームはグラウンドトゥルースで注釈が付けられており、機械学習モデルのトレーニングと検証に使用する準備ができています。Perceptionパッケージには、機械学習タスクに応じて異なるグラウンドトゥルースが付属していますが、共通の9つ以上のラベラーが付属しており、合成データの生成と活用を容易にすることができます。このチュートリアルでは、UnityやC#の事前知識は必要ありません。Perceptionパッケージに含まれるサンプル、コンポーネント、アセットのみを使用して完全なデータセットを生成します。チュートリアルは、タスクの複雑さに基づいて2つの高レベルフェーズに分かれており、進行につれてより高度なツールとワークフローが紹介されます。以下にフェーズの概要を示します: Phase 1: Setup and Basic Randomizations このフェーズでは、UnityエディタとPerceptionパッケージのダウンロード、サンプルアセットのインポート、プレハブとシーンの操作、オブジェクトとプレハブにコンポーネントを追加するなど、Unityエディタの基本的な操作方法を学びます。Perceptionパッケージの基本的なコンポーネントを理解し、これらを使用して基本的なシミュレーションを作成します。コンピュータ上でシミュレーションを実行...