ControlNetとは?画像生成AIの構図・ポーズ制御テクニック

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

ControlNetとは?画像生成AIの構図・ポーズを自在に制御する技術

AI初心者

AIを知りたい

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

AIエンジニア

AIエンジニア

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

AI初心者

AIを知りたい

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

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の習得は必須です。

関連記事

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モデルが公開されています。