ChatGPT
自分が書いたイラストを、着飾ったり、今いない世界を背景にしてもらえるようなソフトは何がありますか。
ChatGPT:
なるほど、自分の描いたイラストを元に、キャラクターを着飾ったり、異世界やファンタジー背景に合成するようなソフトですね。最近はAI技術の発展で手軽にできます。いくつかおすすめを分類して紹介します。
- AIベースのイラスト加工・合成ツール
ソフト / サービス 特徴 利用方法
Fotor 「Magic Edit」でキャラクターを残しつつ背景変更・衣装追加が可能 Web / 無料プランあり
NVIDIA Canvas / Omniverse AIが線画や簡単な塗りをもとに背景を生成 Windows専用 / GPU必須
Runway ML 背景置き換え・服装編集・動画対応も Web / 有料プランあり
NovelAI / Stable Diffusion WebUI プロンプト指定で「服装・世界観」を自由に設定して描画 Web / 自前モデル利用可能
ComfyUI / Automatic1111 Stable Diffusion系のローカルUIで高自由度編集 Windows/Linux / 自分でモデルを用意
💡ポイント
キャラクターを維持したい場合は「inpainting(部分編集)機能」があるソフトが便利です。
背景や衣装はプロンプトで自由に設定可能。例えば「中世ファンタジーの城の前に立つキャラクター、金色の鎧を着て」など。- キャラクター着せ替え系アプリ
ソフト / サービス 特徴
VRoid Studio 3Dキャラクターを作り、衣装やポーズを自由に設定
DressUp / Charat 2Dアバターを簡単に着せ替え、SNS用素材として書き出し可
Ready Player Me 3Dアバター作成、Web・VR空間で利用可能
💡ポイント
元のイラストをベースにする場合は「トレースして3D化」する必要がある場合があります。- 背景・世界観生成に特化したAI
ソフト / サービス 特徴
MidJourney 高品質な背景・ファンタジー世界を生成
DALL·E 3 (OpenAI) キャラクター付きプロンプトで自然な背景を生成
Stable Diffusion XL 高解像度・幻想的背景に強い
💡ポイント
元イラストを「アップロード + inpainting / mask」で背景だけ差し替え可能
キャラクターの雰囲気や服装を維持するにはプロンプトに詳細を書き込む
✅ まとめ
キャラクター保持+衣装変更 → Fotor / Runway ML / Stable Diffusion inpainting
世界観・背景生成 → MidJourney / DALL·E 3 / SDXL
3D化して自由に着せ替え → VRoid Studio / Ready Player Me
もし希望であれば、**「自分のイラストをAIでファンタジー背景に置く具体的な手順(無料で試せる方法)」**も作れます。作りますか?
Novel AIで生成したもので有名なものに何がありますか。
ChatGPT:
NovelAIで生成された作品で特に注目を集めたものとして、以下のような例があります。
- TRPGキャラクターのビジュアル化
ユーザーが自作のTRPGキャラクターをNovelAIで生成し、そのビジュアルをSNSで公開したところ、非常に高い評価を受けました。 このような個人の創作活動が注目を集め、NovelAIの可能性を広く知らしめるきっかけとなりました。
note(ノート)- 「初音ミク」のビジュアル実験
NovelAIを使用して「初音ミク」のビジュアルを生成する実験が行われ、その結果が注目を集めました。 この実験では、プロンプトを工夫することで、同一キャラクターでも多様なビジュアルを生成できることが示され、NovelAIの柔軟性が評価されました。
YouTube
これらの例は、NovelAIが個人の創作活動やキャラクターのビジュアル化において、どれほど効果的であるかを示すものです。 特に、TRPGやオリジナルキャラクターのビジュアル化に関心がある方にとって、NovelAIは非常に有用なツールとなるでしょう。
これらの機能をオープンソースで実現したり、これらのアプリで利用しているオープンソースのライブラリには何がありますか。
ChatGPT:
NovelAIは、AIによる小説生成や画像生成を提供する有料サービスであり、商用利用を前提としています。そのため、同様の機能をオープンソースで実現することは難しいですが、以下のようなオープンソースのライブラリやツールを組み合わせることで、類似の機能を構築することが可能です。
🧠 テキスト生成(小説生成)
NovelAIは、GPT-Neo、GPT-J、Llama 3などのオープンソースの言語モデルをベースにしています。これらのモデルは、以下のようなオープンソースのライブラリを使用して構築されています。
docs.novelai.net
GPT-Neo / GPT-J: EleutherAIによって開発された大規模な言語モデルで、テキスト生成に使用されます。
Llama 3: Meta(旧Facebook)によって開発された言語モデルで、効率的なトレーニングと高い性能を特徴としています。
fairseq: Facebook AI Researchによって開発されたシーケンス・ツー・シーケンスの学習ツールキットで、モデルのトレーニングに使用されます。
Jitera Corporate Site
これらのモデルは、以下のリポジトリからアクセスできます。
EleutherAI GitHub
Meta AI GitHub
fairseq GitHub
🎨 画像生成(イラスト生成)
NovelAIの画像生成機能は、Stable Diffusionをベースにした「NovelAI Diffusion Anime」などのモデルを使用しています。Stable Diffusionは、以下のようなオープンソースのライブラリを使用して構築されています。
Medium+1
Stable Diffusion: CompVisによって開発されたテキストから画像を生成するモデルで、オープンソースとして公開されています。
ControlNet: 画像生成の際に、特定の条件(例:ポーズ、構図)を制御するための拡張モデルです。
これらのモデルは、以下のリポジトリからアクセスできます。
CompVis GitHub
ControlNet GitHub
🛠️ オープンソースでの構築方法
これらのオープンソースのライブラリを組み合わせることで、NovelAIに類似した機能を構築することが可能です。以下は、基本的な構築手順の一例です。
テキスト生成モデルのセットアップ:
GPT-NeoやGPT-Jなどのモデルを選択し、適切なフレームワーク(例:Hugging Face Transformers)を使用してセットアップします。
画像生成モデルのセットアップ:
Stable DiffusionやControlNetなどのモデルを選択し、必要な依存関係をインストールしてセットアップします。
インターフェースの構築:
ユーザーがテキストやプロンプトを入力できるWebインターフェースを構築します。FlaskやFastAPIなどのPythonのWebフレームワークを使用することが一般的です。
統合とデプロイ:
テキスト生成と画像生成の機能を統合し、ユーザーがシームレスに利用できるようにします。HerokuやAWSなどのクラウドサービスを使用してデプロイします。
🔄 既存のオープンソースツール
既にNovelAIに類似した機能を提供するオープンソースのツールも存在します。以下はその一部です。
NovelAI Diffusion V4.5: NovelAIが開発した画像生成モデルで、Animeスタイルのイラスト生成に特化しています。
RunwayML: AIモデルを簡単に使用できるプラットフォームで、画像生成や編集の機能を提供しています。
Medium
これらのツールを活用することで、独自のAIアプリケーションを開発する際の参考になるでしょう。
オープンソースでNovelAIに類似した機能を実現することは可能ですが、商用利用や大規模なサービスを構築する際には、ライセンスや性能、コストなどの要素を慎重に検討する必要があります。
Stable Diffusion の利用ソースコード例があれば教えてください。
ChatGPT:
もちろんです。ここでは、Stable Diffusion を Python で利用して画像生成する基本的なサンプルコードをいくつか紹介します。これは公式の Diffusers ライブラリ(Hugging Face)を使った方法です。
- 環境準備
Python 仮想環境を作成
python -m venv sd_env
source sd_env/bin/activate # Linux/macOS
sd_env\Scripts\activate # Windows
ライブラリインストール
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install diffusers transformers accelerate safetensors
GPUがある場合はCUDA版の PyTorch を推奨します。CPUでも動作しますが生成は遅くなります。
- 基本的なテキスト→画像生成
from diffusers import StableDiffusionPipeline
import torch
Hugging Face トークンを入力
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
パイプラインの作成
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
pipe = pipe.to("cuda") # GPUがある場合
プロンプトを指定して画像生成
prompt = "A fantasy landscape with castles and dragons, high detail, vibrant colors"
image = pipe(prompt, guidance_scale=7.5).images[0]
保存
image.save("fantasy_landscape.png")
💡ポイント
guidance_scale はテキストプロンプトにどれだけ忠実に従うかを調整するパラメータです(通常 7~8 が目安)。
プロンプトに「anime style」「cyberpunk」「realistic」などを入れるとスタイル指定ができます。
- 画像の一部を置き換える(Inpainting)
from PIL import Image
元画像とマスク画像
init_image = Image.open("input.png").convert("RGB")
mask_image = Image.open("mask.png").convert("L") # 白い部分が置き換え対象
Inpainting用パイプライン
from diffusers import StableDiffusionInpaintPipeline
pipe_inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
prompt = "Replace with a futuristic city background"
result = pipe_inpaint(prompt=prompt, image=init_image, mask_image=mask_image).images[0]
result.save("output_inpaint.png")
💡ポイント
キャラクターだけ残して背景を置き換える場合に便利です。
マスク画像の白い部分が置き換え対象、黒い部分が保持されます。
- 高度な応用(ControlNetによるポーズ制御)
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from PIL import Image
import cv2
ControlNetモデルのロード
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
エッジ画像の用意
canny_image = cv2.imread("pose_edge.png", cv2.IMREAD_GRAYSCALE)
canny_image = Image.fromarray(canny_image)
prompt = "Anime girl in fantasy armor, standing heroically"
result = pipe(prompt=prompt, image=canny_image, guidance_scale=7.5).images[0]
result.save("controlnet_output.png")
💡ポイント
ControlNetを使うと「ポーズ・輪郭・マスク」を指定して自由にキャラクターや構図を制御できます。
いわゆる「元イラストをベースに衣装や背景を変える」用途に最適です。
💡まとめ
基本生成 → StableDiffusionPipeline
部分置換(キャラ保持+背景変更) → StableDiffusionInpaintPipeline
構図・ポーズ制御 → StableDiffusionControlNetPipeline
希望であれば、**「自分のイラストを入力して、ファンタジー背景に変えるワークフロー例(Stable Diffusion + inpainting + ControlNet)」**も作って具体的に手順化できます。
作りますか?
はい。お願いします。
ChatGPT:
わかりました。では、自分のイラストを入力して、ファンタジー背景に変えるワークフローを、Stable Diffusion + Inpainting + ControlNet を使って具体的に手順化します。
自分のイラストを異世界背景に変えるワークフロー
- 準備
必要なもの
Python 3.10+ が動作するPC(GPU推奨)
元イラスト画像(キャラクターのみ、背景透明 or 単色が望ましい)
マスク画像(白い部分が置き換える箇所、黒は保持)
Hugging Face アカウントとアクセストークン
ライブラリ
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install diffusers transformers accelerate safetensors opencv-python pillow
- 元イラストとマスクの準備
キャラクターだけを残した画像を作る
PNGで背景を透明にするのがベスト
背景置換用マスクを作成
白: 置き換えたい背景
黒: キャラクターを保持する部分
例: Photoshop, GIMP, Krita, Clip Studio Paint などで簡単に作れます。
- Stable Diffusion Inpainting で背景置換
from diffusers import StableDiffusionInpaintPipeline
from PIL import Image
import torch
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
画像とマスクの読み込み
init_image = Image.open("character.png").convert("RGB")
mask_image = Image.open("mask.png").convert("L")
パイプライン作成
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
プロンプト
prompt = "Fantasy medieval castle background, dramatic lighting, high detail"
背景置換
output = pipe(prompt=prompt, image=init_image, mask_image=mask_image, guidance_scale=7.5).images[0]
output.save("output_inpaint.png")
💡ポイント
キャラクターはマスクで保護され、背景だけが生成されます。
guidance_scale は生成結果の忠実度調整(7~8が目安)です。
- ControlNet でポーズや構図を制御(任意)
もし元イラストのポーズやキャラクターの位置を正確に保持したい場合、ControlNet + Canny エッジを使います。
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from PIL import Image
import cv2
ControlNetのロード
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
Cannyエッジ画像の作成
original_image = cv2.imread("character.png")
canny_edges = cv2.Canny(original_image, 100, 200)
canny_image = Image.fromarray(canny_edges)
プロンプト
prompt = "Fantasy armor, medieval city background, dramatic lighting"
生成
result = pipe(prompt=prompt, image=canny_image, guidance_scale=7.5).images[0]
result.save("output_controlnet.png")
💡ポイント
キャラクターの輪郭を保持しつつ背景や服装のスタイルを自由に変えられます。
ControlNet はポーズや構図を完全に固定したい場合に有効。
- ワークフローまとめ
元イラストを準備(キャラクターのみ)
背景置換用マスクを作成
Stable Diffusion Inpainting で背景生成
必要に応じて ControlNet でポーズ・輪郭を保持
出力画像を保存し、さらに色調補正や小物追加なども可能
💡 アドバイス
プロンプトに細かく条件を書くほど、希望に近い生成結果が得やすいです(「ファンタジー」「中世城」「ドラマティックライティング」など)。
Inpainting で何度か繰り返すことで、キャラクター周囲のディテールをより自然にできます。
高解像度出力をしたい場合は torch_dtype=torch.float16 + GPU推奨。
希望であれば、このワークフローを 「1つのPythonスクリプトで、元イラスト→ファンタジー背景生成→ControlNetでポーズ保持まで一括処理」 できる形にまとめたサンプルも作れます。
作りますか?
あなた:
ControlNet を利用したソースコード例を教えてください。
ChatGPT:
もちろんです。ここでは Stable Diffusion + ControlNet を使って、元イラストの輪郭やポーズを保持しつつ背景や衣装を変更する 具体的な Python コード例 を示します。
- 環境準備
Python 仮想環境作成
python -m venv sd_env
source sd_env/bin/activate # Linux/macOS
sd_env\Scripts\activate # Windows
必要ライブラリインストール
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install diffusers transformers accelerate safetensors opencv-python pillow
GPUがある場合は CUDA 版の PyTorch を使うと高速化できます。
- ControlNetを使った画像生成
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from PIL import Image
import cv2
import torch
Hugging Face トークン
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
ControlNetモデルのロード(Cannyエッジを利用)
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
Stable Diffusionパイプラインに統合
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda") # GPUがある場合
元イラストを読み込んでCannyエッジを作成
original_image = cv2.imread("character.png") # 元イラスト
canny_edges = cv2.Canny(original_image, 100, 200) # エッジ抽出
canny_image = Image.fromarray(canny_edges)
プロンプト(生成したい背景や衣装のスタイル)
prompt = "Fantasy armor, standing in front of a medieval castle, dramatic lighting, high detail"
画像生成
result = pipe(prompt=prompt, image=canny_image, guidance_scale=7.5).images[0]
保存
result.save("output_controlnet.png")
- ポイント解説
ControlNetModel
「Canny」「Pose」「Depth」「Segmentation」など、元イラストの情報を保持する制御用ネットワークを指定できます。
ここでは Cannyエッジ を使い、輪郭を保持しています。
StableDiffusionControlNetPipeline
ControlNetをStable Diffusionに統合したパイプラインで、元の構図や輪郭を保持したまま、プロンプトに従って生成します。
guidance_scale
プロンプトの忠実度。数値が大きいほどテキストに沿った生成になります。
canny_image
元イラストの輪郭情報を渡すことで、キャラクターや構図を維持したまま背景や衣装を変更可能。
💡 応用例
キャラクターだけ残して背景を異世界に置き換える
元イラストのポーズや構図を維持しつつ、服装や小物を変更する
複数のControlNetモデルを組み合わせて、ポーズ + エッジ + Depth でさらに精密な制御
希望であれば、「元イラスト+マスク+ControlNetで背景・衣装を一括変更する統合スクリプト」 のサンプルも作れます。
作りますか?
あなた:
はい。お願いします。
ChatGPT:
わかりました。では、元イラスト+マスク+ControlNetで背景や衣装を一括変更する統合スクリプトのサンプルを作ります。
元イラストをファンタジー背景+衣装変更する統合スクリプト例
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, StableDiffusionInpaintPipeline
from PIL import Image
import cv2
import torch
Hugging Face トークン
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
---------- 1. パイプラインの準備 ----------
ControlNet(Cannyエッジで構図保持)
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
Stable Diffusion + ControlNet パイプライン
pipe_control = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda") # GPU使用
Inpaintingパイプライン(背景置換)
pipe_inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
---------- 2. 画像の読み込み ----------
元イラスト
init_image = Image.open("character.png").convert("RGB")
マスク画像(白: 置換部分 / 黒: キャラクター保持部分)
mask_image = Image.open("mask.png").convert("L")
ControlNet用Cannyエッジ生成
original_cv = cv2.imread("character.png")
canny_edges = cv2.Canny(original_cv, 100, 200)
canny_image = Image.fromarray(canny_edges)
---------- 3. ControlNetでポーズ保持+衣装変更 ----------
prompt_control = "Anime girl in fantasy armor, heroic pose, detailed lighting"
control_output = pipe_control(
prompt=prompt_control,
image=canny_image,
guidance_scale=7.5
).images[0]
control_output.save("output_control.png")
print("ControlNet生成完了 → output_control.png")
---------- 4. Inpaintingで背景置換 ----------
prompt_inpaint = "Epic medieval castle background, dramatic lighting, high detail"
inpaint_output = pipe_inpaint(
prompt=prompt_inpaint,
image=control_output, # ControlNet出力をベースに背景置換
mask_image=mask_image,
guidance_scale=7.5
).images[0]
inpaint_output.save("final_output.png")
print("背景置換完了 → final_output.png")
✅ このスクリプトの流れ
ControlNetでキャラクターの輪郭・ポーズを保持
元イラストをCannyエッジ化し、ポーズや構図を維持しつつ衣装や細部を変更。
Inpaintingで背景置換
マスク画像でキャラクターを保護し、背景をファンタジー世界に置き換える。
出力結果
output_control.png → ControlNetで衣装やポーズ変更
final_output.png → 背景置換済みの最終画像
💡 ポイント
guidance_scale を調整すると、プロンプトへの忠実度が変わります。
ControlNetは「輪郭保持」「ポーズ維持」に強力。Inpaintingと組み合わせると、元イラストのキャラクターをほぼそのままに、背景や衣装を自由に変えられます。
高解像度で生成したい場合は torch_dtype=torch.float16 + GPU使用が推奨。
希望であれば、次に 「より高度な制御:複数ControlNetモデルを組み合わせて輪郭+Depth+セグメンテーションを一括反映」 のサンプルも作れます。
作りますか?
あなた:
はい。お願いします。
ChatGPT:
わかりました。では、複数のControlNetモデル(輪郭+Depth+セグメンテーション)を組み合わせて、元イラストのキャラクターを保持しつつ背景や衣装を高度に変更するサンプルを作ります。
複数ControlNet統合サンプル(輪郭+Depth+セグメンテーション)
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from PIL import Image
import cv2
import torch
import numpy as np
Hugging Face トークン
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
---------- 1. ControlNetモデルの準備 ----------
Cannyエッジ(輪郭保持)
control_canny = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
Depthマップ(キャラクターの奥行き保持)
control_depth = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-depth",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
Segmentationマップ(キャラクターと背景の分離)
control_seg = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-seg",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
複数ControlNetを統合したStable Diffusionパイプライン
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=[control_canny, control_depth, control_seg],
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
---------- 2. 元イラストの準備 ----------
init_image = Image.open("character.png").convert("RGB")
Cannyエッジ生成
cv_image = cv2.imread("character.png")
canny_edges = cv2.Canny(cv_image, 100, 200)
canny_image = Image.fromarray(canny_edges)
Depthマップ生成(簡易版:OpenCVでグレースケール)
depth_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
depth_image = Image.fromarray(depth_image)
セグメンテーションマップ(簡易:単純二値化)
gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
_, seg_image = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
seg_image = Image.fromarray(seg_image)
---------- 3. プロンプト ----------
prompt = "Anime girl in fantasy armor, standing in front of a majestic castle, cinematic lighting, highly detailed"
---------- 4. 画像生成 ----------
result = pipe(
prompt=prompt,
image=[canny_image, depth_image, seg_image], # 各ControlNetに対応
guidance_scale=7.5
).images[0]
保存
result.save("output_multi_controlnet.png")
print("生成完了 → output_multi_controlnet.png")
✅ ポイント解説
複数ControlNetの活用
Canny → キャラクター輪郭保持
Depth → キャラクターやオブジェクトの奥行き保持
Segmentation → キャラクターと背景を分離して精密に制御
入力画像の対応
image パラメータに、ControlNetの順番通りの画像リストを渡す
それぞれのモデルが保持したい情報を反映する
高度な生成
キャラクターを保持したまま、衣装・背景・光源・ポーズなどをプロンプトに従って自由に変更可能
応用
元イラストのキャラクターをほぼそのまま残しつつ、背景をファンタジー世界や近未来都市に置き換える
キャラクターの衣装を変えたり、小物を追加する
💡 アドバイス
ControlNetごとに画像サイズを揃えることが重要(例:512x512)
高解像度出力は GPU + torch_dtype=torch.float16 が必須
プロンプトにスタイルや小物、光源条件を明確に書くと生成結果が安定します
もし希望であれば、次に 「元イラスト+マスク+複数ControlNetで、ワンステップで背景+衣装変更+ポーズ保持まで行う完全統合スクリプト」 も作れます。
作りますか?
あなた:
はい。お願いします。
ChatGPT:
了解です。では、元イラスト+マスク+複数ControlNetを組み合わせて、背景置換+衣装変更+ポーズ保持をワンステップで行う完全統合スクリプトを作ります。
元イラストをワンステップでファンタジー変換する統合スクリプト
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, StableDiffusionInpaintPipeline
from PIL import Image
import cv2
import torch
import numpy as np
Hugging Face トークン
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
---------- 1. 複数ControlNetの準備 ----------
control_canny = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
control_depth = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-depth",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
control_seg = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-seg",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
Stable Diffusion + 複数ControlNetパイプライン
pipe_control = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=[control_canny, control_depth, control_seg],
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
Inpaintingパイプライン(背景置換用)
pipe_inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
---------- 2. 元イラスト・マスク準備 ----------
init_image = Image.open("character.png").convert("RGB")
mask_image = Image.open("mask.png").convert("L") # 白:置換/黒:保持
ControlNet入力用画像作成
cv_image = cv2.imread("character.png")
Cannyエッジ
canny_edges = cv2.Canny(cv_image, 100, 200)
canny_image = Image.fromarray(canny_edges)
Depthマップ(グレースケール)
depth_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
depth_image = Image.fromarray(depth_image)
セグメンテーションマップ(単純二値化)
gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
_, seg_image = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
seg_image = Image.fromarray(seg_image)
---------- 3. プロンプト ----------
prompt_control = "Anime girl in fantasy armor, heroic pose, highly detailed, cinematic lighting"
prompt_inpaint = "Epic medieval castle background, dramatic lighting, highly detailed"
---------- 4. ControlNetでポーズ保持+衣装変更 ----------
control_output = pipe_control(
prompt=prompt_control,
image=[canny_image, depth_image, seg_image],
guidance_scale=7.5
).images[0]
control_output.save("output_controlnet.png")
print("ControlNet生成完了 → output_controlnet.png")
---------- 5. Inpaintingで背景置換 ----------
final_output = pipe_inpaint(
prompt=prompt_inpaint,
image=control_output,
mask_image=mask_image,
guidance_scale=7.5
).images[0]
final_output.save("final_output.png")
print("最終出力完了 → final_output.png")
✅ ワンステップ統合のポイント
複数ControlNetでキャラクターを完全保持
Canny → 輪郭
Depth → 奥行き
Segmentation → 背景とキャラクターの分離
Inpaintingで背景置換
マスク画像でキャラクターを保護し、背景だけを生成
生成フロー
元イラストをControlNetでポーズ保持+衣装変更
ControlNet出力をInpaintingに渡し、背景置換
高度な制御
プロンプトに光源、スタイル、環境設定を明確に書く
ControlNetやマスク画像を工夫することでキャラクターと背景の自然な合成が可能
💡 アドバイス
画像サイズは512×512以上を推奨
GPU + torch_dtype=torch.float16 で高速化
複雑な背景や細部を生成したい場合は、生成を複数回繰り返してマージすると自然に
このスクリプトを使えば、元イラストをほぼそのまま残しつつ、衣装変更・ポーズ保持・ファンタジー背景生成をワンステップで実現できます。
必要であれば、さらに 「生成プロセスをGUIで操作できる簡易Webアプリ化」 の例も作れます。作りますか?
あなた:
はい。お願いします。
ChatGPT:
わかりました。それでは、先ほどの統合スクリプトをベースに、簡単なWeb GUIで操作できるアプリケーションを作る例を紹介します。ここでは Python の Gradio を使います。
元イラスト+マスク+複数ControlNet+InpaintingのWeb GUIサンプル
import gradio as gr
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, StableDiffusionInpaintPipeline
from PIL import Image
import cv2
import torch
import numpy as np
Hugging Face トークン
HUGGINGFACE_TOKEN = "hf_xxxxxxx"
---------- 1. ControlNet + Inpainting パイプライン準備 ----------
control_canny = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
control_depth = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-depth",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
control_seg = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-seg",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
)
pipe_control = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=[control_canny, control_depth, control_seg],
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
pipe_inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
use_auth_token=HUGGINGFACE_TOKEN
).to("cuda")
---------- 2. 生成関数 ----------
def generate_image(character_img, mask_img, prompt_character, prompt_background):
# 画像をRGBに変換
init_image = character_img.convert("RGB")
mask_image = mask_img.convert("L")
# ControlNet入力用画像作成
cv_image = np.array(init_image)
# Cannyエッジ
canny_edges = cv2.Canny(cv_image, 100, 200)
canny_image = Image.fromarray(canny_edges)
# Depthマップ
depth_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
depth_image = Image.fromarray(depth_image)
# セグメンテーションマップ(簡易二値化)
gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
_, seg_image = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
seg_image = Image.fromarray(seg_image)
# ---------- ControlNetでキャラクター保持+衣装変更 ----------
control_output = pipe_control(
prompt=prompt_character,
image=[canny_image, depth_image, seg_image],
guidance_scale=7.5
).images[0]
# ---------- Inpaintingで背景置換 ----------
final_output = pipe_inpaint(
prompt=prompt_background,
image=control_output,
mask_image=mask_image,
guidance_scale=7.5
).images[0]
return final_output
---------- 3. Gradio GUI ----------
iface = gr.Interface(
fn=generate_image,
inputs=[
gr.Image(type="pil", label="Character Image"),
gr.Image(type="pil", label="Mask Image"),
gr.Textbox(lines=2, label="Character Prompt", placeholder="例: Anime girl in fantasy armor, heroic pose"),
gr.Textbox(lines=2, label="Background Prompt", placeholder="例: Epic medieval castle, dramatic lighting")
],
outputs=gr.Image(type="pil", label="Generated Image"),
title="AI Character + Fantasy Background Generator",
description="元イラストを保持しつつ衣装変更・ポーズ保持・背景置換を行うWebアプリ"
)
iface.launch()
✅ このGUIの特徴
Character Image: 元イラストをアップロード
Mask Image: 背景置換用マスクをアップロード
Character Prompt: キャラクターの衣装・表情・ポーズ変更の指示
Background Prompt: 背景の生成指示
出力: キャラクター保持+背景置換済みの最終画像を表示
💡 ポイント
Gradio はローカル環境でも簡単にWeb GUIを立ち上げられます
GPUがある場合は .to("cuda") のままで高速生成
高解像度生成や複雑な背景は、数回繰り返すと自然な結果になります
ControlNet+Inpainting の組み合わせで、元イラストのキャラクターをほぼそのまま残しながら自由に背景や衣装を変えられます
このスクリプトを実行すると、ブラウザ上で簡単に元イラストをアップロードして、衣装や背景を自由に変更できる ワンステップGUIアプリ が利用可能になります。
希望であれば、さらに 「キャラクターと背景を別々に生成 → マージして高解像度出力する改善版」 も作れます。
作りますか?