Blender ウォッチング

1枚の画像から深度情報を生成してくれるAIを「Blender」と連携させてみた

「Marigold Depth Estimation」で写真を3Dモデル化!

 本連載では、無料の高機能3Dモデリングツール「Blender」の使い方や関連情報を幅広くお伝えします。

葉っぱの立体感が楽しい。花びらの奥行にあまり差がない点については次回にて

 先日、クリスマスで盛り上がる世間を横目に私がこの世の不公平について呪っていたところ、編集氏から『こういうのがあるよ』と、いくつかの情報を紹介していただきました。

 その一つが、田中義弘氏がX(旧Twitter)にポストした、機械学習により作成された画像から奥行を推定し、「Blender」に渡して3D形状を生成する、という物でした。

 この投稿は「機械学習による画像から3Dモデル生成」というワークフローが主のように感じましたが、筆者は途中の機械学習による深度情報の生成の方に興味を持ちました。せっかくなので、これと「Blender」を組み合わせて色々してみたいと思います。

「Marigold Depth Estimation」とは

 「Marigold Depth Estimation」は機械学習で画像から「深度を推定」(Depth Estimation)し、深度情報を生成する技術です。後述のリンク先のWebサイトにて画像をWebブラウザーからアップロードすると、生成された深度情報のファイルや3Dモデルがダウンロードできます。

 深度情報とは文字通り、通常の平面画像の各画素に対する奥行きの情報です。実写では「LiDAR」や「ARCore」などの技術と深度センサーを持ったカメラやスマートフォンが必要になりますが、これらの機器がなくても深度情報が擬似的に得られるのです。

Marigold Depth Estimation - a Hugging Face Space by toshas

深度を計算してみる

 では早速使用してみます。上記のリンク先にアクセスすると、下図のようなページが表示されます。

 左側の枠内に画像をドラッグ&ドロップするか、クリックして深度情報を得たい画像を選択してアップロードします。同枠内の下のアイコンで、Webカムの映像やクリップボード内の画像を画像ソースにすることもできるようですが、筆者の環境ではうまくいきませんでした。

 画像のアップロード後、下の[Compute Depth]をクリックすると、深度情報が作成されます。

「Marigold Depth Estimation」ページ。①に画像ファイルをドラッグ&ドロップ後、②の[Compute Depth]をクリック

 右上に深度を視覚化した画像、右下に各フォーマットの深度情報へのリンクが表示されます。これをクリックすればダウンロードできます。

 フォーマットにより3つのファイルのリンクがありますが、後で「Blender」で扱うなら「画像ファイル名_16bit.png」がデフォルトで利用できるのでお手軽です。

画像をアップロード・深度を計算した後のページ。右上の画像では深度を色分けした画像と白黒の深度画像をセパレーターの移動で比較できる

 もし手持ちの画像がなければ、下にあるサンプル(Examples)の画像をクリックすれば生成を試すことができます。

Examplesのお怒り猫さんを試してみた例

立体化してみる

 さらに「Blender」なしで直接立体化することもできます(あとでちゃんと「Blender」の出番がありますのでご安心ください)。

 同じページの下の方にある、[3D Printing Depth Maps]セクションの[Create 3D]ボタンをクリックすれば、3Dモデルの生成とプレビュー表示が行われ、画像同様に「glbファイル」と「Stlファイル」のリンクが表示されます。

 「Blender」での利用時、読み込み後の方向やシェーディング方法が少し違うだけで、データ自体は同じでフォーマットの変換も可能ですので、どちらでもかまいません。

[3D Printing Depth Maps]セクションの[Create 3D]ボタンで3Dモデルを作成してみた例。

 デフォルトでは長辺の解像度が512なのですが、[3d printing demo: Advanced options]をクリックして展開し、[Size (px) of the longest side]を上げると解像度が上がる一方、データサイズと処理時間も増えます。

 これらの設定は一度[Clear 3D]をクリックして以前のモデルを破棄し、[Create 3D]をクリックすると反映されます。

「3d printing demo: Advanced options」をクリックして開き、「Size (px) of the longest side」を上げれば形状が細かくなり、ファイル名も変わる(右側)

「Blender」に取り込んで画像を貼り付けてみる

 せっかくなので、「Blender」に取り込んで画像を貼り付けてみましょう。

  1. 上記の手順で好きな画像から深度情報を生成しておきます。
  2. テクスチャマッピング調整の手間を省くため、[3D Printing Depth Maps]の[3d printing demo: Advanced options]をクリックし、[Frame thickness]と[Frame's near plane offset]の両スライダーを左端まで下げて枠を消します。
  3. [Create 3D]をクリックし、3Dモデルを作成します。
  4. 「(画像名)_depth_(解像度).glb」ファイルのリンクをクリックして保存します。
深度情報生成後、「3D Printing Depth Maps」から[3d printing demo: Advanced options]-[Frame thickness]と[Frame's near plane offset]のスライダー(図左枠)を左端まで下げ、下の[Create 3D]でモデルを生成し、「(画像名)_depth_(解像度).glb」ファイルのリンク(図右枠)でダウンロード
  1. 「Blender」を起動し、デフォルトの立方体を削除します。
  2. スクリーンの一番上の[シェーディング]タブをクリックします。
  3. [ファイル]メニューから[インポート]-[glTF 2.0 (.glb/.glTF)]を実行し、上の手順でダウンロードした「.glb」ファイルを指定してインポートします。
「Blender」を起動して立方体を削除した後、一番上の[シェーディング]タブ(①)に切り替え、[ファイル]メニュー(②)-[インポート](③)-[glTF 2.0 (.glb/.glTF)](④)で、上記の「.glb」ファイルをインポート
  1. インポートしたオブジェクトをクリックします。
  2. 下側の[シェーダーエディター]のヘッダーにある[+ 新規]ボタンをクリックし、「マテリアル」追加します。
インポートしたオブジェクトをクリック(①)後、[シェーダーエディター]の[+ 新規]ボタン(②)をクリックしてマテリアルを追加
  1. 左上の[ファイルブラウザー]か「Blender」外の「エクスプローラー」などに深度情報を作成した画像ファイルを表示します。
  2. 下の[シェーダーエディター]へこの画像ファイルをドラッグ&ドロップすると[画像テクスチャノード]が追加されます。
  3. その[カラー]ソケットをドラッグし、[ベースカラー]ソケットとつなぎます。
左上の[ファイルブラウザー](①)か、「エクスプローラー」などに深度情報を作成した画像ファイルを表示し、[シェーダーエディター]へ画像ファイルをドラッグ&ドロップ(②)して[画像テクスチャノード]を追加、[カラー]ソケットをドラッグして[ベースカラー]ソケットとつなぐ(③)
  1. 下の[シェーダーエディター]の[追加]メニューから[入力]-[テクスチャ座標]ノードを追加します。
  2. 同様に[追加]-[ベクトル]-[マッピング]ノードを追加します。
  3. 下図のように[生成]と[ベクトル]ソケット間、[ベクトル]と[ベクトル]ソケット間をドラッグしてつなぎます。
下の[シェーダーエディター]の[追加]メニュー(①)から[入力]-[テクスチャ座標]ノード(②)を追加、同様に[追加]-[ベクトル]-[マッピング]ノード(③)を追加し、[生成]と[ベクトル]ソケット間(④)、[ベクトル]と[ベクトル]ソケット間(⑤)をドラッグしてつなぐ

 最後に「マッピングノード」の[回転]-[X]を[-90°]にすれば、最初の画像のように完成です。

「マッピングノード」の[回転]-[X]を[-90°]にすれば完成

終わりに

 画像一枚だとどうしてもレリーフにしかなりませんが、これはこれで面白いですね。色々と画像を試して遊んでしまいました。

 次回は「Blender」との連携についてさらに踏み込んでみたいと思います。

 それでは。