「T2I-Adapterは処理が重い・・・」
「Multi ControlNetは組み合わせがイマイチ・・・」
このような場合には、Uni-ControlNetがオススメです。
この記事では、Uni-ControlNetについて解説しています。
本記事の内容
- Uni-ControlNetとは?
- Uni-ControlNetのシステム要件
- Uni-ControlNetのインストール
- Uni-ControlNetの動作確認
それでは、上記に沿って解説していきます。
Uni-ControlNetとは?
Uni-ControlNetとは、新しい制御可能な拡散モデルです。
公式ページでは、次のような図で説明されています。

ポイントとしては、次の二つの制御で処理を行うということです。
- ローカル制御
- グローバル制御
画面を見た方が、わかりやすいと思います。
次の画面は、用意されているサンプル画面になります。

この画面上では、ControlNetの各制御が存在しています。
以下の7つですね。
- canny
- mlsd
- hed
- sketch
- openpose
- midas
- seg
これらのすべての制御が、ローカル制御となります。
そして、雪山の画像がUPされている「content」がグローバル制御です。
例えば、AUTOMATIC1111版web UI上でhed・sketch・midasの制御を処理するとします。
Multi ControlNetを利用すると、3つのアダプターで処理が実行されます。
それに対して、Uni-ControlNetの場合はローカル制御アダプターの利用だけで済みます。
だからこそ、処理コストはUni-ControlNetの方が少なくなります。
コストについて、次の図で表現しています。

この図を見ると、Multi ControlNetでは「Composable Control」にチェックが入っていません。
Multi ControlNetでは、同時に処理しているだけで統合されてはいないということですね。
これに対して、T2I-Adapterでは複数の制御を統合することが可能です。
「Composable Control」にチェックが入っていますね。
「Composable Control」については、次の記事内で解説しています。
「Composable Guidance with multiple adapters」という箇所において。
つまり、機能的にはT2I-AdapterとUni-ControlNetは同等です。
その点、Multi ControlNetは格下扱いになります。
ただ、Uni-ControlNetの方がコストは低く済みます。
「2」で固定ですからね。
T2I-Adapterは、制御数を増やせば増やすほどコストは増えていきます。
以上、Uni-ControlNetについて説明しました。
次は、Uni-ControlNetのシステム要件を説明します。
Uni-ControlNetのシステム要件
GitHubの公式ページでは、情報が少ないです。
ただ、以下のOSでは動くだろうと思われます。
- Linux
- Windows
開発自体は、Linuxで行われていたようです。
environment.yamlに「cudatoolkit=11.3」と記載されていることからの推測になります。
Windowsに関しては、実際に動作確認ができました。
あと、マストな要件はPyTorchです。
environment.yamlには、次のように記述されています。

正直、古過ぎです。
今は、PyTorch 2系が主流になってきています。
そのため、ここではPyTorch 2のインストールを推奨します。
もちろん、GPU版のPyTorchになります。
以上、Uni-ControlNetのシステム要件を説明しました。
次は、Uni-ControlNetのインストールを説明します。
Uni-ControlNetのインストール
Uni-ControlNetのインストールは、Python仮想環境の利用をオススメします。
Python仮想環境は、次の記事で解説しています。
検証は、次のバージョンのPythonで行います。
> python -V Python 3.10.4
まずは、GitHub上からダウンロードします。
git clone https://github.com/ShihaoZhaoZSH/Uni-ControlNet.git
公式では、condaを利用する方法が記載されています。

ただ、それでインストールできるのか怪しいです。
そもそも、PyTorchが古い問題があります。
加えて、各種ライブラリのバージョンも固定されており、なかなか厳しいのではないでしょうか?
environment.yaml
name: unicontrol channels: - pytorch - defaults dependencies: - python=3.8.5 - pip=20.3 - cudatoolkit=11.3 - pytorch=1.11.0 - torchvision=0.12.0 - numpy=1.23.1 - pip: - gradio==3.16.2 - albumentations==1.3.0 - opencv-contrib-python==4.3.0.36 - imageio==2.9.0 - imageio-ffmpeg==0.4.2 - pytorch-lightning==1.6.0 - omegaconf==2.1.1 - test-tube>=0.7.5 - streamlit==1.12.1 - einops==0.3.0 - transformers==4.19.2 - webdataset==0.2.5 - kornia==0.6 - open_clip_torch==2.0.2 - invisible-watermark>=0.1.5 - streamlit-drawable-canvas==0.8.0 - torchmetrics==0.7.0 - timm==0.6.12 - addict==2.4.0 - yapf==0.32.0 - prettytable==3.6.0 - safetensors==0.2.7 - basicsr==1.4.2 - datasets==2.10.1 - pathlib==1.0.1
そのようなこともあり、ここではpipによるインストールをオススメします。
もともと、私はpipで頑張る派です。
上記記事の内容に基づいて、environment.yamlから次のファイルを作成します。
requirements.txt
numpy gradio albumentations opencv-contrib-python imageio imageio-ffmpeg pytorch-lightning==1.6.0 omegaconf test-tube streamlit einops transformers webdataset kornia open_clip_torch invisible-watermark streamlit-drawable-canvas torchmetrics timm addict yapf prettytable safetensors basicsr datasets pathlib
PyTorchのインストールは済んでいる前提です。
pytorch-lightningだけは古いモノをインストールします。
あとは、最新でOK。
このファイルをもとに一括でインストールします。
pip install -r requirements.txt
あとは、インストールが無事に終わることを祈りましょう。
インストールできたら、モデルのダウンロードを行います。
https://drive.google.com/file/d/1lagkiWUYFYbgeMTuJLxutpTW0HFuBchd/view?usp=sharing
上記ページにアクセスして、ダウンロードボタンをクリック。

「このままダウンロード」をクリックします。
5.7Gあるので、そこそこ時間がかかります。
ダウンロードできたら、「ckpt」ディレクトリに保存します。
「ckpt」ディレクトリは自分で作成する必要があります。

以上、Uni-ControlNetのインストールを説明しました。
次は、Uni-ControlNetの動作確認を説明します。
Uni-ControlNetの動作確認
公式では、次のコマンドでデモ画面を起動できると記載されています。

Windowsの場合だと、このままだとデモ画面にアクセスできません。
「test.py」に次のようなコードがあるからです。

ブラウザでは、「http://0.0.0.0」にアクセスできません。
そのため、次のように修正します。

これでデモ画面を起動させると、コンソールに以下が表示されます。
Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`.
ブラウザで「http://127.0.0.1:7860」にアクセスします。
そうすると、次のような画面を確認できます。

「sample」フォルダの下に画像が用意されています。

それを用いて、次のようにアップロードします。
鹿とソファは用意するのが若干面倒(配置位置の調整が面倒)のため、利用します。

プロンプトは、次のように入力。
a sofa and a deer in the city
あとは、「Run」ボタンをクリックして待ちます。
処理が完了すると、次のように画像が表示されます。

以上、Uni-ControlNetの動作確認を説明しました。