ラフ画像をクリンナップ / ペン入れする (キャラクター) - Stable Diffusion

Stable Diffusion を利用して、ラフ画像をクリンナップ / ペン入れする処理を検証します。

概要

Stable DiffusionのSDXL ControlNetモデルの学習や新しいワークフローやシナリオが登場したことで、 今までとは違う利用方法が登場してきています。
今回、SDXLのControlNetの新しいモデルを利用して、ラフ画像のクリンナップ(クリンアップ)を生成処理でできないかを検証します。

以下のControlNetのモデルで検証をしています。
  • Canny
  • mistoLine
  • xinsir Scribble
  • CN-anytest v3,v4
  • dart_v2_sft_img_BlurCN, ControlNet_tori29_blur-fp16
  • rough-coating-v1

事前準備

ラフ画像の準備

今回以下のラフ画像を利用します。あたり線や迷い線のあるラフ画像を用意しました。少し変わったデザインの服で検証します。
今回は768x1,024ピクセルの画像を用意しました。

手順:Cannyを利用する方法

以下のControlNetを準備します。
  • control-lora-canny-rank256 [モデルハッシュ:ec2dbbe4]

Stable Diffusion Web UIを表示し、[img2img]のタブをクリックして選択します。
入力画像に準備したラフ画像を設定します。


ControlNetのパネルを開き、設定します。


[Enable]のチェックを有効にします。[Preprocessor]に"lineart-realistic"を設定し、[Model]に"control-lora-canny-rank256"を設定します。
[Control Weight]に"1"を設定し、[Resolution]を1024に設定します。

Sampling Method、出力画像サイズ

Sampling Methodは、DPM++ 2Mを利用します。Schedule typeはAutomaticを選択しています。
出力サイズは、Resized by で "1" を設定し、img2imgの入力画像と同じサイズで出力します。

プロンプト

プロンプトを準備します。ラフ画像は荒いことと、描き手が想像しているイメージがラフ画像には反映されていない場合もあるため、 ラフ画像に描画されている内容以上の細かい状況をプロンプトに記述します。
また、モデルは Animagine XL ver 3.0 を利用します。
Prompt and Settigns
Prompt:lineart, monochrome, white background, 1gir, upper body, collared shirt, twintails, wearing vest, masterpiece
Negative prompt:worst quality, low quality, rough, sketch, text
Size:768 x 1,024
Model: Animagine XL v3.0 Sampling method: DPM++ 2M, Schedule type: Automatic
Denoising strength:0.75

生成結果

上記設定で画像を生成します。ラフ画像と同様の形状の画像が生成されることを確認します。


Control Weight の値を変更して、ラフ画像が生成結果にどのように反映されるか確認します。
[Script]のドロップダウンリストから"X/Y/Z plot"を選択します。 [X type]に"[ContorlNet Weight]"を選択し、[X values] に "1.0,0.75,0.66,0.5,0.33,0.25" を設定します。 [Y type]に"Seed"を選択し、[Y value]に"100000,200000,300000,400000" を設定します。


生成結果は下図です。ControlNetのWeightが高い場合は、ラフ画像のイメージに近い結果になりますが、線もラフ感の強い表現になります。 0.66程度まで下げると、線が整理されペン画に近い表現になりますが、元のラフ画像から形状が変化してしまいます。



Preprocessorを"lineart_anime_denoise"に変更した場合の結果です。プリプロセッサで線が整理されるためか、線が濃くなりやや整理された線の表現になります。


Preprocessorを"canny"に変更した場合の結果が下図です。lineartプロプロセッサよりは線が濃くなり整理される印象です。


Preprocessorを"softedge_anyline"に変更した場合の結果が下図です。Weight 0.75 程度でもSeedによってはかなり整理された線の生成結果になります。

手順:mistoLineを利用する方法

ControlNet の MistoLine モデルを利用する方法です。
ControlNetのインストールと、以下のControlNetを準備します。 モデルの取得についてはこちらの記事を参照してください。
  • mistoLine_fp16 [モデルハッシュ:2583d73c]

先の設定のまま、Preprocessorを"lineart_realistic"に設定し、Modelを"mistoLine_fp16"に設定します。


生成結果は下図です。mistoLineでは元の画像の影響が強く出るため、Weightが高い場合、ラフ画像とほぼ同様の生成結果になりますが、 線もラフのままとなってしまいます。Weightを0.5まで下げてもラフ感が抜けません。


Preprocessorを"lineart_anime_denoise"に変更した場合の結果が下図です。
プロプロセッサで線が整理されるためか、やや線が整理された結果になります。


Preprocessorを"canny"に変更した場合の結果が下図です。Weightを0.33程度まで下げないとラフ感が残ってしまう印象です。


Preprocessorを"softedge_anyline"に変更した場合の結果が下図です。 こちらも、Weightを0.33程度まで下げないとラフ感が残ってしまう印象です。


手順:xinsir Scribbleを利用する方法

ControlNet の xinsir Scribble モデルを利用する方法です。
ControlNetのインストールと、以下のControlNetを準備します。 モデルの取得についてはこちらの記事を参照してください。
  • xinsir_controlnet-scribble-sdxl-1.0 [モデルハッシュ:ab7dc06d]

Sampling methodに"UniPC"を設定します。Schedult typeは"Uniform"を設定します。Sampling stepは50とします。
ControlNetのPreprocessorには"scribble_pidinet"を指定します。Resolutionの値は128,256,512,1024,2048とそれぞれ変化させた結果を確認します。 Denoising strength の値をは0.75にします。


結果は下図です。
Resolution=128 の場合の結果です。ControlNetのWeightが高い場合でも、 線が整理され、クリンナップされた状態で出力できますが、元のラフの形状から大きく変化してしまいます。


Resolution=256 の場合の結果です。ControlNetのWeightが高い場合は線にラフ感が残りますが、0.66程度では線が整理された状態の結果となります。 元のラフの形状とは違った結果になる場合がほとんどです。

Resolution=512 の場合の結果です。ControlNetのWeightが高い場合はラフ感が残り、線が整理されません。0.5程度まで下げると線が整理されますが、 Seedによって結果が異なり、Seedの値によっては線が整理される場合もありますが、ラフ感が残ってしまう場合もあります。ラフの形状はやや反映されますが、 変化してしまう部分も多いです。


Resolution=1024 の場合の結果です。ControlNetのWeightが0.33程度まで下げると、Seedの値によっては線が整理される結果となりました。ラフの形状も反映されている結果が増えます。

Resolution=2048 の場合の結果です。ControlNetのWeightが0.33程度ではラフ感が残る印象です。0.25ではSeedの値によっては線が整理されますが、若干のラフ感が残ります。 ラフの形状の反映度は高まります。

検証: UniPC 高Resolution値

Sampling methodでUniPCを利用し、ControlNetのResolutionの値を大きくすると良好な結果が得られるとの情報があったため、検証します。

Sampling methodに"UniPC"を設定します。Schedult typeは"Uniform"を設定します。Sampling stepは50とします。
ControlNetのPreprocessorには"softedge_anyline"を指定し、Resolutionを"2048"に設定します。 また、Denoising strength の値を0.9にします。


Modelを"control-lora-canny-rank256"にした場合の結果が下図です。若干結果が良好な印象はあります。


Denoising strength を0.75に設定した場合の結果です。

Modelを"mistoLine"にした場合の結果が下図です。Weightが0.33以下になると線が整理されますが、0.5以上ではラフ感が残ります。


Denoising strength を0.75に設定した場合の結果です。

検証: CN-anytest_v3, CN-anytest_v4

CN-anytest_v3, CN-anytest_v4を利用すると、良好な結果が得られるとの情報があったため、検証します。
以下のControlNetを準備します。
  • CN-anytest_v3-25000_fp16 [モデルハッシュ:36518430]
  • CN-anytest_v3-50000_fp16 [モデルハッシュ:0963df47]
  • CN-anytest_v4-marged [モデルハッシュ:4bb64990]

モデルのダウンロードについてはこちらの記事を参照してください。

設定は以下です。
Sampling methodに"UniPC"を設定します。Schedult typeは"Uniform"を設定します。Sampling stepは50とします。
ControlNetのPreprocessorは"lineart_realistic" "softedge_anyline" "scribble_pidinet" それぞれで確認します。 Resolutionの値は2048を利用します。Denoising strength の値をは0.75にします。


"CN-anytest_v3-25000_fp16"でプリプロセッサを"lineart-realistic"を利用した結果です。
ControlNetのWeightが比較的高い0.66程度でも線の整理ができています。一方で元のラフの形状の反映は弱めです。


"CN-anytest_v3-25000_fp16"でプリプロセッサを"softedge-anyline"を利用した結果です。
"lineart-realistic"より若干線が減りシンプルに整理される印象です。


"CN-anytest_v3-25000_fp16"でプリプロセッサを"scribble-pidinet"を利用した結果です。
"lineart-realistic", "softedge-anyline" の時に見られた薄い細線が減り、より線が整理される印象です。 元のラフの形状の反映は弱めですが、Seedの値によっては意図した形状に近い出力になります。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"lineart-realistic"を利用した結果です。
CN-anytest_v3-25000より元のラフの形状が強く反映される印象です。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"softedge-anyline"を利用した結果です。
"lineart-realistic"より若干線が減りシンプルに整理される印象です。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"scribble-pidinet"を利用した結果です。
"lineart-realistic"より若干線が減りシンプルに整理される印象です。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"lineart-realistic"を利用しモデルを"T-ponynai3"使用した結果です。
Animagineより線が整理され、シンプルな描線になる印象です。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"softedge-anyline"を利用しモデルを"T-ponynai3"使用した結果です。


"CN-anytest_v3-50000_fp16"でプリプロセッサを"scribble-pidinet"を利用しモデルを"T-ponynai3"使用した結果です。


"CN-anytest_v4-marged"でプリプロセッサを"lineart-realistic"を利用した結果です。
Weight 0.5程度で大部分の線が整理された結果になります。 ラフの形状が反映されない場合もありますが、Seedの値によってはうまく表現される場合もあります。


"CN-anytest_v4-marged"でプリプロセッサを"softedge-anyline"を利用した結果です。
Weight 0.5程度で大部分の線が整理された結果になります。lineart-realisticより線の本数が若干少なくなる印象です。 ラフの形状が反映されない場合もありますが、Seedの値によってはうまく表現される場合もあります。


"CN-anytest_v4-marged"でプリプロセッサを"scribble-pidinet"を利用した結果です。
Weight 0.5程度で大部分の線が整理された結果になります。lineart-realisticより細かい線が表現され、線の本数が増える印象です。 ラフの形状が反映されない場合もありますが、Seedの値によってはうまく表現される場合もあります。


"CN-anytest_v4-marged"でプリプロセッサを"none"に設定し利用しない場合の結果です。
Weight 0.5程度ではラフ感や細線が残ってしまいますが、入力元画像の形状がより強く反映できています。0.33程度まで下げると線の整理がされた生成結果になります。

検証: dart_v2_sft_img_BlurCN, ControlNet_tori29_blur-fp16

dart_v2_sft_img_BlurCNを利用すると、良好な結果が得られるとの情報があったため、検証します。
迷い線のあるラフはクリンナップされた画像をぼかした状態であるという想定の元、 ぼかしを逆算して収束させればクリンナップされた線になるというアイディアになります。
同様の試みは"controllllite_v01032064e_sdxl_blur-anime_500-1000"でも検証したこともあり、その際は意図した結果が得られませんでしたが、 最新のBlur ControlNetモデルでは良好な結果が得られるとのことです。

以下のControlNetを準備します。
  • dart_v2_sft_img_BlurCN_fp16 [モデルハッシュ:ee48a6ab]
  • ControlNet_tori29_blur-fp16 [モデルハッシュ:20d67fdf]

モデルの入手はこちらの記事を参照してください。

img2imgで実行します。img2imgの入力画像には用意したラフ画像を設定する場合と、ラフ画像をぼかした場合で出力を確認します。


Sampling method には "UniPC"、Schhedule type には"Uniform"を設定します。 出力サイズは入力元の画像サイズと同じ(Scale=1)にします。Denoising strength は 0.75を利用します。
ControlNetを有効にします。Preprocessorの指定は"None"として無しにします。 Resolutionは"2048"に設定します。 これまでの検証から、解像度が高いほど入力画像の結果が反映されやすいためです。
プロンプトはこれまでと同様のプロンプト、モデルはAnimagine XL v3.0 を利用します。
Control Weightの値を変化させて画像生成し、結果を確認します。


dart_v2_sft_img_BlurCN_fp16

Modelに"dart_v2_sft_img_BlurCN_fp16"を利用した場合の結果です。
Denoising strengthが0.75の場合の結果です。Weight=1.0の状態でも線はかなり整理された状態になります。 脚色が入る傾向があり、ラフ画像に対する形状の忠実さは若干弱い印象がありますが、線のクリンナップの具合はかなり良好です。


Denoising strengthが0.9の場合の結果です。


Denoising strengthが0.75でぼかしをかけた入力画像を設定した場合の結果です。Weightが大きいと墨絵のような結果になります。


Denoising strengthが0.9でぼかしをかけた入力画像を設定した場合の結果です。Weightが大きいと毛筆で描いたような結果になります。


ControlNet_tori29_blur-fp16

Modelに"ControlNet_tori29_blur-fp16"を利用し、Denoising strengthが0.75の場合の結果です。
Weightが高い場合は迷路のような模様が出てしまいます。Weight 0.33程度まで下がるとクリンナップされた画像が出力できます。


Denoising strengthが0.9の場合の結果です。こちらも同様にWeightの値が大きいと迷路のような模様が出てしまいます。
0.5程度まで下げるとクリンナップされた画像が生成できます。


Denoising strengthが0.75でぼかしをかけた入力画像を設定した場合の結果です。Weightが大きいと特徴的な模様が出てしまいます。


Denoising strengthが0.9でぼかしをかけた入力画像を設定した場合の結果です。Weightが大きいと特徴的な模様が出てしまいます。

検証:rough-coating-v1

  • rough-coatingV1 [モデルハッシュ:63a54fb8]

モデルの入手はこちらの記事を参照してください。
Modelに"rough-coating-v1"を利用し、Denoising strengthが0.75の場合の結果です。

Ending Control Step=1.0 の結果です。Weightが大きい場合には入力の画像の影響が強くラフ感が残ったままの画像生成結果になりました。 0.33程度まで下げると、線が整理される結果になります。


Ending Control Step=0.75 の結果です。1.0の場合と大きな違いがありませんでした。


Ending Control Step=0.5 の結果です。1.0の場合と大きな違いがありませんでした。


Ending Control Step=0.25 の結果です。1.0の場合と大きな違いがありませんでした。


Denoising strengthが0.9の場合の結果です。

Ending Control Step=1.0 の結果です。元画像の影響が弱まる結果となりました。線の整理はされず、Weightを0.33程度に下げると、 線が整理される結果になります。Denoising strengthが0.75と比べると、線が細くなる印象があります。


Ending Control Step=0.75 の結果です。Weightを0.33程度の結果は良好に見えます。


Ending Control Step=0.5 の結果です。Weightを0.5近辺の結果は良好に見えます。若干汚れが生成画像に出てしまう場合があります。


Ending Control Step=0.25 の結果です。

評価・所感

ラフ画像から線を整理してペン画の画像を生成する方法を検証しました。
Cannyを利用する方法では、線が整理できペン画風の画像を生成できますが、Weightを下げる必要があり、元の絵から形状や絵柄が若干変化してしまいます。 一方で、mistoLineを利用した場合は、元の画像の形状により忠実ですが、線の整理もされず、ラフ感に近い画像が生成される結果となりました。
mistoLineを利用する場合は、整理された線のラフ画像を利用すると良好な結果が得られそうです。
ざっくりしたラフの場合は、ある程度の変更を許容すると、線が整理され、ペン画に近い生成結果が得られます。 逆に形状を正しく反映させたい場合は、荒いラフではなく、より整理された線画を入力に与える必要がありそうです。
また、今回の検証では、ControlNetのWeightを下げると、服の袖が長袖になる場合があり、プロンプトをさらに見直すことで成功率が上がる見込みもありそうです。 荒いラフを入力した場合は、プロンプトをしっかり検討することで、意図した画像を生成できる確率が上がりそうです。
追加で検証した、CN-anytest_v3, CN-anytest_v4, dart_v2_sft_img_BlurCN はいずれも性能が良く良好な結果の画像が生成できます。 元のラフの形状の反映度合いや線の整理のされ方に違いがあるため、求める出力に合わせてモデルを選択するほうが良さそうです。 いずれの場合でも詳細なプロンプトの記述は必要との印象です。今回のテストのプロンプトでは記述が不足していると感じています。

また、rough-coating-v1での検証も実施しました。こちらも良好な生成結果が得られる印象です。

今回の検証では、輪郭線をクリンナップした状態のモノクロの画像を生成しましたが、実用的なワークフローを考えると、グレースケールで明暗のトーン処理までされた画像を生成するほうが良いのかもしれません。

著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2024-05-18
iPentec all rights reserverd.