画像編集の忠実性と解剖学(任意のモデル)
これらのルールはすべての画像モデルに適用されます。結果が満たすべき条件とその確認方法を定義します。モデル固有のスキル(qwen-image-2、storyboard-keyframes、実行用のfal-runner)は、エンドポイント、パラメータ、制限、プロンプトスタイルを提供します。モデル固有のスキルが存在する場合は、そのパラメータとこれらの忠実性ルールの両方に従います。編集手順の準備ができているものは references/edit-patterns.md にあります。
特定のモデルに対するルールの表現方法:
- ネガティブプロンプトフィールドがある場合(Qwen、Seedream、Stable Diffusion、Kling):§1と§2の解剖学と忠実性のリストをそこに配置します。
- ネガティブプロンプトフィールドがない場合(GPT Image、Nano Banana / Gemini、Flux Kontext、およびほとんどの指示編集モデル):プロンプト内に肯定文として記述します(「各人物は頭1つ、両腕、両脚を持つ」、「部屋、家具、オブジェクトはそのまま維持する」)。最後に短い除外文を1つ追加します(「人物やオブジェクトを追加または削除しないでください」)。長い「Xをしない、Yをしない」リストをプロンプトに貼り付けないでください。多くのモデルが列挙されたオブジェクトを描画してしまいます。
- プロンプト書き換え(Qwen
enable_prompt_expansion、Model Studioprompt_extend、「マジックプロンプト」オプション):編集時はオフにします。書き換え機能は参照画像にない小道具やスタイルを追加します。 - 出力サイズを決定する入力はモデルによって異なります(Qwen:最後の画像、その他:最初の画像、または明示的なサイズフィールド)。スキーマを確認し、出力がベース参照画像のアスペクト比とサイズになるようにします。
- 長さ制限はモデルによって異なります(Qwen fal 編集は800文字)。KEEP節が収まらない場合は、最もドリフトしやすい項目を優先します(§2 ステップ2)。
1. 人体解剖学:常に完全であること
すべての出力におけるすべての人物は、標準的な人体解剖学構造を持ちます:正確に頭1つ、両目、鼻1つ、口1つ、両耳、首1つ、肩に付いた両腕、各5本の指を持つ両手、腰に付いた両脚、両足。余分な、または欠損した頭、手足、手、指がないこと。背中、胸、腹、または他の人物から生えている手足がないこと。融合した身体がないこと。関節が逆方向に曲がっていないこと。これはテキストから画像への生成と編集の両方、背景の人物、そして(ユーザーが明示的に人間以外の生き物を要求しない限り)スタライズされた画像(漫画、コミック、絵画)にも適用されます。身体が壊れた画像は、他の部分がどれだけ良くても欠陥です。
なぜ壊れるのか:拡散モデルは、身体が重なる場合(抱き合う、手をつなぐ、群衆、子供を抱える人)、手が小さいまたは隠れている場合、複雑なポーズの場合に、どの手足が誰のものかを見失います。プロンプトで防止し、チェックで発見します。
- プロンプト。各人物について、両腕と両手の位置と動作を記述します(「彼女の右手は胸の高さでカップを持ち、彼女の左腕はリラックスして体の横に垂れている」)。脚の位置についても記述します(「立っており、体重は左脚にかかっている」、「足を組んで座っている」)。複数の人物がいる場合は人数を明記します(「正確に3人、それぞれ頭1つ、両腕、両脚を持つ」)。スタイル文に自然な解剖学を書き込みます:「解剖学的に正しい人体、自然なプロポーション」。接触箇所を正確に記述します:誰の手が誰の肩に置かれているか。
- 身体を読みやすく保つ構図。両手が見えるか、明確に隠れている(ポケットの中、背中の後ろ、フレームの外)ポーズを優先します。腕が絡み合う状態、人が真後ろに立つ状態、フレームによって手足が曖昧に切られる状態を避けます。人数が増えると身体は小さくなりエラーも増えます:要求が許す限り人数を少なく保ちます。群衆の中では背景の人物を小さく、シンプルにし、明確なオブジェクトで部分的に隠します。
- 解剖学除外リスト(ネガティブプロンプト、またはネガティブフィールドがない場合は肯定文1つ):
余分な手足、余分な腕、余分な脚、余分な手、余分な指、欠損した指、二つの頭、余分な頭、余分な目、融合した身体、胴体から生えた手足、変形した手、奇形の解剖学。 - 編集。ポーズ、衣服の変更、人物の追加は、身体部位を追加または喪失させてはいけません:KEEP節(§2)に「同じ解剖学:各人物に頭1つ、両腕、両脚」を含めます。ポーズ編集は最もリスクの高い編集です。編集した人物だけでなく、フレーム内のすべての人物をチェックします。
- 表示前にすべての人物をチェック(各身体をトリミングしてフルサイズに拡大。小さな背景の人物も含む):頭、目、腕、手、脚、足の数を数えます。見えているすべての手の指の数を数えます。各手足を肩または腰までトレースし、正しい身体に属していることを確認します。背中、胸、首から生えた手足、融合した手、2人の間にある3本目の脚、ねじれた関節を探します。チェックノートに人数ごとのカウントを記録します(「P1:頭1、腕2、手2 5+5、脚2:OK」)。
- 修正。小さな手や指のエラー:その手の周囲をトリミングした領域で編集パスを実行します(「左手を修正:指5本、自然なポーズ、カップを持っている」)。その後、トリミング領域を貼り戻します(
ref_diff.py --paste-back)。余分な、または欠損した手足や頭:よりシンプルなポーズ、重なりの少なさ、ステップ1の手足の記述を含めて再生成します。決して身体が壊れた画像を完成結果として表示しないでください。ユーザーがそれでもドラフトを希望する場合は、欠陥を明示します。
2. 参照画像への忠実性:要求されたものだけを変更する
ユーザーが参照画像を添付する場合、その参照画像が正解であり、リクエストはその上への最小限の差分です。ユーザーが変更を依頼しなかったすべてのものはそのまま維持されます:人数と誰であるか、ポーズと位置、衣服、部屋や通り、家具と周囲のオブジェクト、その数と位置、フレーミングとカメラアングル、光の方向と色、スタイルとテクスチャ、テキスト。「見た目は良い」が人物を追加したり、椅子を動かしたり、窓を変更した編集は失敗です。ほとんどのモデルはフレーム全体を再レンダリングし、自由に「改善」できるため、忠実性は明示的に要求し、その後確認する必要があります。
- 何かを書く前に参照画像をインベントリする。フルサイズで(小さな領域はトリミングして)見て、プロジェクトフォルダに
reference_inventory.mdを作成します:- フレーミング:ショットサイズ、カメラの高さと角度、各フレーム端に接するもの、アスペクト比、ピクセル数
- 人物:正確な人数。各人物について、フレーム内の位置(左/中央/右、前景または背景)、ポーズ、視線、手、頭から靴までの服装、髪、年齢、何を持っているか
- 設定:部屋または場所、壁、窓、ドア、床、位置付きの家具
- オブジェクト:見えるすべてのアイテムについて、数、色、どこにあるか(「カップ」ではなく「テーブルの上の3つのカップ」)
- 照明:光源の方向、硬さ、色温度、影、時間帯
- スタイル:写真かイラストか、粒状感、色調補正、被写界深度
- テキストとロゴ、逐語的に
その後、これらを2つのリストに分割します:
CHANGE(ユーザーが要求したもののみ)とKEEP(残りのすべて)。リクエストの範囲が曖昧な場合(「もっと居心地良く」:家具?照明?両方?)、モデルに判断させる前にユーザーに確認します。
- 編集プロンプトを「変更」+「維持」として記述する。最初の文:要求された変更、具体的かつ局所的に(何を、どこで、どのくらいの大きさで、フレームのどの側か)。次に、
KEEPから構築した維持節。「その他すべて」ではなく具体的な項目を列挙します:「正確に2人の人物を維持:左側のグレーのセーターの男性と右側の青いドレスの女性、同じ顔、ポーズ、位置。白いカップが3つある木製のテーブル、左側の窓、右側の本棚、窓からの暖かい光、フレーミングとカメラアングルを変更せずに維持する。人物やオブジェクトを追加または削除しない。」長さ制限がある場合は、最もドリフトしやすい項目を優先します:人数とアイデンティティ、編集領域の近くのオブジェクト、背景の建築物、フレーミング。変更のみを詳細に記述します。シーン全体を新しい言葉で再記述しないでください。モデルが再描画する原因になります。 - 参照画像を保護する設定:
- プロンプト書き換えオフ
- 出力サイズ = 参照画像のアスペクト比とサイズ。異なるアスペクト比はモデルにコンテンツを invent またはトリミングさせます
- 出力サイズを設定する位置にベース参照画像を配置し、プロンプト内でその番号で呼び出す。変更に必要な参照画像のみを添付します。余分な画像はドリフトの原因になります
- モデルが提供する場合、マスクまたはインペインティングモード:変更する領域のみをマスク
- 忠実性除外リスト:
余分な人物、欠損した人物、異なる人物、変更された背景、追加されたオブジェクト、削除されたオブジェクト、異なるフレーミング、異なる照明、および§1の解剖学リスト - ドラフト用の安価なティア。指示が定着するまで1回の呼び出しで1出力、その後2〜3出力
- 参照画像と照らし合わせてチェックし、単独ではチェックしない。
python3 ~/.claude/skills/image-edit-fidelity/scripts/ref_diff.py <参照画像> <出力> --allow x0,y0,x1,y1(変更が行われるべきであった領域のボックス、参照画像のピクセル単位)を実行します。このスクリプトは、そのボックスの外側でグリッドセルごとにどれだけ変更があったかを報告し、比較画像とヒートマップを書き出します。次に、reference_inventory.mdを行ごとに出力と照らし合わせます:人数とアイデンティティ、各オブジェクトとその位置、背景、照明、フレーミング、テキスト。変更されたKEEP項目は、たとえ小さなものでも欠陥です。 - フレーム全体を再生成する代わりに修復する。変更は正しいが他の部分がドリフトした場合、変更された領域のみを元の画像に貼り戻します:
ref_diff.py <参照画像> <出力> --allow <ボックス> --paste-back final.png(フェザリングエッジ、フレームの残りの部分は参照画像からピクセル単位で取得)。変更自体が間違っている場合は、CHANGE文を明確にし、ドリフトした項目を名前でKEEPに追加します。再試行ごとに1つのことだけを変更します。 - 報告。ユーザーに何が変更され、何が維持されたと確認されたかを報告します。許容された逸脱があればそれを明示します。
3. ある参照画像から別の参照画像への部分転送
ユーザーがソース参照画像から1つの要素(ジャケット、ランプ、顔、ロゴ、空)を取り出し、ターゲット参照画像に配置するよう依頼した場合、正確に2つのことが起こります:指定された要素がソースからコピーされ、ターゲット内の指定された場所がそれで置き換えられます。それ以外はどちらの方向にも移動しません:
- ソースからは、指定された要素のみを取得します:その背景、他の人物やオブジェクト、色、照明、スタイル、フレーミングは取得しません
- ターゲットでは、指定された場所のみを変更します:人物、その数、顔、ポーズ、衣服、オブジェクト、設定、照明、フレーミング、テキストはターゲットのまま(ターゲットのインベントリから §2 の KEEP リストを構築)
- 「適合させるため」に何かを追加しないでください(存在しないオブジェクトの影、新しい人物など)。許容される唯一の適応は、要素自体がターゲットの視点、スケール、光を取り、置き換えられた場所に自然に収まることです。
方法:
- ターゲットをインベントリし(§2)、ソース内の要素を正確に記述します(何か、色、素材、形状、生き残らなければならない詳細:ボタン、プリント、ロゴ)。
- アップロードする前に、ソースを要素の周りでタイトにトリミングします(モデルの最小辺を尊重、Qwenの場合は384ピクセル)。モデルがそこから借りるものが他にないようにします。出力サイズを設定する位置にターゲットを配置します。
- プロンプト構造:「画像1から[主要な特徴を持つ要素]のみを取得してください。画像2で、[正確な場所:誰の、どの側、どのオブジェクト]をそれで置き換え、画像2の遠近法、スケール、照明に合わせてください。画像1からは、その背景、人物、色、照明など、何も取得しないでください。画像2の他のすべてはそのまま維持します:[ターゲットインベントリからのKEEP項目、人数、顔、ポーズ、オブジェクト、設定、フレーミング]。人物やオブジェクトを追加または削除しないでください。」モデルが先にベースを必要とする場合は画像番号を入れ替えます。
ref_diff.py <ターゲット> <出力> --allow <置き換えられた場所のボックス>でチェック:ボックス外の変更は欠陥です。--paste-backで修復します。転送された要素をソースのトリミングと比較します:形状、色、プリント、詳細が一致する必要があります。
ヘッドスワップ
画像1の人物の頭を画像2の人物に置き換えることは、このルールの最も厳格なケースです。ターゲット人物では頭のみが置き換えられます:顔、顔の特徴、顔の皮膚、髪、耳は画像1から来ます。頭の角度、傾き、視線の方向、スケール、シーンの光はターゲットに従い、頭が既存の首の上に収まるようにします。ターゲット人物の他のすべては画像2のままです:体、体格、首と肩、衣服、ポーズ、手、頭より下のアクセサリー。他の人物は自分の頭と他のすべてを維持します。設定、オブジェクト、フレーミングは変更されません。画像1からは、頭(その衣服、体、背景、他の人物)以外は出力に現れません。
- 呼び出しの前に、あいまいな部分についてのみユーザーと確認します:頭飾り(帽子、ヘッドフォン?)、メガネ、ヘアスタイルの大きく異なる長さ。それらが明らかな場合(例えばどちらも眼鏡をかけている、またはどちらも帽子をかぶっていない)、尋ねずに進めて構いません。ソースの頭がカットされていたりトリミングが粗い場合、
ref_diff.pyの貼り戻し修復のために、首の上の自然な位置を--allowボックスに含めます。