「いい絵は出るけど、思い通りのポーズにならない」——画像生成AIの最大の不満を解消するのがControlNetです。棒人間やラフ画から構図を指定する仕組みを解説します。
ControlNetとは?画像生成AIの構図・ポーズを自在に制御する技術

AIを知りたい
先生、Stable Diffusionで狙った構図の画像を作りたいんですが、プロンプトだけだとなかなか思い通りにならないんです。

AIエンジニア
それならControlNetを使うといいよ。ControlNetは、生成する画像の構図やポーズ、輪郭などを参照画像で指定できる技術なんだ。例えば、人のポーズを棒人間の図で指定したり、部屋のレイアウトを線画で指定したりすると、その条件に合った画像が生成されるよ。

AIを知りたい
棒人間で指定できるのは面白いですね!他にどんな条件を指定できますか?

AIエンジニア
いくつかのプリプロセッサがあって、Cannyエッジ検出で輪郭線を指定、OpenPoseで人体のポーズを指定、Depth推定で奥行き情報を指定、Scribble(落書き)で大まかなラフ画を指定、といった使い方ができるよ。プロのイラストレーターも構図の制御にControlNetを活用しているんだ。
ControlNetとは。
人工知能に関わる言葉である「ControlNet」について説明します。Stable Diffusionなどの画像生成AIに対して、参照画像(エッジ検出、ポーズ、深度マップなど)を条件として与えることで、生成画像の構図やポーズを精密に制御する技術です。2023年にスタンフォード大学の研究者により提案されました。
ControlNetとは
ControlNetは、2023年にスタンフォード大学のLvmin Zhangらが発表した、画像生成AIの出力を条件画像で制御する技術です。テキストプロンプトだけでは困難だった構図、ポーズ、レイアウトの精密な指定を可能にし、画像生成AIの実用性を飛躍的に向上させました。
ControlNetの仕組みは、U-Netのエンコーダ部分のコピーを作成し、条件画像を処理するブランチとして追加するものです。元のU-Netの重みは凍結され、追加されたブランチのみが学習されるため、ベースモデルの品質を損なうことなく条件制御を追加できます。
主要なプリプロセッサ
| プリプロセッサ | 入力 | 制御内容 | 用途 |
|---|---|---|---|
| Canny | エッジ検出画像 | 輪郭・形状 | キャラクターの形状維持 |
| OpenPose | 人体ポーズ推定 | 体のポーズ | 特定ポーズの人物生成 |
| Depth | 深度マップ | 奥行き・立体感 | 構図・パース維持 |
| Scribble | ラフスケッチ | 大まかな構図 | ラフ画からの清書 |
| Lineart | 線画抽出 | 細かい輪郭 | 線画の着色 |
| Seg | セグメンテーション | 領域分割 | インテリアデザイン |
| IP-Adapter | 参照画像 | スタイル・顔 | キャラクター一貫性 |
実践的な活用方法
ControlNetは、プロの制作ワークフローでも広く活用されています。イラストレーターは3Dポーズソフトでポーズを決め、OpenPoseで画像生成することで、正確なポーズのキャラクターを効率的に制作できます。建築デザインでは、Depthマップで空間の奥行きを指定し、スタイルだけを変更して複数のデザイン案を素早く生成できます。
複数のControlNetを組み合わせて使用することも可能です。例えば、OpenPoseでポーズを指定しつつ、Cannyで顔の輪郭を維持するという組み合わせで、より精密な制御が実現できます。
まとめ
ControlNetは、画像生成AIを「使えるツール」に変えた革新的な技術です。テキストプロンプトの限界を超え、構図・ポーズ・レイアウトを参照画像で直接指定できるため、意図した画像を高い精度で生成可能になります。Stable Diffusionを本格的に活用するなら、ControlNetの習得は必須です。
関連記事
- Stable Diffusionとは?画像生成AIの仕組みとローカル環境構築
- 拡散モデル(Diffusion Model)とは?画像生成AIの核心技術を解説
- 画像生成AIの比較:Stable Diffusion vs Midjourney vs DALL-E
diffusersでControlNetパイプラインを構築する
Hugging Faceのdiffusersライブラリを使って、Canny Edge(輪郭線)で構図を制御するControlNetパイプラインの構築手順を解説します。
import torch
from PIL import Image
import numpy as np
from diffusers import (
StableDiffusionControlNetPipeline,
ControlNetModel,
UniPCMultistepScheduler,
)
from diffusers.utils import load_image
# 1. 制御画像の準備(Canny Edge検出)
import cv2
source_image = load_image("https://example.com/input.png")
image_array = np.array(source_image)
# Cannyエッジ検出で輪郭線を抽出
low_threshold = 100
high_threshold = 200
canny_image = cv2.Canny(image_array, low_threshold, high_threshold)
# diffusersはPIL形式を期待するので変換
canny_image = Image.fromarray(canny_image).convert("RGB")
# 2. ControlNetモデルとパイプラインの構築
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16,
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16,
)
# 高速スケジューラに差し替え(生成速度が約2倍に向上)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# GPUメモリ節約(8GB VRAM環境向け)
pipe.enable_model_cpu_offload()
# 3. 画像生成
prompt = "a futuristic cityscape, highly detailed, 4k"
negative_prompt = "blurry, low quality, distorted"
result = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=canny_image, # 制御画像
num_inference_steps=30, # 推論ステップ数
controlnet_conditioning_scale=0.8, # ControlNetの影響度(0.0-1.0)
guidance_scale=7.5, # プロンプトへの忠実度
generator=torch.manual_seed(42),
).images[0]
result.save("controlnet_output.png")
print("生成完了: controlnet_output.png")
このコードの構造は3段階です。(1)入力画像からCannyエッジで輪郭線を抽出、(2)ControlNetモデルとStable Diffusionパイプラインを結合、(3)プロンプトと制御画像を渡して生成。controlnet_conditioning_scaleを0.8程度にすると構図を維持しつつ自然な画像になり、1.0に近づけると輪郭線に厳密に従うようになります。Canny以外にもOpenPoseやDepthなど多様な制御方式のControlNetモデルが公開されています。
