pix2pixによる画像生成ができるControlNetのインストール

pix2pixによる画像生成ができるControlNetのインストール 機械学習

「img2imgでは元画像が大きく崩れてしまう・・・」
「Stable Diffusionでpix2pixを実現したい」

このような場合には、ControlNetがオススメです。
この記事では、ControlNetについて解説しています。

本記事の内容

  • ControlNetとは?
  • ControlNetのシステム要件
  • ControlNetのインストール
  • ControlNetの動作確認

それでは、上記に沿って解説していきます。

ControlNetとは?

ControlNetは、pix2pixと言われています。

実際、ControlNetを使って左の画像を右の画像に変換できています。
その際、「a dog in the hell」を生成条件として付加。

ControlNetでは、画像とテキストを入力しています。
そして、その結果として画像を生成することになります。

この点では、ControlNetはimg2imgと同じと言えます。

しかし、img2imgで出力される画像とは天と地ほどの差があります。
次の画像は、両方ともimg2imgで生成した画像です。

「Denoising strength」は、それぞれ以下となります。

  • 左の画像:0.3
  • 右の画像:0.89

どちらにせよ、入力画像の構造(犬)を維持できていません。
それに、テキストの付加情報(in the hell)も全く反映されていません。

なぜこれほどまでに結果に差が出るのでしょうか?
それは、次の図にヒントがあります。

ControlNetは、拡散モデルを制御することが可能です。
上の図のように、既存の構造に変更を加えずに追加する形で制御しています。

そして、このような制御を全部で14回実行しているのです。

このようなロジックにより、入力画像の構造が維持されます。
さらに、テキストの付加情報も適切に反映されるのです。
凄すぎですね。

さきほどから構造を維持すると表現していますが、そのための手法が複数用意されています。

  • Canny Edge
  • M-LSD Lines
  • HED Boundary
  • User Scribbles
  • Fake Scribbles
  • Human Pose
  • Semantic Segmentation
  • Depth
  • Normal Map
  • Anime Line Drawing

先頭の「Canny Edge」は、エッジ検出により構造の維持を実現しています。
Canny法については、次の記事で説明しています。

入力する画像によって、手法を変更するという運用になるのでしょう。
建築物、アニメ、手書きなどによってケースバイケースということです。

追記 2023年2月16日
AUTOMATIC1111版web UIのControlNetについては、次の記事で解説しています。

以上、ControlNetについて説明しました。
次は、ControlNetのシステム要件を説明します。

ControlNetのシステム要件

lllyasviel/ControlNet: Let us control diffusion models
https://github.com/lllyasviel/ControlNet

公式ページでは、システム要件が明記されていません。
yaml・コードを見たり、実際にインストールした経験より以下をポイントに挙げておきます。

  • OS
  • Pythonバージョン
  • PyTorch
  • FFmpeg

それぞれを以下で説明します。

OS

OSについては、以下がサポート対象だと思われます。

  • Windows
  • Linux
  • macOS

基本的に、100%-pure PythonはOSを問いません。

Pythonバージョン

ControlNetの開発自体は、Python 3.8で行われています。

そして、私はPython 3.10でインストール・動作確認を実施済みです。
特に明記されていない場合は、Python公式開発サイクルに従いましょう。

バージョンリリース日サポート期限
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月
3.112022年10月25日2027年10月

個人的には、Python 3.10がオススメです。
実際に、動作確認まで実施できていますからね。

FFmpeg

依存するパッケージに以下が含まれています。

そのため、FFmpegをインストールする必要があります。
FFmpegのインストールは、以下が参考となります。

以上、ControlNetのシステム要件を説明しました。
次は、ControlNetのインストールを説明します。

ControlNetのインストール

ControlNetのインストールは、Python仮想環境の利用をオススメします。
Python仮想環境は、次の記事で解説しています。

検証は、次のバージョンのPythonで行います。

> python -V  
Python 3.10.4

そして、システム要件である以下をインストール済という状況です。

  • PyTorch(GPU版)
  • FFmpeg

このような状況において、次の手順でControlNetのインストールを進めます。

  • ControlNetの取得(GitHubから)
  • requirements.txtを使った一括インストール

それぞれを下記で説明します。

ControlNetの取得(GitHubから)

次のコマンドでGitHUbからリポジトリを取得します。

 git clone https://github.com/lllyasviel/ControlNet.git

リポジトリルートへ移動しておきます。

cd ControlNet

基本的には、ここで作業を行います。

requirements.txtを使った一括インストール

公式では、condaコマンドを用いたインストールが記載されています。

conda env create -f environment.yaml
conda activate control

condaコマンドを普段から利用する場合は、上記コマンドでのインストールを進めてください。
個人的には、pip一本で環境を構築しています。
(※pipとcondaの混在はトラブルの元だという考えです)

requirements.txtがない場合は、environment.yamlからrequirements.txtを作成します。
そのための方法は、次の記事で説明しています。

上記記事の方法より作成したrequirements.txtは、以下。
PyTorch関連は除去済みです。

requirements.txt

gradio
albumentations
opencv-contrib-python
imageio
imageio-ffmpeg
pytorch-lightning
omegaconf
test-tube
streamlit
einops
transformers
webdataset
kornia
open_clip_torch
invisible-watermark
streamlit-drawable-canvas
torchmetrics
timm
addict
yapf
prettytable

environment.yamlでは、パッケージのバージョンが指定されています。
しかし、指定しなくてもControlNetをインストール・動作させることが可能です。

バージョン指定しない方が、最新版を利用できます。
可能なら、それぞれの最新版を利用する方が正しいです。
pipは、そもそもそのためのパッケージ管理システムですから。

では、まとめてパッケージをインストールしましょう。

pip install -r requirements.txt

以上、ControlNetのインストールを説明しました。
次は、ControlNetの動作確認を説明します。

ControlNetの動作確認

ControlNetには、手法が複数用意されていると説明しました。
今回は、デフォルト扱いの「Canny Edge」を利用します。

そのためには、次の手順を作業を進めます。

  • Canny Edge用モデルのダウンロード
  • Canny EdgeによるControlNetの処理実行

Canny Edge用モデルのダウンロード

lllyasviel/ControlNet at main
https://huggingface.co/lllyasviel/ControlNet/tree/main/models

各手法のモデルは、上記ページからダウンロードします。

今回は、Canny Edge用モデルをダウンロードすることになります。
ダウンロードできたら、「models」ディレクトリに設置します。

追記 2023年2月15日
ControlNet用の各種モデルを自作することが可能です。

Canny EdgeによるControlNetの処理実行

リポジトリルート上で次のコマンドを実行します。

python gradio_canny2image.py

ここまでの処理に問題がなければ、すんなりと起動するはずです。
コンソールに次のように表示されれば、起動OKとなります。

Running on local URL:  http://0.0.0.0:7860

To create a public link, set `share=True` in `launch()`.

しかし、ブラウザで「http://0.0.0.0:7860」にアクセスするとエラーになります。

基本的には、ローカルホストを指定するために「0.0.0.0」とすることはありません。
「127.0.0.1」か「localhost」と指定します。

そして、Chromeでは「0.0.0.0」にはアクセスできません。
ということで、gradio_canny2image.pyを修正します。

何も指定しないように変更しておきます。

この状態で起動すると、コンソールには次のように表示されます。

Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

今度は、次のようにアクセスできるようになっています。

まずは、画像をアップロードします。
そして、「Prompt」を入力して「Run」ボタンをクリック。

処理が成功すると、画像が二つ表示されます。
一つは、エッジ検出された画像です。

そして、もう一つはプロンプトが反映された画像となります。
また、生成される画像枚数や設定を変更することが可能です。

変更する場合は、「Advanced options」をクリック。
そうすると、次のように設定変更が可能になります。

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

タイトルとURLをコピーしました