コンテンツへスキップ

ControlNet 「OpenPose」 骨格で姿勢を指示してキャラクターのポーズをコントロールする

ここ最近、img2imgを中心にStable Diffusionで画像生成を行っています。前回は、img2img のInpaint機能でマスクした部分をピンポイントで画像の書き換えを置き換えるという非常に強力な機能を使ってみました。

次に気になった機能は、ControlNetです。

ControlNetとは

ControlNet(Stable Diffusion Control Network)を使うと、Stable Diffusionの画像生成時に追加の条件を付与することができます。その条件を生成AIが、画像生成時に取り込み、こちらの望んだ画像を生成してくれます。

追加の条件とは、線画、骨格、深度マップなどがありますが、言葉で言ってもピンと来ないと思いますので、1つずつ確認していきたいと思います。今回は、OpenPose機能を見てみます

Wikipediaの直訳はこちら

コントロールネットは、追加の条件を組み込むことで拡散モデルを管理するように設計されたニューラル ネットワーク アーキテクチャです。ニューラル ネットワーク ブロックの重みを「ロックされた」コピーと「トレーニング可能な」コピーに複製します。「トレーニング可能な」コピーは目的の条件を学習しますが、「ロックされた」コピーは元のモデルを保持します。このアプローチにより、画像ペアの小さなデータセットを使用したトレーニングによって、実稼働可能な拡散モデルの整合性が損なわれないことが保証されます。「ゼロ畳み込み」は、重みとバイアスの両方がゼロに初期化された 1×1 畳み込みです。トレーニング前は、すべてのゼロ畳み込みはゼロ出力を生成し、ControlNet によって引き起こされる歪みを防ぎます。スクラッチからトレーニングされるレイヤーはありません。プロセスはまだ微調整中であり、元のモデルを安全に保ちます。

wikipedia: Stable Diffusion – ControlNet
https://en.wikipedia.org/wiki/Stable_Diffusion#ControlNet

OpenPose機能とは

OpenPose機能は、プロンプト(txt2img、img2img)や、画像(img2img)に加えて、追加で「骨格」を指定してキャラクターのポーズを制御することができます。
あああ

骨格(棒人間)とは

骨格(棒人間)については説明するより下の画像を見て頂いた方が早いですね。

人間の骨格を、線画で表しています。顔の表情や、手の関節の一つ一つまで定義できるので、Stable Diffusionが苦手な手の画像生成をNegative Promptで指示していましたが、より精度を高めることができるかもしれません。

骨格を指定する際に、棒で作成された骨格(棒人間)を、あらかじめ作っておく必要があるのでしょうか?

画像から骨格(棒人間)を作る機能が、OpenPoseにありますよ

骨格がある場合は骨格を使い、ない場合は画像から骨格を作ってくれるのはありがたいです。

左の画像を指定して、右の骨格(棒人間)を生成しています。骨格(棒人間)の生成はプリプロセッサを指定すると作成してくれます。

ControlNet「OpenPose」機能の使い方。流れ

それでは実際にControlNetの「OpenPose」機能を使っていきましょう。

今回は、着物の女性の姿勢(ポーズ)を、骨格(棒人間)を指定して変えてみましょう。

元画像の読み込み

いつもお馴染みの着物の女性の画像を読み込みます。PNG Infoで読み込み「Send to img2img」で画像とプロンプトを転送します。

外部から取得した画像などの場合は、その画像を生成するためのプロンプトを入力するか、Tagger機能でキーワードを抽出してください。Taggerについては後日取り上げたいと思います。

パラメータの設定

img2imgの設定項目は以前の説明を参照してください。

img2imgの下の方にある、「◀ControlNet」のマークを押すとControlNetの設定のパネルが表示されます。

ControlNetを使うには、「Enable」をオンにします。

使用する画像を指定する場合は、「Upload independent control image」をオンにすると、画像を指定する領域が現れますので、画像を指定します。

その下の「Control Type」に15項目の機能が並んでいますので、今回使用するControlNetの機能である「OpenPose」を選択します。

選択すると、自動的にその下の「Preprosessor(プリプロセッサー)」と「モデル」にOpenPoseに必要なものが選択されます。インストールされていない場合は選択されませんので、インストールをしてください。

すでに骨格(棒人間)の画像が存在する場合は、以下のように骨格(棒人間)を指定して、その場合はPreprosessorは、何も指定しない(none)ようにします。Preprosessorを使って、画像から骨格(棒人間)を生成するので、その工程がが不要な場合は指定しない(none)ということですね。

Generate(生成)・結果の確認

「Generate(生成)」ボタンを押してしばらく待ちます。

出来上がった画像が以下になります。画像の雰囲気は元の画像を継承し、指定した骨格(骨格)のポーズになっています。さすがに顔は変わりますが、ポーズを維持する機能なので仕方がないですね。体の向きもしっかり変わっています。

設定する箇所は増えますが、プロンプトで指定する手間を考えると非常に簡単で、成功率も高そうです。

別のポーズで画像生成してみる

次にこちらの画像でOpenPoseを使って、画像生成します。

右の画像は、左の画像から生成した骨格(棒人間)です。手の骨格も正確に生成されています。

元画像は最初の例と同じものを使用し、上記の画像をOpenPoseで指定して生成した画像がこちらになります。ネガティブプロンプトの指定がないと手の出力がうまくいかなかったので、手の出力系のプロンプトを追加しています。手の位置が少し違いますが、この画像にはこちらの方が合っているとも言えます。骨格を忠実に守らせるにはパラメータを調整すれば行けそうです。

EasyNegative, badhandv4, ng_deepnegative_v1_75t, (mole:1.5), (worst quality:2), (low quality:2), (normal quality:1.5), monochrome, grayscale, (bad_prompt_version2), glans, skin spots, acnes, skin blemishes, age spot, bad anatomy, bad feet, bad hands, bad quality,(cloudy:1.5),(logo:2.0),(mark:2.0),(pussy:2.0),loli, child, petite, lolita,bad-image-v2-39000, ((bad-hands-5, negative_hand-neg)), bad_prompt_version2, verybadimagenegative_v1.3

まとめ

今回は、ControlNetOpenPoseを使ってみました。

骨格を指定してポーズを指示しますが、プリプロセッサーで画像から骨格を作成してくれ、そのまま結果画像を生成してくれるという優れもので、操作も簡単です。

ControlNetは今回はじめて触りましたが、他にも15個くらいの機能がありました。最初に触ったOpenPoseが非常に有用であったため、他の機能への期待が膨らみます。

次回、他の機能について紹介したいと思います。