【初心者向け】ControlNetでキャラクターのポーズを真似する方法。
こんにちは、画像生成AIでひたすら猫のイラストを生成している じょじお(@jojio‗illust)です。
Stable Diffusionユーザーは、思い通りのポーズを生成することがいかに難しいかを知っています。すべてがランダムです。
それを解決したのが、AIイラスト界の革命児ControlNetです。
この記事では、Controlnetの基本的な使い方について解説します。
▲AI画像の大量ファイルをプロンプトと一緒に簡単に整理する方法はこちら。
Stable Diffusionのプロンプトエンジニアリングの基本について理解したい方には、初心者向けのプロンプトガイドを作りましたのでそちらを見てください!
ControNetとは?
ControlNetはキャラクターのポーズ抽出ができるよ。
ControlNetが一番注目を浴びたのは、キャラクターのポーズの検出・適用です。
ControlNetは、画像を渡すと、その画像のキャラクターと同じポーズをした、別の画像を簡単に作ってくれます。
構図の当たりハズレは、今まで完全な運要素だったから信じられません・・・。
ControlNetを使えばガチャを引く回数も減りそうですね。
ControlNetとは?
ControlNetは、通常のText-to-imageの画像生成に、もう1つ追加の「条件」を指定して、通常のtext-to-imageよりも厳格な制御をすることができます。
条件とは画像のことです。「テキスト+画像」から画像を生成する方法には、従来のImage-to-Imageがありますが、ControlNetはもっと大きなコントロールができます。
ControlNetで検出できるものは?
ControlNetは元画像の様々な要素を分析して、その要素を生成する画像に適用できます。
先述したように一番有名なのは構図分析(キャラクターのポーズ分析)ですが、それ以外にも線画・直線・物体の距離・輪郭なども検出し、生成する画像に適用することができます。
プリプロセッサの例
ControlNetが、元画像から検出できるものの例です。中にはまだ実装前のものもあるようです。
プリプロセッサ | |
---|---|
Canny | 古くからあるアルゴリズム「キャニー法」を使った線画抽出。 control_cannyモデルを使います。 |
Depth | 画像内の物体がどのくらい離れているかを伝えるのに便利です。白は近く、暗は遠くを意味します。 control_depthモデルで使用します。 |
Depth LeRes | ? control_depthモデルと共に使用する。 |
HED | HED(Holistically-Nested Edge Detection)は、人間のように画像から輪郭線を抽出することが得意なエッジ検出AIモデルです。機能的にはCannyに似ていますが、ノイズが少なくなっています。 control_hedモデルとともに使用します。 |
M-LSD (Mobile Line Segment Detection) | M-LSD (Mobile Line Segment Detection) は、高速な直線検出器です。インテリア、建物、街並み、写真フレーム、紙の端など、直線的なエッジを持つ輪郭を抽出するのに有効です。 control_mlsd modelを使います。 |
Normal | ? control_normalモデルで使用します。 |
OpenPose | 頭の位置、肩、手などの人間のキーポイントを検出し、人間のポーズのコピーには役立ちます。 control_openposeモデルで使用します。 |
Straight line | 高速な直線検出器であるM-LSD (Mobile Line Segment Detection) で使用できます。 インテリアデザイン、建物、街の風景、額縁、紙の端など、直線的な輪郭を抽出する場合に便利 |
Pidnet | pidinet (ピクセル差ネットワーク) は曲線と直線のエッジを検出します。 結果はHEDと似ているが、通常は細部が少なくすっきりした線になる。 control_hedモデルで使用します。 |
HED edge detector | 実際の人間のような輪郭を生成するのに優れたエッジ検出器である。 ControlNetの作者によると、HEDは画像の色を変えたり、スタイルを変えたりするのに適している。 |
Scribbles | scribbleはユーザーが描いた落書きを前処理するためのものである。 このプリプロセッサは、リアルなイメージには使用しないでください。 control_scribbleモデルで使用します。 |
Fake Scribble | 入力画像から落書きのような輪郭を生成します。 control_scribbleモデルで使用します。 |
Segmentation | ? control_segモデルで使用 |
この表のとおり、ControlNetにはいろいろな機能がありますが、この記事では、一番よく使うであろうOpenposeを使ったキャラクターのポーズ検出だけの紹介にします。
プリプロセッサの違い
ControlNetのOpenpose(ポーズ検出)のざっくりとした流れ
Openposeの処理をざっくりと説明すると、下記の流れになります。
- 元画像からポーズ画像抽出(上図の真ん中)
- 作成したポーズ画像とプロンプトをもとに画像生成
ControlNetのインストール方法
早速使ってみます。
Google Colab版をお使いの方は、デフォルトでControlNetが組み込まれているはずなので、本項のインストール作業は不要です。
ControlNet用のWebUI拡張機能のインストール
▲「Extensionsタブ>Install from URL>下記のURL入力>install」をクリックします。
https://github.com/Mikubill/sd-webui-controlnet.git
▲インストールが完了するとインストールボタンの下に「Installed」というメッセージが表示されます。
▲WebUIを再起動するといつもの画像生成画面に「Controlnet 」というボタンが表示されていればインストール完了です。
ControlNet用のモデルのダウンロード
ControlNetを使用するには、ControlNet用のモデルが必要です。Hugging Faceでモデルが公開されています。
ControlNet用のモデル公開場所 – Hugging Face
▲先程のURLにアクセスすると8個のモデルがあります(今後、数は変わる可能性あり)。
各モデルファイルはそれぞれ特徴がありますので、用途に合わせてダウンロードする必要があります。
一般的によく使われるのは「canny」と「Openpose」です。
ポーズ調整をするのが「Openpose」モデルです。恐らくControlnetを初めて使う人は、ポーズ調整が目的だと思いますのでOpenposeだけダウンロードすればHDD容量を節約できます。必要ならあとから追加できます。
▲ダウンロードしたらPCの決まった場所に保存します(下記)。
(あなたがインストールした場所)\stable-diffusion-webui\extensions\sd-webui-controlnet\models\この中
ControlNetインストール時のエラー:AssertionError: extension access disabled because of command line flags
サーバーリッスンモードでControlNetを使おうとすると下記のエラーが出ました。この2つは現状併用できないようなのでリッスンオプションを付けて起動している場合は、オフにして再起動します。
AssertionError: extension access disabled because of command line flags
ControlNetの「構図調整(Openpose)」の使用方法
構図調整機能を使ってみます。
▲ControlNetをインストールするとtxt2imgタブとImg2imgタブ、それぞれの画面の下に「ControlNet」が追加されます。ここをクリックしましょう。
▲ControlNetの各種設定画面が下に展開されます。その中のEnableにチェックするとControlNetが有効になります。
ここがControlNetのオフオンボタンです。
1.元画像をドロップします。
ポーズの元となる画像を用意してみました。下のようにStablle diffusion-v1.5でジャンプしている女性の画像を作りました。この画像を使って同じポーズの別の画像をつくりましょう。皆さんも同じ画像を使うことでこの記事の内容を再現できます。自由に使ってください。
▲画像を画像エリアにドロップして、Enableのチェックを有効にします。
▲GPU(グラボ)のVRAMが8GB以下の方は、「Low VRAM」のチェックをオンにした方がいいようです。12GB以上あってもクラッシュする人はここをチェックすることで改善することがあるようです。
2.「プリプロセッサ」と「ControlNet Model」を選択
プリプロセッサは、「Openpose」を指定します。構図指定の時は必ずOpenposeです。
モデルは「Openpose」です。基本的にプリプロセッサとモデルは同じものを指定します。
3.プロンプトや画像サイズを設定する。
いつものようにプロンプトとネガティブプロンプトを書きます。
(masterpiece, best quality:1.1), 1girl, full body, sky diving from aeroplane, denim shorts, overalls, long shot, in the sky, wide angle, clear sky, datch angel, dynamic angle
(EasyNegative:1.4), nsfw, undressed, nipples partial head, partical face, cropped, cropped head, realistic, skirt, ground, bad hands, bad fingers
基本的に画像サイズは、元画像と同じ縦横比が推奨されています。
私は、モデルをAbyssOrangeMixにしました。
縦横比が異なる場合は、Resizeモードの設定を調整します。
4.画像を生成する。
設定が済んだら「Generate」ボタンを押して画像を生成します。
←元画像 生成結果→
▲画像が生成できました。
以上が基本的なOpenposeの使い方です。
5.気に入ったポーズ画像は取っておこう。
Openposeを使うと生成結果にポーズ画像が一緒に出力されています。気に入ったポーズがある場合、このポーズ画像をとっておきましょう。
ポーズ画像から生成すると、プリプロセッサの手順をスキップできるので、次回以降処理を高速化できます。
▲Outputsフォルダには自動保存されないから注意してね。私はAI画像と一緒にEagleで管理しています(上図)。
▼Eagleの使い方はこちら
\ 30日間 無料で使える! /
ポーズ画像から画像を生成する方法
ポーズ画像から画像生成する場合は、ポーズ画像をControlnetのキャンバスにドロップしてセットします。↓
▲ポーズ画像から画像を生成するには、棒人間画像をControlNetのキャンバスに画像をドロップします。
プリプロセッサとモデルを下記のようにセットします。
- プリプロセッサを「none」
- ControlNetモデルを「Openpose」
プリプロセッサは画像から棒人間画像を抽出するプロセスです。
棒人間画像から画像を生成するときは、プリプロセッサは不要なので「None」になります。
- 画像から画像を生成する時はプリプロセッサ「Openpose」
- 棒人間画像(ポーズ)から画像を生成する時はプリプロセッサ「none」
ControlNetのオプション
Controlnetのオプション
- キャンバスエリア:入力画像をここにドラッグ&ドロップできます。キャンバスをクリックし、ファイルブラウザを使用してファイルを選択することもできます。入力イメージは、 [Preprocessor] ドロップダウンメニューで選択したプリプロセッサによって処理されます。
- カメラアイコン:デバイスのカメラを使用して写真を撮影し、入力画像として使用します。カメラにアクセスするには、ブラウザにアクセス許可を与える必要があります。
- Enable:Controlnetを有効にするかどうか。
- Invert input color: 白黒を入れ替えます。たとえば、落書きをアップロードするときなどに使用できます。ControlNetは、黒の背景に白の落書きを想定しています。外部ソフトウェアを使用して背景が白い落書きを作成する場合は、このオプションを使用する必要があります。ControlNetのインターフェイスを使用して落書きを作成する場合は、このオプションを使用する必要はありません。
- RGB to BGR: アップロードした画像のカラーチャンネルの並び順を変更します。または、アップロードされた法線マップの座標の順序。画像をアップロードして前処理を使用する場合は、このチェックボックスをオンにする必要はありません。
- Low VRAM: 8GB未満のVRAMを搭載したGPUの場合。実験的な機能です。GPUのメモリが不足している場合や、処理する画像枚数を増やしたい場合にご確認ください。
- Guess Mode: ノンプロンプトモードとも呼ばれる。画像生成をテキストプロンプトに全く誘導されないようにすることができます。プロンプトがない場合でも、ControlNetエンコーダーは入力された制御マップ(深度、エッジなど)に従うよう強制されます。このモードを使用する場合は、50などの高いステップを使用してください。通常、このボックスはチェックしません。
- Weight:コントロールマップをプロンプトに対してどの程度強調するか。プロンプトのキーワードの重みに似ています。プロンプトへの忠実度。低ければプロンプトが無視されがち。
- Guidance Start:コントロールネットが適用する総ステップ数の割合 (ガイダンス強度=ガイダンス終了) です。これはプロンプト編集/シフトに似ている。例。[myprompt::0.8] (最初から全ステップの80%まで適用)
- Guidance End:コントロールネットが適用する総ステップ数の割合 (ガイダンス強度=ガイダンス終了) です。これはプロンプト編集/シフトに似ている。例。[myprompt::0.8] (最初から全ステップの80%まで適用)
- HED Solution:?
- resize mode:入力画像、またはポーズ画像のサイズが、生成されるイメージのサイズと異なる場合の処理を制御します。同じ縦横比であれば、これらのオプションを気にする必要はありません。
下記はWebUI上でラクガキをする場合にのみ、気にすべき設定です。Openposeなどでは使いません。
- Canvas Width:らくがき用キャンバスのWidth
- Canvas Height:らくがき用キャンバスのHeight
- Create blank canvas:空白のキャンバスを作成します。ラクガキをするときに使います。
- preview Annotator result:?
- hide Annotator result:?
ControlNet使用時のエラーについて
mat1 and mat2 shapes cannot be multiplied (154×1024 and 768×320)
ControlNetは、基本的にどのモデルでも利用できますが、現在は「Stable Diffusion 1.5」ベースにしたモデルのみが有効です。Stablle Diffusion 2.1ベースのモデルで生成したところ上記のようなエラーがでて動作しませんでした。
ただ、今後対応すると思います。
参考
- Controlnet :https://github.com/lllyasviel/ControlNet
- ControlNetをWebUIで使えるようにした拡張機能:https://github.com/Mikubill/sd-webui-controlnet
- Controlnet インストール時のエラーについて:https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/4215
- https://arxiv.org/abs/2302.05543
まとめ
以上、ControlNetの基本的な使い方について紹介しました。ControlNetにはこのほかにも、
- 線画抽出をして色変更
- 手の修正
- らくがきをハイクオリティな画像に変化
などの色々な機能があります。次回以降の記事でこれらも紹介していく予定です。
最後まで読んでくださってありがとうございます!
この記事がお役に立てましたら、シェアボタンからシェアしていただけたら嬉しいです!
コメント
コメント一覧 (9件)
いつも役に立つ記事をありがとうございます
リッスンオプションをオフにする方法がわからないのですがどうすればよいですか?
グーグルコラボを使ってて画像生成はすでにできてます
コメントありがとうございます。コラボ版は、リッスンオプション関係ない気がするので、気にしなくていい気がするのですが、何か問題が起きていますか?
AssertionError: extension access disabled because of command line flags
これがextresnsionsでコントロールネットを追加しようとするとでてしまいます
設定等はあまりいじっていないはずなのですが…
Webui用のノートブックはいくつかありますが、どちらのノートブックを使っていますか?
私が紹介しているTheLastBenさんのノートブックはControlnetが組み込まれているの拡張機能をインストールしなくて大丈夫です。
ノートブックを開くと、デフォルトでControlnetのボタンが表示されます。こちらのノートブックを試してみていただけないでしょうか。
▼TheLastBenさんのGoogleコラボノートブック
https://blogcake.net/stable-diffusion-colab/
うまくいきました ありがとうございます!
ありがとうございます!
素敵な記事をありがとうございます!
お陰様でOpenposeをスムーズに利用することが出来ました!(*^^*)
cannyの線画抽出が上手くいかなかったので、これについての解説記事も見てみたいです…!(><)
嬉しいコメントありがとうございます。
いずれcannyの記事もだしたいですね。貴重なご意見をくださってありがとうございます^^
分かりやすい記事をありがとうございます!
ControlNetで動画を作ろうと思っているのですが、ControlNetで複数枚を選択し、画像を生成する方法はありますでしょうか?
Controlnet-M2Mだとうまくいかなくて困っています…(;^ω^)