パイプライン: データ → 最終画像

ControlNet + LoRA で 1 枚の画像が生成されるまでの、データと処理の流れ

このページの目的

「生成の流れ」は LoRA を 学習するまでの流れを説明しています。このページは、学習済み LoRA を使って 1 枚の画像を生成する ときに、入力データがどの順番でどのモデル・どの重みを通って最終出力になるかをまとめます。

前提: LoRA hacorenove style interiorostris/flux-dev-lora-trainer で学習済み(170枚の学習画像、詳細は 生成の流れ 参照)。これを xlabs-ai/flux-dev-controlnet 側で参照して、各推論で読み込んでいます。

入力データ(このパイプラインに入ってくるもの)

データ保存場所役割
元画像 before_images/*.jpg 10枚(リポジトリ内) ControlNet の control_image として渡す。間取り・窓位置をここから引き継ぐ
プロンプト prompts.json 先頭 3 件を使用 テキスト条件。negative_prompt も別途固定値を使用(窓・間取り変更を抑止)
LoRA 重み (.tar) Replicate に保管 (replicate.delivery/...) 学習で得た hacorenove スタイル。nonowarn/hacorenove-lora:<version> から trainings API で URL 解決
ベースモデル FLUX.1-dev Replicate サーバ内蔵 拡散モデル本体。ControlNet と LoRA はこれに後付けされる
ControlNet 重み (depth/canny/soft_edge v3) Replicate サーバ内蔵 (XLabs) control_type で選択される構造抽出&条件付けモデル

推論ステップ

1入力をまとめる(クライアント側)
scripts/generate_controlnet.py がローカルで以下を組み立てて Replicate に POST する:
  • 元画像を base64 data URI に変換 → control_image
  • LoRA URL を trainings.list() から解決 → lora_url
  • 選択された control_type / control_strength / image_to_image_strength / lora_strength / prompt

このステップで使うもの

  • before_images/*.jpg
  • prompts.json
  • LoRA URL (.tar)
2ControlNet 前処理(Replicate 側)
control_imagecontrol_type に応じて構造マップに変換する。
  • depth: DepthAnything で深度マップを推定(壁・天井・家具の前後関係)
  • canny: Canny エッジ検出(線で構造を取る)
  • soft_edge: HED で柔らかいエッジ
return_preprocessed_image=true で、この中間マップが追加出力される(ギャラリー右列の preprocess 画像)。

効くパラメータ

  • control_type 振る
  • depth_preprocessor 固定: DepthAnything
3初期ノイズ生成(img2img 混合)
完全ランダムノイズではなく、元画像を一部ノイズで隠した状態から拡散を始める(img2img 方式)。
  • image_to_image_strength = 0 なら完全ノイズから生成(元画像のテクスチャ無視、構造は ControlNet で別途固定)
  • 値が大きくなるほど元画像のテクスチャが残りやすい

効くパラメータ

  • image_to_image_strength 振る
4拡散ループ(FLUX.1-dev + ControlNet + LoRA)
steps 回(既定 28 回)、以下を繰り返してノイズを画像に近づける:
  • FLUX.1-dev がベースの denoising を行う
  • LoRA 重みがアテンション層に加算される(lora_strength でスケール)
  • ControlNet が step 2 で作った構造マップを control_strength の強さで条件付けする
  • テキスト側は promptnegative_promptguidance_scale 倍で対比させる(Classifier-Free Guidance)

効くパラメータ

  • control_strength 振る
  • lora_strength 振る
  • prompt 振る
  • negative_prompt 固定
  • guidance_scale 固定: 3.5
  • steps 固定: 28
5出力 → ローカル保存 → ギャラリー
Replicate から .webp URL が返り、scripts/generate_controlnet.py がローカルに保存する:
  • 生成画像: output/generated_controlnet/result_{ts}_{idx}.webp
  • preprocess 画像: result_{ts}_{idx}_preprocessed.webp
  • パラメータ記録: log_{ts}.json
make buildbuild.php が log を読み、 controlnet.html に並べる。

後段

  • build.php
  • dist/controlnet.html

パラメータ早見表

このリポジトリで OAT スイープしている軸と、固定している値の一覧。比較ページは ControlNet比較

パラメータ 効く工程 値域 / 既定 このプロジェクトでの扱い
control_strength Step 4 (拡散ループの ControlNet 条件) 0〜3 / 推奨 0.5〜0.75 振る 0.5 / 0.6 / 0.75
image_to_image_strength Step 3 (初期ノイズ) 0〜1 / 推奨 0〜0.25 振る 0.0 / 0.15 / 0.25
lora_strength Step 4 (LoRA 重みスケール) -1〜3 / 既定 1 振る 0.6 / 0.8 / 1.0
control_type Step 2 (前処理) + Step 4 (条件モデル) depth / canny / soft_edge 振る depth / canny / soft_edge
prompt Step 4 (テキスト条件) 任意 振る prompts.json の先頭 3 件
negative_prompt Step 4 (テキスト条件 / CFG 逆側) 任意 固定 窓・間取り変更抑止系
guidance_scale Step 4 (Classifier-Free Guidance) 1〜10 / 既定 3.5 固定 3.5(generate_lora.py と同値)
steps Step 4 (拡散ステップ数) 1〜50 / 既定 28 固定 28(generate_lora.py と同値)
depth_preprocessor Step 2 (depth 抽出器) DepthAnything / Midas … 固定 DepthAnything

参考リンク