Blender ウォッチング
1枚の画像から深度情報を生成してくれるAIを「Blender」と連携させてみた
「Marigold Depth Estimation」で写真を3Dモデル化!
2024年1月18日 06:55
本連載では、無料の高機能3Dモデリングツール「Blender」の使い方や関連情報を幅広くお伝えします。
先日、クリスマスで盛り上がる世間を横目に私がこの世の不公平について呪っていたところ、編集氏から『こういうのがあるよ』と、いくつかの情報を紹介していただきました。
その一つが、田中義弘氏がX(旧Twitter)にポストした、機械学習により作成された画像から奥行を推定し、「Blender」に渡して3D形状を生成する、という物でした。
この投稿は「機械学習による画像から3Dモデル生成」というワークフローが主のように感じましたが、筆者は途中の機械学習による深度情報の生成の方に興味を持ちました。せっかくなので、これと「Blender」を組み合わせて色々してみたいと思います。
「Blender」関連の注目記事一覧
「Marigold Depth Estimation」とは
「Marigold Depth Estimation」は機械学習で画像から「深度を推定」(Depth Estimation)し、深度情報を生成する技術です。後述のリンク先のWebサイトにて画像をWebブラウザーからアップロードすると、生成された深度情報のファイルや3Dモデルがダウンロードできます。
深度情報とは文字通り、通常の平面画像の各画素に対する奥行きの情報です。実写では「LiDAR」や「ARCore」などの技術と深度センサーを持ったカメラやスマートフォンが必要になりますが、これらの機器がなくても深度情報が擬似的に得られるのです。
深度を計算してみる
では早速使用してみます。上記のリンク先にアクセスすると、下図のようなページが表示されます。
左側の枠内に画像をドラッグ&ドロップするか、クリックして深度情報を得たい画像を選択してアップロードします。同枠内の下のアイコンで、Webカムの映像やクリップボード内の画像を画像ソースにすることもできるようですが、筆者の環境ではうまくいきませんでした。
画像のアップロード後、下の[Compute Depth]をクリックすると、深度情報が作成されます。
右上に深度を視覚化した画像、右下に各フォーマットの深度情報へのリンクが表示されます。これをクリックすればダウンロードできます。
フォーマットにより3つのファイルのリンクがありますが、後で「Blender」で扱うなら「画像ファイル名_16bit.png」がデフォルトで利用できるのでお手軽です。
もし手持ちの画像がなければ、下にあるサンプル(Examples)の画像をクリックすれば生成を試すことができます。
立体化してみる
さらに「Blender」なしで直接立体化することもできます(あとでちゃんと「Blender」の出番がありますのでご安心ください)。
同じページの下の方にある、[3D Printing Depth Maps]セクションの[Create 3D]ボタンをクリックすれば、3Dモデルの生成とプレビュー表示が行われ、画像同様に「glbファイル」と「Stlファイル」のリンクが表示されます。
「Blender」での利用時、読み込み後の方向やシェーディング方法が少し違うだけで、データ自体は同じでフォーマットの変換も可能ですので、どちらでもかまいません。
デフォルトでは長辺の解像度が512なのですが、[3d printing demo: Advanced options]をクリックして展開し、[Size (px) of the longest side]を上げると解像度が上がる一方、データサイズと処理時間も増えます。
これらの設定は一度[Clear 3D]をクリックして以前のモデルを破棄し、[Create 3D]をクリックすると反映されます。
「Blender」に取り込んで画像を貼り付けてみる
せっかくなので、「Blender」に取り込んで画像を貼り付けてみましょう。
- 上記の手順で好きな画像から深度情報を生成しておきます。
- テクスチャマッピング調整の手間を省くため、[3D Printing Depth Maps]の[3d printing demo: Advanced options]をクリックし、[Frame thickness]と[Frame's near plane offset]の両スライダーを左端まで下げて枠を消します。
- [Create 3D]をクリックし、3Dモデルを作成します。
- 「(画像名)_depth_(解像度).glb」ファイルのリンクをクリックして保存します。
- 「Blender」を起動し、デフォルトの立方体を削除します。
- スクリーンの一番上の[シェーディング]タブをクリックします。
- [ファイル]メニューから[インポート]-[glTF 2.0 (.glb/.glTF)]を実行し、上の手順でダウンロードした「.glb」ファイルを指定してインポートします。
- インポートしたオブジェクトをクリックします。
- 下側の[シェーダーエディター]のヘッダーにある[+ 新規]ボタンをクリックし、「マテリアル」追加します。
- 左上の[ファイルブラウザー]か「Blender」外の「エクスプローラー」などに深度情報を作成した画像ファイルを表示します。
- 下の[シェーダーエディター]へこの画像ファイルをドラッグ&ドロップすると[画像テクスチャノード]が追加されます。
- その[カラー]ソケットをドラッグし、[ベースカラー]ソケットとつなぎます。
- 下の[シェーダーエディター]の[追加]メニューから[入力]-[テクスチャ座標]ノードを追加します。
- 同様に[追加]-[ベクトル]-[マッピング]ノードを追加します。
- 下図のように[生成]と[ベクトル]ソケット間、[ベクトル]と[ベクトル]ソケット間をドラッグしてつなぎます。
最後に「マッピングノード」の[回転]-[X]を[-90°]にすれば、最初の画像のように完成です。
終わりに
画像一枚だとどうしてもレリーフにしかなりませんが、これはこれで面白いですね。色々と画像を試して遊んでしまいました。
次回は「Blender」との連携についてさらに踏み込んでみたいと思います。
それでは。