レビュー: テキストから画像への合成のためのマルチインスタンス生成コントローラー
2024 年 2 月 24 日にリリースされた MIGC: テキストから画像への合成のためのマルチインスタンス生成コントローラーに関する最近の論文では、マルチインスタンス生成 (MIG) と呼ばれる新しいタスクが紹介されています。ここでの目標は、それぞれが特定の属性を持ち、正確に配置された複数のオブジェクトを画像内に作成することです。新しいアプローチであるマルチインスタンス生成コントローラー (MIGC) は、このタスクをより小さな部分に分割し、アテンション メカニズムを使用して各オブジェクトの正確なレンダリングを保証します。次に、これらのレンダリングされたオブジェクトが結合されて、最終的なイメージが作成されます。 COCO-MIG と呼ばれるベンチマークは、このタスクのモデルを評価するために作成され、実験では、このアプローチにより、生成されたオブジェクトの量、位置、属性、および相互作用を優れた制御できることが示されました。
導入
安定した拡散は、テキストから画像への生成でよく知られています。さらに、写真、絵画など、さまざまな分野で優れた能力を発揮しています。ただし、これらの研究は主に単一インスタンスの生成に焦点を当てています。ただし、実際のシナリオでは、量、位置、属性、相互作用を制御しながら、単一の画像内で複数のインスタンスを同時に生成する必要がありますが、これはほとんど解明されていないままです。この調査では、マルチインスタンス生成 (MIG) のより広範なタスクをさらに深く掘り下げ、統一フレームワーク内での多様なインスタンスの生成に伴う複雑さに取り組むことを目的としています。
分割統治戦略に基づいて、マルチインスタンス生成コントローラー (MIGC) アプローチを提案します。このアプローチは、MIG を複数のサブタスクに分解し、それらのサブタスクの結果を結合することを目的としています。 - オリジナルの研究論文
MIGC は 3 つのステップで構成されます。
-
分割: MIGC は、マルチインスタンス生成 (MIG) を SD のクロス アテンション レイヤー内の個々のインスタンス シェーディング サブタスクに分割します。このアプローチにより、各サブタスクの解決が加速され、生成された画像の画像の調和が強化されます。
Conquer: MIGC は、強化アテンション レイヤーと呼ばれる特別なレイヤーを使用して、固定されたクロス アテンションからのシェーディング結果を改善します。これにより、各インスタンスが適切なシェーディングを受けることが保証されます。
結合: MIGC、レイアウト アテンション レイヤーを使用してシェーディング テンプレートを取得します。次に、それをシェーディング背景およびシェーディング インスタンスと結合し、それらを Shading Aggregation Controller に送信して、最終的なシェーディング結果を取得します。
MIGC の概要 (出典)
COCO-MIG、COCO、DrawBenchを使って総合的な実験を行いました。 COCO-MIG メソッドにより、インスタンスの成功率が 32.39% から 58.43% に大幅に向上しました。このアプローチを COCO ベンチマークに適用すると、平均精度 (AP) が 40.68/68.26/42.85 から 54.69/84.17/61.71 に著しく向上しました。同様に、DrawBench では、位置、属性、およびカウントの改善が観察され、特に属性の成功率が 48.20% から 97.50% に向上しました。さらに、研究論文で述べたように、MIGC は元の安定拡散と同様の推論速度を維持します。
前提条件
- AI モデルの基本的な理解: 安定拡散や DALL-E などのテキストから画像への合成モデルについての知識。
- マルチモーダル学習の知識: モデルがテキスト データと画像データの両方を処理する方法を理解します。
- 主要な ML 概念: アテンション メカニズム、トランスフォーマー、潜在拡散モデルなどの概念に精通していること。
- Python および ML ライブラリ: PyTorch、Hugging Face、TensorFlow などのライブラリの使用経験。
- 評価指標: 画像合成評価指標 (FID、CLIP スコアなど) の認識。
分析と結果
マルチインスタンス生成 (MIG) では、ユーザーはグローバル プロンプト (P)、各インスタンスの境界ボックス (B)、および各インスタンスの説明 (D) を生成モデルに提供します。これらの入力に基づいて、モデルはボックス内の各インスタンスがその説明と一致し、すべてのインスタンスが画像内で正しく位置合わせされる画像 (I) を作成する必要があります。安定拡散などの従来の手法では、テキスト漏洩や空間漏洩などの属性漏洩が問題でした。
MIGCの比較結果(出典)
上の画像は、MIGC アプローチと COCO-MIG データセット上の他のベースライン手法を比較しています。具体的には、「Obj」とマークされた黄色の境界ボックスは、位置が不正確に生成されたインスタンスを示すために使用され、「Attr」とマークされた青色の境界ボックスは、属性が誤って生成されたインスタンスを示すために使用されます。
研究の実験結果は、MIGC がインスタンスの位置の正確な制御を維持しながら、特に色に関する属性制御に優れていることを示しています。
位置の評価では、Grounding-DINO を使用して検出されたボックスをグラウンド トゥルースと比較し、IoU が 0.5 を超えるインスタンスを「位置が正しく生成された」としてマークしました。属性については、インスタンスが正しく配置されている場合、Grounded-SAM を使用して HSV 空間内のターゲット カラーのパーセンテージを測定し、パーセンテージが 0.2 を超えるインスタンスに「完全に正しく生成された」というラベルを付けました。 」
COCO-MIG では、主にインスタンスの成功率と mIoU に焦点が当てられ、色が正しくない場合は IoU が 0 に設定されました。 COCO-Position、成功率、mIoU、空間精度の Grounding-DINO AP スコア、画質の FID、CLIP スコア、および画像とテキストの一貫性の Local CLIP スコアが測定されました。
DrawBench の場合、位置とカウントの精度について成功率が評価され、正しい色の帰属がチェックされました。手動評価は自動化されたメトリクスを補完します。
デモ
1.リポジトリのクローンを作成し、必要なライブラリをインストールして更新します
!git clone https://github.com/limuloo/MIGC.git
%cd MIGC
!pip install --upgrade --no-cache-dir gdown
!pip install transformers
!pip install torch
!pip install accelerate
!pip install pyngrok
!pip install opencv-python
!pip install einops
!pip install diffusers==0.21.1
!pip install omegaconf
!pip install -U transformers
!pip install -e .
2.必要なモジュールをインポートする
import yaml
from diffusers import EulerDiscreteScheduler
from migc.migc_utils import seed_everything
from migc.migc_pipeline import StableDiffusionMIGCPipeline, MIGCProcessor, AttentionStore
import os
3.事前トレーニングされた重みをダウンロードしてディレクトリに保存します。
!gdown --id 1v5ik-94qlfKuCx-Cv1EfEkxNBygtsz0T -O ./pretrained_weights/MIGC_SD14.ckpt
!gdown --id 1cmdif24erg3Pph3zIZaUoaSzqVEuEfYM -O ./migc_gui_weights/sd/cetusMix_Whalefall2.safetensors
!gdown --id 1Z_BFepTXMbe-cib7Lla5A224XXE1mBcS -O ./migc_gui_weights/clip/text_encoder/pytorch_model.bin
4.関数「offlinePipelineSetupWithSafeTensor」を作成します
この機能は、テキストおよび画像処理用の MIGC モデルと CLIP モデルを統合して、オフライン処理用のパイプラインをセットアップします。
def offlinePipelineSetupWithSafeTensor(sd_safetensors_path):
migc_ckpt_path = '/notebooks/MIGC/pretrained_weights/MIGC_SD14.ckpt'
clip_model_path = '/notebooks/MIGC/migc_gui_weights/clip/text_encoder'
clip_tokenizer_path = '/notebooks/MIGC/migc_gui_weights/clip/tokenizer'
original_config_file='/notebooks/MIGC/migc_gui_weights/v1-inference.yaml'
ctx = init_empty_weights if is_accelerate_available() else nullcontext
with ctx():
# text_encoder = CLIPTextModel(config)
text_encoder = CLIPTextModel.from_pretrained(clip_model_path)
tokenizer = CLIPTokenizer.from_pretrained(clip_tokenizer_path)
pipe = StableDiffusionMIGCPipeline.from_single_file(sd_safetensors_path,
original_config_file=original_config_file,
text_encoder=text_encoder,
tokenizer=tokenizer,
load_safety_checker=False)
print('Initializing pipeline')
pipe.attention_store = AttentionStore()
from migc.migc_utils import load_migc
load_migc(pipe.unet , pipe.attention_store,
migc_ckpt_path, attn_processor=MIGCProcessor)
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
return pipe
5.引数 './migc_gui_weights/sd/cetusMix_Whalefall2.safetensors'
を指定して関数 offlinePipelineSetupWithSafeTensor()
を呼び出し、パイプラインを設定します。パイプラインのセットアップ後、.to("cuda")
メソッドを使用して、GPU アクセラレーションのためにパイプライン全体を CUDA デバイスに転送します。
pipe = offlinePipelineSetupWithSafeTensor('./migc_gui_weights/sd/cetusMix_Whalefall2.safetensors')
pipe = pipe.to("cuda")
6.作成したパイプラインを使用してイメージを生成します。作成された画像は、提供されたプロンプトと境界ボックスに基づいており、関数は生成された画像に境界ボックスと説明を付けて注釈を付け、結果を保存/表示します。
prompt_final = [['masterpiece, best quality,black colored ball,gray colored cat,white colored bed,\
green colored plant,red colored teddy bear,blue colored wall,brown colored vase,orange colored book,\
yellow colored hat', 'black colored ball', 'gray colored cat', 'white colored bed', 'green colored plant', \
'red colored teddy bear', 'blue colored wall', 'brown colored vase', 'orange colored book', 'yellow colored hat']]
bboxes = [[[0.3125, 0.609375, 0.625, 0.875], [0.5625, 0.171875, 0.984375, 0.6875], \
[0.0, 0.265625, 0.984375, 0.984375], [0.0, 0.015625, 0.21875, 0.328125], \
[0.171875, 0.109375, 0.546875, 0.515625], [0.234375, 0.0, 1.0, 0.3125], \
[0.71875, 0.625, 0.953125, 0.921875], [0.0625, 0.484375, 0.359375, 0.8125], \
[0.609375, 0.09375, 0.90625, 0.28125]]]
negative_prompt = 'worst quality, low quality, bad anatomy, watermark, text, blurry'
seed = 7351007268695528845
seed_everything(seed)
image = pipe(prompt_final, bboxes, num_inference_steps=30, guidance_scale=7.5,
MIGCsteps=15, aug_phase_with_and=False, negative_prompt=negative_prompt, NaiveFuserSteps=30).images[0]
image.save('output1.png')
image.show()
image = pipe.draw_box_desc(image, bboxes[0], prompt_final[0][1:])
image.save('anno_output1.png')
image.show()
提供されたプロンプトに基づいて生成されたイメージ
定義された境界ボックスを含む画像
読者には、リンクをクリックして完全なノートブックにアクセスし、コードをさらに試してみることを強くお勧めします。
結論
この研究は、「MIG」と呼ばれる困難なタスクに取り組み、MIG タスクを処理する際の安定拡散のパフォーマンスを向上させる MIGC と呼ばれるソリューションを導入することを目的としています。新しいアイデアの 1 つは、複雑な MIG タスクをより単純なタスクに分割し、個々のオブジェクトのシェーディングに焦点を当てる分割統治戦略を利用しています。各オブジェクトのシェーディングはアテンション レイヤーを使用してさらに強化され、別のアテンション レイヤーとコントローラーを使用してすべてのシェーディングされたオブジェクトと結合されます。提案された COCO-MIG データセットと、COCO-Position や Drawbench などの広く使用されているベンチマークを使用して、いくつかの実験が行われます。 MIGC を実験した結果、MIGC が効率的かつ効果的であることがわかりました。
私たちがこの記事について書くのを楽しんだのと同じように、あなたもこの記事を楽しんで読んでいただければ幸いです。
参考文献
- 公式リポジトリ
- オリジナルの研究論文