ailia SDKを試す<第10回> 深度画像を条件にStable Diffusionで画像生成

 今回は,深度画像を条件としてプロンプトから新しい画像を生成する手法を紹介します.使用するdepth_anything_controlnetは,Stable Diffusion系の基本構成(Text Encoder/U-Net/VAE Decoder)を利用した画像生成スクリプトです.このスクリプトでは,depth_anythingによって生成した深度画像を条件として与え,プロンプトで指定した内容に従って新しい画像を生成します.
 この方法では,元の入力画像に写っている対象とは全く異なるイメージを生成できます.構図を維持したまま自由に内容を置き換えられるため,レイアウトやポーズの制御が難しい従来の画像生成に比べて,大きな利点があります.
 深度画像を利用するメリットは次の通りです.
******
・構図を保持:物体の位置や大きさを保ちながら,内容だけを置き換えられる
・レイアウト制御の容易化:従来は難しかったレイアウトやポーズを安定的に指定できる
・多彩な応用:部屋の模様替え,被写体の差し替え,季節や時間帯の変化など幅広く活用可能
・直感的な生成:お絵描き感覚で試しやすく,思い通りのイメージに近づけやすい
******
 これらのメリットについて,今回は実際の検証を通じて確認していきます.

 

●実行環境
 今回使用した環境を表1に示します.

名称 内容
OS Windows11 Pro
CPU AMD Ryzen5 3600
RAM 32GB
GPU NVIDIA GeForce RTX 3060(12GB)
Python python-3.10.11-amd64
ailia-SDK Version 1.5.0.0
ailia-models v1.4.0(GitHub
cuda Cuda compilation tools, release 12.9, V12.9.86

表1 システム構成一覧

 なお,GPUメモリを12GB搭載しているため,Stable Diffusion系の大規模モデルでも安定して実行できます.

 

●環境構築して深度画像からの画像生成を試す
 環境構築の手順をリスト1に示します.基本的にはailia-modelsのリポジトリに含まれるサンプルを利用するため,特別な準備は不要です.Python環境とailia-SDK が導入されていれば,そのまま動作します.

******
> python –version
Python 3.10.11
> git clone https://github.com/axinc-ai/ailia-models.git
> cd ailia-models
> python -m venv .venv       <―― Pythonの仮想環境 作成
> .venv\Scripts\activate       <―― 仮想環境 で作業してください
> python -m pip install –upgrade pip
> pip install setuptools wheel
#  matplotlib、scikit-image、pillow に関しては依存するバージョンがあります
> pip install matplotlib==3.8    
> pip install “scikit-image<0.20” “pillow<10”
> pip install -r requirements.txt
******
リスト1 環境構築の手順

 

 初回実行時(リスト2)には,必要なモデル・ファイルが自動的にダウンロードされます.そのため,インターネットに接続された環境でスクリプトを実行してください.ダウンロード済みのモデルはローカルに保存されるため,2回目以降の実行ではネットワーク接続は不要です.
 デフォルト設定で実行した結果,depth_anything_controlnetの公式リポジトリ(README.md)に掲載されている例と同一の画像を得ることができました(図1).このことから,環境構築が正しく行われていること,さらにモデルの推論処理が正常に機能していることを初期動作確認として確認できました.
******
(.venv)  PS ailia-models\diffusion\depth_anything_controlnet> python depth_anything_controlnet.py
 INFO arg_utils.py (13) : Start!
 INFO arg_utils.py (163) : env_id: 1
 INFO arg_utils.py (166) : CPU-IntelMKL
 INFO model_utils.py (74) : Downloading onnx file… (save path: text_encoder.onnx.prototxt)
 INFO model_utils.py (80) : ======================= 100.00% ( 308KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: text_encoder.onnx)
 INFO model_utils.py (88) : ======================= 100.00% ( 480910KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: unet.onnx.prototxt)
 INFO model_utils.py (80) : ======================= 100.00% ( 1796KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: unet.onnx)
 INFO model_utils.py (88) : ======================= 100.00% ( 1780KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (74) : Downloading onnx file… (save path: vae_decoder.onnx.prototxt)
 INFO model_utils.py (80) : ======================= 100.00% ( 151KB )]
 INFO model_utils.py (82) : Downloading prototxt file… (save path: vae_decoder.onnx)
 INFO model_utils.py (88) : ======================= 100.00% ( 193419KB )]
 INFO model_utils.py (89) : ONNX file and Prototxt file are prepared!
 INFO model_utils.py (107) : Downloading weights.pb…
 INFO model_utils.py (109) : weights.pb is prepared!100.00% ( 4768749KB )]
 INFO license.py (81) : ailiaへようこそ。ailia SDKは商用ライブラリです。特定の条件下では、無償使用いただけますが、原則として有償ソフトウェアです。詳細は https://ailia.ai/license/ を参照してください。
 INFO depth_anything_controlnet.py (153) : iteration: 1
 INFO depth_anything_controlnet.py (153) : iteration: 2
 INFO depth_anything_controlnet.py (153) : iteration: 3
:
 INFO depth_anything_controlnet.py (153) : iteration: 19
 INFO depth_anything_controlnet.py (153) : iteration: 20
 INFO depth_anything_controlnet.py (188) : Result saved at output.png
 INFO depth_anything_controlnet.py (189) : Script finished successfully.
(.venv) PS D:\AiliaSDK\ailia-models\diffusion\depth_anything_controlnet>:
******
リスト2 深度画像をもとに,指定した内容で新しい画像を生成して保存

 

 


図1 深度画像から画像を生成した結果

 

●深度画像からさまざまな画像を生成
 先の実行結果を確認したところ,深度画像を条件にプロンプトで指定した内容の画像を生成できることを確認しました.生成された画像は,深度情報に含まれる物体の形や配置を保持しつつ,プロンプトで指定した要素へと置き換えられているように見えます.
 この後は応用例として,部屋の模様替え,被写体(動物)の差し替え,風景の変換といったケースを順に検証し,それぞれのケースにおいて深度情報による構図保持がどのように働いているかを確認していきます.
▲1,部屋の模様替え
 入力画像には,ailia-models/depth_estimation/fast-depthに含まれるサンプル画像を利用しました.コマンドとしては,ゴシック調の部屋のイメージが
******
python depth_anything_controlnet.py -e 3 -i 00001_deps.png –width 768 –height 512 –prompt “Gothic room” –seed 2
******
で,荒れ果てた部屋のイメージが
******
python depth_anything_controlnet.py -e 3 -i 00001_deps.png –width 768 –height 512 –prompt “Dilapidated room” –seed 2
******
です.
 ここで,サイズを指定するときの注意点ですが,画像サイズは64の倍数にします.例えば, 512×512,768×512,1024×640はOKで640×360,960×540はNGとなります.
 実行結果として,部屋の雰囲気はプロンプト通りに変更されましたが,視点は維持され,設置されている家具やその配置も保持された状態で生成されていることを確認しました(図2).


図2 部屋のイメージ画像を生成

 

▲2,被写体を変化(動物)
 次に入力には犬の画像を用い,その深度画像を条件として利用しました.プロンプトを変更することで,被写体を別の動物に置き換えることを試みました.
 うさぎの場合のコマンドは
******
python depth_anything_controlnet.py -e 3 -i .\output_dog2_n.png –width 512 –height 512 –prompt “rabbit on the grass” –seed 1
******
で,ねこの場合のコマンドは
******
python depth_anything_controlnet.py -e 3 -i .\output_dog2_n.png –width 512 –height 512 –prompt “cat on the grass” –seed 1
******
となります.
 実行結果として,動物の画像としてはやや不自然な部分も見られましたが,被写体の構図を維持したまま,犬をうさぎや猫へと置き換えることができることが確認できました(図3).


図3 動物画像の生成結果

 

▲3,被写体を変化(風景)
 入力には山中にある鳥居の画像を用い,その深度画像を元に鳥居の色や周囲の雰囲気を変化させました.
 山の神社の赤い鳥居の場合のコマンドは
******
python depth_anything_controlnet.py -e 3 -i .\torii.jpg –width 384 –height 512 –prompt “Red Torii , mountain shrine” –seed 1
******
で,雪山の神社の赤い鳥居の場合は
******
python depth_anything_controlnet.py -e 3 -i .\torii.jpg –width 384 –height 512 –prompt “Red Torii , fresh greenery mountain Shrine ” –seed 1
******
となります.実行結果として,鳥居の形状はそのままに,プロンプトで指定した鳥居の色や周囲の山の景色を季節や雰囲気に応じて変化させることができました(図4).


図4 風景画像(鳥居)の生成結果

 

●GPUの有効化を確認
 最後に,デフォルト設定でGPU実行環境を切り替えた際の動作確認を行います.処理時間の比較結果を表2に示します.

オプション 実行環境 処理時間[s]
–env_id=0 CPU 実行 76
–env_id=1 CPU-IntelMKL 84
–env_id=2 VulkanDNN – NVIDIA GeForce RTX 3060 (FP32) 22
–env_id=3 VulkanDNN – NVIDIA GeForce RTX 3060 (FP16) 19

表2 実行環境による処理時間の変化

 

 RTX 3060(FP32)およびRTX 3060(FP16)のいずれにおいても問題無く動作し,CPU実行と比較して処理時間が約1/4に短縮される高速化を確認できました.出力結果の内容もCPU実行と同等であり,depth_anything_controlnetにおいてGPUが有効に機能していることを確認できました.

 

●まとめ
 今回は,depth_anything_controlnetを用いて深度画像を入力条件とした画像生成を試しました.検証では次のケース
******
・部屋の模様替え
・動物の置き換え
・風景の変化
******
を取り上げ,深度画像によって物体の形や配置を保持したままプロンプトで指定した要素に置き換えられることを確認しました.
 Stable Diffusion系の画像生成には,レイアウトやポーズの制御が難しいという課題があります.しかし,本手法を利用することで,構図を安定的に保ちながら生成を行えるため,より思い通りの結果に近づけやすくなります.また,実行環境をCPUからGPU(NVIDIA GeForce RTX 3060)へ切り替えた場合,処理時間が約1/4に短縮される高速化も確認できました.出力結果の品質は変わらず,GPUを利用することで効率的に画像生成を行えることも分かりました.
 さらに応用すれば,季節や時間帯の変更,キャラクタのポーズや衣装の差し替えなど,多彩な生成表現を実現できます.ぜひ手元の画像で試し,独自の活用方法を探ってみてください.

 

氏森 充(うじもり・たかし)
約30年間,(株)構造計画研究所にてIoT,ビッグデータ,機械学習,AI関連のシステム開発や実務応用に従事.退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し,雑誌「Interface」でもLLM技術に関する記事を執筆中.