坐標(biāo)錨定法根治方向失控)
最近大半年我?guī)缀趺刻於家鷪D像生成模型打交道被問(wèn)得最多的問(wèn)題里“左右不分”絕對(duì)排得上號(hào)。你明明寫(xiě)了一句“貓?jiān)谧筮吂吩谟疫叀背龅膱D十有八九是貓狗換邊寫(xiě)“人物面朝左側(cè)”他能給你整出五張朝左五張朝右更別提字母鏡像、時(shí)鐘指針轉(zhuǎn)反這些老問(wèn)題了。我自己剛開(kāi)始用Stable Diffusion時(shí)也踩過(guò)這個(gè)坑后來(lái)慢慢琢磨出一套解決思路名字我管它叫“絕對(duì)坐標(biāo)錨定法”原理上借的是伽利略相對(duì)運(yùn)動(dòng)的直覺(jué)。這篇就把從原理到落地的完整過(guò)程寫(xiě)下來(lái)不解決所有出圖問(wèn)題專(zhuān)門(mén)治“左右不分”。適合正在被方向穩(wěn)定性折磨的AI繪畫(huà)玩家也適合想搞清楚模型為什么方向感差的工程師。1. 先搞清楚圖像生成模型為什么連“左右”都拿不準(zhǔn)1.1 翻車(chē)現(xiàn)場(chǎng)方向在每次出圖里都在“隨機(jī)游走”先看幾個(gè)我實(shí)測(cè)過(guò)的真實(shí)翻車(chē)案例。第一個(gè)提示詞寫(xiě)的是“a lion on the left, an elephant on the right”同一句詞跑十張大概六張是獅子在右、大象在左剩下四張才對(duì)。第二個(gè)“a portrait of a woman facing right”出圖里經(jīng)常出現(xiàn)臉朝右但身體扭向左的詭異姿態(tài)或者五官雖然朝右可鎖骨、耳環(huán)這些細(xì)節(jié)卻是鏡像后的反方向。第三個(gè)更典型生成“a clock showing 3 oclock”指針經(jīng)常指到9點(diǎn)方向整個(gè)表盤(pán)像被翻了一面。這種問(wèn)題最折磨人的地方在于它不穩(wěn)定。同一個(gè)seed、同一套參數(shù)可能這次方向是對(duì)的改一下采樣步數(shù)或者換一個(gè)CFG Scale方向直接反了。給人的感覺(jué)就是模型對(duì)“左右”根本沒(méi)有概念只是偶爾蒙對(duì)罷了。我剛開(kāi)始以為是提示詞寫(xiě)得太模糊后來(lái)把“l(fā)eft”“right”換成“on the left side of the image”“facing to the right”這種更明確的說(shuō)法情況有改善但離“穩(wěn)定可控”還是差得遠(yuǎn)。真正讓我意識(shí)到這不是提示詞問(wèn)題的是看到了一組對(duì)照實(shí)驗(yàn)用完全相同的提示詞把ControlNet的線條圖從“貓?jiān)谧蟆备某伞柏堅(jiān)谟摇背鰣D結(jié)果立刻跟著變。這說(shuō)明模型其實(shí)有理解空間布局的能力只是平時(shí)沒(méi)有東西幫它把方向釘死。那問(wèn)題就變成了為什么模型自己做不到穩(wěn)定錨定方向1.2 三個(gè)根源網(wǎng)絡(luò)結(jié)構(gòu)、文本編碼與數(shù)據(jù)增強(qiáng)第一個(gè)根源在網(wǎng)絡(luò)結(jié)構(gòu)。擴(kuò)散模型的U-Net依賴(lài)卷積層提取特征卷積天然具有平移等變性意思是把一個(gè)圖案在不同位置重放卷積給出的響應(yīng)模式基本不變只是位置跟著平移。這種性質(zhì)對(duì)“識(shí)別物體”是好事但對(duì)“記住物體在哪”是壞事。因?yàn)槟P蛷念^到尾沒(méi)有一個(gè)顯式的機(jī)制告訴你“這個(gè)物體在坐標(biāo)軸的正方向”它只是把特征圖里的位置信息一路傳遞下去。再加上初始噪聲是各向同性的沒(méi)有方向偏好模型每一步去噪都像在走迷宮沒(méi)有外部坐標(biāo)就只能靠統(tǒng)計(jì)概率猜。第二個(gè)根源在文本編碼。Stable Diffusion用的CLIP文本編碼器學(xué)的是單詞之間的語(yǔ)義關(guān)聯(lián)不是圖像坐標(biāo)系里的方位關(guān)系。在CLIP的語(yǔ)義空間里“l(fā)eft”和“right”這兩個(gè)詞出現(xiàn)的上下文高度重疊它們對(duì)應(yīng)的特征向量非常接近。很多時(shí)候模型確實(shí)選中了“l(fā)eft”這個(gè)token但cross-attention把它映射到圖像空間時(shí)能影響的只是一個(gè)模糊的區(qū)域傾向根本不足以打破噪聲里的對(duì)稱(chēng)性。更麻煩的是如果prompt里還有“hand”“eye”這種本身就帶左右屬性的詞模型還會(huì)把手、眼的左右關(guān)系疊加進(jìn)去結(jié)果就是位置對(duì)了但肢體細(xì)節(jié)反了。第三個(gè)根源是數(shù)據(jù)增強(qiáng)這一條我認(rèn)為是“左右不分”的頭號(hào)元兇。訓(xùn)練圖像生成模型時(shí)幾乎所有人都會(huì)做隨機(jī)水平翻轉(zhuǎn)RandomHorizontalFlip概率通常設(shè)0.5。這個(gè)操作的本意是擴(kuò)大數(shù)據(jù)多樣性但它同時(shí)悄悄告訴模型一張圖翻過(guò)來(lái)和沒(méi)翻是等價(jià)的。數(shù)據(jù)集里“面朝左的人”和“面朝右的人”被強(qiáng)行混在一起模型學(xué)到的分布就變成了左右對(duì)稱(chēng)的分布。于是生成時(shí)它無(wú)所謂朝哪邊因?yàn)閮蛇呍趽p失函數(shù)里的期望是一樣的。垂直翻轉(zhuǎn)沒(méi)人用因?yàn)椴蛔匀凰阅P蛯?duì)“上下”的把握相對(duì)好一些這也從側(cè)面印證了數(shù)據(jù)增強(qiáng)是主犯之一。還有一點(diǎn)容易被忽略模型的評(píng)估指標(biāo)也不懲罰左右錯(cuò)誤。常見(jiàn)的是FID、CLIP Score這類(lèi)全局相似度指標(biāo)圖像翻轉(zhuǎn)后語(yǔ)義內(nèi)容基本不變這些指標(biāo)幾乎不降。等于說(shuō)訓(xùn)練和評(píng)測(cè)兩頭都沒(méi)有強(qiáng)約束模型自然沒(méi)有動(dòng)力去學(xué)方向。2. 伽利略相對(duì)運(yùn)動(dòng)給AI的啟發(fā)沒(méi)有參照系就沒(méi)有方向2.1 伽利略的封閉船艙你感覺(jué)不到自己在動(dòng)伽利略在1632年的《關(guān)于托勒密和哥白尼兩大世界體系的對(duì)話》里提出過(guò)一個(gè)經(jīng)典思想實(shí)驗(yàn)?zāi)阍谝凰覄蛩僦本€行駛的大船船艙里窗簾拉上看不到外面。這時(shí)你觀察水滴下落、蝴蝶飛行、魚(yú)兒游動(dòng)會(huì)發(fā)現(xiàn)它們的運(yùn)動(dòng)和船靜止時(shí)完全一樣。任何力學(xué)實(shí)驗(yàn)都無(wú)法讓你判斷船到底在不在動(dòng)。這個(gè)思想實(shí)驗(yàn)說(shuō)明的是運(yùn)動(dòng)本身是相對(duì)的。只有在兩個(gè)參考系之間才能比較運(yùn)動(dòng)單獨(dú)在一個(gè)慣性系內(nèi)部你永遠(yuǎn)無(wú)法定義“絕對(duì)運(yùn)動(dòng)”。把這句話翻譯到圖像生成模型上你會(huì)發(fā)現(xiàn)驚人的相似。模型在生成圖像時(shí)它的內(nèi)部沒(méi)有一個(gè)“畫(huà)面坐標(biāo)系”的概念所有對(duì)象之間的相對(duì)位置它可能能學(xué)到但“誰(shuí)在畫(huà)面左邊、誰(shuí)在右邊”這種需要外部參照的絕對(duì)方位它沒(méi)有穩(wěn)定的錨點(diǎn)。模型就像一個(gè)被關(guān)在船艙里的人電流一過(guò)噪聲一沖它根本不知道自己是在向左還是向右運(yùn)動(dòng)。有人可能會(huì)說(shuō)模型不是有坐標(biāo)位置信息嗎卷積特征圖里不同位置的像素當(dāng)然有隱含坐標(biāo)SDXL還加了位置編碼怎么還會(huì)左右不分。問(wèn)題在于這些位置信息描述的是“像素在哪”而不是“語(yǔ)義上的左是什么”。模型知道某個(gè)特征圖元素在網(wǎng)格的左上角但不知道這個(gè)左上角對(duì)應(yīng)的現(xiàn)實(shí)意義是“人物的左手邊”還是“觀眾的右手邊”。船里的人同樣知道自己的腳尖朝哪個(gè)方向但不知道船頭朝向哪里。2.2 從相對(duì)性到對(duì)稱(chēng)性破缺隨機(jī)種子只是個(gè)偽錨點(diǎn)如果把坐標(biāo)系的自由度放開(kāi)圖像生成過(guò)程就是一次次“對(duì)稱(chēng)性破缺”。從高斯噪聲出發(fā)時(shí)噪聲分布是旋轉(zhuǎn)不變的、鏡像對(duì)稱(chēng)的沒(méi)有哪個(gè)方向更特殊。隨著去噪步數(shù)推進(jìn)模型必須選擇把某塊噪聲解釋成“貓”把另一塊解釋成“狗”并且默認(rèn)貓和狗之間有一條分界線。這個(gè)選擇如果完全沒(méi)有外部約束那分出左右兩邊的概率各占一半。從這個(gè)角度看你在webui里每次換seed會(huì)改變方向就很好理解了。seed其實(shí)相當(dāng)于一個(gè)極微弱的“偽錨點(diǎn)”——它消除了噪聲樣本的隨機(jī)性但并沒(méi)有消除方向?qū)ΨQ(chēng)性。固定seed只是讓對(duì)稱(chēng)性破缺的方式被固定下來(lái)方向不變是巧合不是模型學(xué)會(huì)了。一旦采樣器、步數(shù)、CFG這些影響去噪軌跡的參數(shù)變了破缺方式就跟著變方向就飄了。真正需要做的是打破這種對(duì)稱(chēng)性而且要在模型可控的層面打破。就像晶體析出需要晶種過(guò)飽和溶液里扔進(jìn)一顆微小的塵粒晶體才會(huì)沿著某個(gè)方向長(zhǎng)出來(lái)。對(duì)圖像生成來(lái)說(shuō)這個(gè)“晶種”必須包含確定的方位信息我把它稱(chēng)為“絕對(duì)坐標(biāo)錨定”。錨定物的作用相當(dāng)于給船艙打開(kāi)一扇窗讓里面的人看到岸上的燈塔一下子分清船在往哪開(kāi)。2.3 這里的“絕對(duì)坐標(biāo)”到底是什么需要先澄清一點(diǎn)我用的“絕對(duì)坐標(biāo)”不是牛頓物理學(xué)里那個(gè)絕對(duì)空間。牛頓的絕對(duì)空間獨(dú)立于任何物體存在這個(gè)概念在現(xiàn)代物理里已經(jīng)被相對(duì)性原理取代了。我在這里說(shuō)的絕對(duì)坐標(biāo)指的是“在生成流程中人為指定的、不隨模型內(nèi)部狀態(tài)變化的外部參考系”。具體來(lái)說(shuō)就是先約定一個(gè)固定的圖像坐標(biāo)系比如x軸正方向向右y軸正方向向下。然后通過(guò)外部條件草圖、深度圖、mask、區(qū)域權(quán)重、注意力約束把畫(huà)面元素釘在這個(gè)坐標(biāo)系里的確定位置。這樣一來(lái)模型的相對(duì)運(yùn)動(dòng)不管怎么折騰都無(wú)法越過(guò)這個(gè)外部框架。它還是不知道“左右”的物理意義但它的輸出已經(jīng)被坐標(biāo)卡死了左右不分的概率被強(qiáng)制降為零。這就像伽利略船艙里多了一個(gè)指南針。指南針的原理也不是讓你感知絕對(duì)空間而是提供一個(gè)外部磁場(chǎng)參照。模型不需要真的理解方向只需要沿著外部參照走。這就是“錨定”的本質(zhì)。3. 絕對(duì)坐標(biāo)錨定法一套三層級(jí)的方法體系3.1 方法定義與基本思路我總結(jié)的“絕對(duì)坐標(biāo)錨定法”完整定義是以固定圖像坐標(biāo)系為基準(zhǔn)在語(yǔ)義、條件、結(jié)構(gòu)三個(gè)層級(jí)中顯式地注入對(duì)象的方位信息使生成模型的輸出不再依賴(lài)內(nèi)部隨機(jī)相對(duì)關(guān)系從而穩(wěn)定解決左右不分問(wèn)題。三個(gè)層級(jí)分別對(duì)應(yīng)生成管線的不同階段。語(yǔ)義層對(duì)應(yīng)prompt成本最低效果最弱條件層對(duì)應(yīng)ControlNet、區(qū)域提示詞這些空間條件輸入效果最強(qiáng)推薦主力結(jié)構(gòu)層對(duì)應(yīng)注意力加權(quán)和后處理檢測(cè)翻轉(zhuǎn)是在模型理解力不夠時(shí)做的兜底。實(shí)際使用時(shí)不必三層全上按需求組合即可。比如純娛樂(lè)出圖語(yǔ)義層加條件層就夠了做嚴(yán)肅的素材生產(chǎn)建議條件層加結(jié)構(gòu)層雙保險(xiǎn)。3.2 L1語(yǔ)義錨定把方位詞寫(xiě)進(jìn)prompt但別指望它單打獨(dú)斗語(yǔ)義錨定就是把你想要的方位用自然語(yǔ)言寫(xiě)清楚?;A(chǔ)寫(xiě)法是“on the left side of the image”“facing right”“pointing to the left”這類(lèi)短語(yǔ)。實(shí)測(cè)下來(lái)英文短語(yǔ)的效果通常比單純的中文“左邊”要好因?yàn)镃LIP的詞表里“l(fā)eft side of the image”這種組合短語(yǔ)的語(yǔ)義更明確。更進(jìn)一步的寫(xiě)法是給方向詞加權(quán)重比如用“(facing right:1.4)”這樣增加權(quán)重的語(yǔ)法讓注意力更多地集中在方位token上。但我在前面說(shuō)過(guò)語(yǔ)義錨定本身很不可靠。它的問(wèn)題不是模型不認(rèn)識(shí)詞而是從文本語(yǔ)義到像素空間的距離太長(zhǎng)。你給的是一個(gè)離散的token模型卻要在連續(xù)的高維噪聲空間里完成“把貓放到圖像幾何左側(cè)”這種操作。中間隔了那么多層cross-attention、self-attention語(yǔ)義信號(hào)早就被稀釋了。我做過(guò)一個(gè)粗統(tǒng)計(jì)單靠語(yǔ)義錨定主方向正確的概率大概在60%到75%之間遠(yuǎn)達(dá)不到穩(wěn)定生產(chǎn)的要求。所以語(yǔ)義層只能當(dāng)輔助不能當(dāng)主力。3.3 L2條件錨定用草圖、深度圖和區(qū)域mask把坐標(biāo)直接焊死條件錨定是目前我實(shí)測(cè)最有效的方案。原理很簡(jiǎn)單給模型一張帶明確方位的條件圖讓生成過(guò)程在條件圖的約束下進(jìn)行。模型在空間布局上基本沒(méi)有自由發(fā)揮的空間方向想錯(cuò)都難。具體到Stable Diffusion生態(tài)首選是ControlNet。線條圖Lineart、軟邊緣SoftEdge、深度圖Depth、姿態(tài)Pose都可以作為錨定條件。線條圖適合鎖定輪廓位置深度圖適合鎖定前后空間關(guān)系姿態(tài)圖適合鎖死人體朝向。如果你不太會(huì)畫(huà)圖可以用空白的畫(huà)布手畫(huà)幾個(gè)簡(jiǎn)單的幾何塊標(biāo)識(shí)出“太陽(yáng)在左上角、房子在右下角”ControlNet一樣能識(shí)別這種粗糙的布局錨點(diǎn)。更精細(xì)的做法是先用模型生成一張底圖再用Photoshop或在線工具把元素位置調(diào)整好再作為ControlNet的輸入重繪。條件錨定還有另外一個(gè)好處它可以同時(shí)鎖定多個(gè)對(duì)象的左右關(guān)系。語(yǔ)義錨定面對(duì)“貓?jiān)谧蟆⒐吩谟摇边@種多對(duì)象場(chǎng)景時(shí)經(jīng)常顧此失彼條件圖則天然包含所有對(duì)象的空間坐標(biāo)模型只需要把細(xì)節(jié)填充進(jìn)來(lái)不需要再猜布局。3.4 L3結(jié)構(gòu)錨定注意力重加權(quán)與后處理翻轉(zhuǎn)結(jié)構(gòu)錨定包括兩個(gè)方向。一個(gè)是在生成過(guò)程中干預(yù)模型的注意力分布比如通過(guò)Attention Refocusing這類(lèi)手段讓某個(gè)token的注意力map偏向圖像左側(cè)或右側(cè)。具體實(shí)現(xiàn)各家工具不同有的通過(guò)自定義節(jié)點(diǎn)有的通過(guò)插件核心都是在cross-attention層面把“左”“右”變成物理坐標(biāo)上的權(quán)重偏移。這個(gè)方法實(shí)現(xiàn)門(mén)檻稍高但對(duì)某些頑固場(chǎng)景很有效比如字母數(shù)字的鏡像問(wèn)題。另一個(gè)方向是后處理翻轉(zhuǎn)。先生成圖再用檢測(cè)模型判斷方向?qū)Σ粚?duì)不對(duì)就水平翻轉(zhuǎn)相當(dāng)于用外部程序在輸出端做硬修正。優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、不挑模型缺點(diǎn)是會(huì)損失構(gòu)圖自然度而且對(duì)人物這類(lèi)有解剖先驗(yàn)的對(duì)象硬翻轉(zhuǎn)后容易出現(xiàn)手型別扭的問(wèn)題。所以后處理翻轉(zhuǎn)更適合用在物體方向明確、翻轉(zhuǎn)后不會(huì)產(chǎn)生違和感的場(chǎng)景比如車(chē)輛、時(shí)鐘、文字。4. 落地實(shí)操在Stable Diffusion里把錨定法跑起來(lái)4.1 準(zhǔn)備工作選好工具和基本參數(shù)下面的實(shí)操基于我日常用的組合Stable Diffusion WebUI搭配ControlNet擴(kuò)展模型用SD1.5系列的寫(xiě)實(shí)模型采樣器DPM 2M Karras步數(shù)25到30CFG Scale在6到8之間。這套配置比較經(jīng)典如果你用SDXL或者ComfyUI思路完全一樣只是界面和節(jié)點(diǎn)名稱(chēng)有差別。先說(shuō)明一個(gè)參數(shù)原則CFG Scale不要拉太高超過(guò)10之后模型容易“過(guò)度解釋”提示詞把方位詞的權(quán)重放大成變形偽影。采樣步數(shù)對(duì)方向影響不大但采樣器有影響。我實(shí)測(cè)下來(lái)DPM家族的方向穩(wěn)定性普遍比Euler好這可能跟采樣軌跡的收斂方式有關(guān)具體機(jī)制我沒(méi)深究但經(jīng)驗(yàn)比較明確方向漂移嚴(yán)重時(shí)先換個(gè)采樣器試試。4.2 方案A用ControlNet線條圖做絕對(duì)坐標(biāo)錨定具體操作分五步。第一步打開(kāi)一個(gè)簡(jiǎn)易繪圖工具新建一個(gè)512乘768或768乘512的畫(huà)布。第二步用畫(huà)筆把畫(huà)面主體的大概輪廓畫(huà)出來(lái)重點(diǎn)是位置和朝向。比如我要生成“一只鳥(niǎo)面朝右側(cè)停在樹(shù)枝上”就在畫(huà)布左中偏右的位置畫(huà)一個(gè)鳥(niǎo)的側(cè)影頭部朝右尾巴朝左再畫(huà)一根橫向的樹(shù)枝。第三步把這張草圖保存為PNG在ControlNet面板里選擇Lineart作為預(yù)處理器把ControlNet權(quán)重設(shè)在0.8到1.2之間。權(quán)重大小要看你希望生成結(jié)果貼近草圖的程度權(quán)重太高會(huì)讓細(xì)節(jié)變得粗糙太低又可能讓模型不理你我常用的起點(diǎn)是1.0。第四步寫(xiě)好prompt。正向提示詞里除了畫(huà)面描述還要把方位需求再寫(xiě)一遍作為語(yǔ)義錨定輔助。我通常寫(xiě) a bird perched on a branch, birds head facing to the right, birds tail on the left, detailed feathers, warm lighting, photorealistic 負(fù)向提示詞寫(xiě) mirrored image, flipped horizontally, wrong position, disorganized composition 第五步點(diǎn)擊生成。由于ControlNet的線條圖已經(jīng)把位置方向釘死了即使prompt里的方位詞句被模型忽略生成結(jié)果依然會(huì)保持鳥(niǎo)的朝向正確。這套方案的核心是草圖質(zhì)量。不需要畫(huà)得多精細(xì)只要輪廓的左右朝向畫(huà)清楚模型就會(huì)沿著這個(gè)方向填充細(xì)節(jié)。如果你想鎖得更死可以換成Depth預(yù)處理器先生成一張帶明確深度關(guān)系的底圖再把條件切換成Depth生成結(jié)果會(huì)更穩(wěn)定但前提是你能接受姿勢(shì)和輪廓被底圖完全約束。4.3 方案B區(qū)域提示詞把畫(huà)面切成左右兩塊如果手頭沒(méi)有繪圖工具或者不想依賴(lài)ControlNet區(qū)域提示詞是另一個(gè)靠譜的選擇。WebUI的Regional Prompter插件支持把畫(huà)面按區(qū)域切割每個(gè)區(qū)域單獨(dú)用一段prompt控制。做法是這樣的先把畫(huà)面切成左右兩個(gè)區(qū)域比例按實(shí)際需要定比如左50%右50%或者左40%右60%。然后在左邊區(qū)域的prompt里寫(xiě)“a red apple”右邊區(qū)域的prompt里寫(xiě)“a green apple”再加上一個(gè)全局prompt比如“still life, fruit on white table”。這個(gè)方案的本質(zhì)是讓注意力在不同的空間區(qū)域各司其職模型就不會(huì)把兩個(gè)對(duì)象的位置隨機(jī)打亂。不過(guò)要注意區(qū)域提示詞的邊界處容易出現(xiàn)兩個(gè)主體的“融合”現(xiàn)象比如蘋(píng)果顏色串味、輪廓糊在一起。我一般會(huì)在全局prompt里加上“clear boundary, separated objects”來(lái)緩解。另外區(qū)域分割比例不要超過(guò)畫(huà)面寬度的一半和三分之二之間太極端的分割會(huì)讓模型強(qiáng)行拉伸物體比例。如果不想裝插件還有一個(gè)土辦法用圖像局部重繪Inpaint。先生成一張空?qǐng)鼍暗讏D然后分別用“cat on the left side”和“dog on the right side”作為提示詞對(duì)左右區(qū)域分別重繪。這個(gè)方法比較費(fèi)工但勝在完全可控適合小批量生產(chǎn)。4.4 方案C檢測(cè)模型加翻轉(zhuǎn)兜底專(zhuān)治最后10%的漏網(wǎng)之魚(yú)即便用了ControlNet和區(qū)域提示詞個(gè)別復(fù)雜場(chǎng)景還是可能出錯(cuò)比如畫(huà)面里有多個(gè)物體互相遮擋或者物體朝向和位置沖突。這時(shí)候我習(xí)慣加一道后處理閘門(mén)。先說(shuō)檢測(cè)方向的方法。對(duì)人物可以用MediaPipe的人臉關(guān)鍵點(diǎn)檢測(cè)通過(guò)鼻尖和臉部輪廓的相對(duì)位置判斷朝向是左還是右。對(duì)車(chē)輛可以用目標(biāo)檢測(cè)模型鎖定車(chē)的位置再配合車(chē)頭燈的相對(duì)位置判斷朝向不過(guò)這個(gè)邏輯需要你自己寫(xiě)幾行代碼。最簡(jiǎn)單粗暴的方式是用一個(gè)分類(lèi)模型專(zhuān)門(mén)訓(xùn)練“面朝左/面朝右”的分類(lèi)器對(duì)生成圖做二分類(lèi)預(yù)測(cè)概率高于0.65就認(rèn)為方向置信度足夠否則自動(dòng)執(zhí)行水平翻轉(zhuǎn)。這套自動(dòng)化pipeline在ComfyUI里更好實(shí)現(xiàn)因?yàn)楣?jié)點(diǎn)式編排可以方便地串聯(lián)“生成→檢測(cè)→判斷→翻轉(zhuǎn)”四步。需要提醒的是后處理翻轉(zhuǎn)只適合“方向錯(cuò)了但內(nèi)容沒(méi)錯(cuò)”的情況。如果模型把人物左手畫(huà)成右手硬翻轉(zhuǎn)會(huì)讓手型變得更加違和。這時(shí)候正確的做法不是翻轉(zhuǎn)而是回到ControlNet用姿態(tài)圖把手的左右重新指定。一句話總結(jié)翻轉(zhuǎn)是兜底不是萬(wàn)能藥。4.5 完整示例生成一張方向穩(wěn)定的“海邊日出”套用一個(gè)我兩周前實(shí)際跑通的例子。需求是生成一張海邊日出圖要求太陽(yáng)在畫(huà)面左側(cè)燈塔在畫(huà)面右側(cè)海平面平直整體偏寫(xiě)實(shí)。我沒(méi)有畫(huà)精細(xì)草圖只用畫(huà)圖工具拉了幾根線一個(gè)圓形色塊放在畫(huà)布左上方一個(gè)細(xì)長(zhǎng)矩形放在畫(huà)布右中部一條橫線位于畫(huà)布下方三分之一處。把這個(gè)圖送進(jìn)ControlNet的Depth預(yù)處理器權(quán)重1.0。提示詞如下Positive: seascape, sunrise, sun on the left side of the image, lighthouse on the right side of the image, calm sea, soft pink sky, photorealistic, highly detailed Negative: mirrored image, flipped, sun on the right, lighthouse on the left, out of frame, distorted參數(shù)SD1.5寫(xiě)實(shí)模型DPM 2M Karras步數(shù)28CFG Scale 7尺寸768x512。我跑了四組seed每組兩張八張圖里太陽(yáng)位置全部在左燈塔全部在右只有一張燈塔的塔尖稍微超出畫(huà)面邊界。對(duì)比同一提示詞在沒(méi)有ControlNet時(shí)跑的結(jié)果方向正確率大概從六成跳到接近百分之百。這就是外層錨定的威力。5. 訓(xùn)練側(cè)的血淚教訓(xùn)LoRA和微調(diào)階段埋下的坑5.1 隨機(jī)水平翻轉(zhuǎn)方向感的第一殺手很多人只在推理階段用模型沒(méi)想過(guò)訓(xùn)練階段埋下的雷。我自己微調(diào)過(guò)幾個(gè)LoRA踩得最狠的一次是給“手表”做LoRA。訓(xùn)練數(shù)據(jù)里有左手戴表的圖也有右手戴表的圖我用PyTorch的數(shù)據(jù)加載器時(shí)習(xí)慣性開(kāi)了RandomHorizontalFlip默認(rèn)概率0.5。訓(xùn)完后一測(cè)提示詞寫(xiě)“watch on the left wrist”模型經(jīng)常把表畫(huà)到右手上甚至表盤(pán)數(shù)字全部鏡像。后來(lái)我把transform里的水平翻轉(zhuǎn)直接關(guān)掉重新訓(xùn)練效果立刻變好。原因是水平翻轉(zhuǎn)讓模型把手表的左右信息當(dāng)作噪聲丟棄了。這跟預(yù)訓(xùn)練模型左右不分是同一個(gè)道理只不過(guò)出現(xiàn)在更小規(guī)模的數(shù)據(jù)分布里。如果你是在開(kāi)源模型基礎(chǔ)上做LoRA建議在數(shù)據(jù)預(yù)處理里檢查一下有沒(méi)有RandomHorizontalFlip有就改成概率0或者只對(duì)不含方向語(yǔ)義的類(lèi)別啟用。如果你訓(xùn)練的對(duì)象是“建筑”“樹(shù)木”“巖石”這類(lèi)沒(méi)有明確左右語(yǔ)義的類(lèi)別翻轉(zhuǎn)影響不大但訓(xùn)練對(duì)象是“人”“動(dòng)物”“文字”“車(chē)輛”“手表”這類(lèi)有明確方向?qū)傩缘念?lèi)別水平翻轉(zhuǎn)必須關(guān)。5.2 觸發(fā)詞與數(shù)據(jù)標(biāo)注讓模型從源頭學(xué)會(huì)左右訓(xùn)練階段的第二個(gè)關(guān)鍵點(diǎn)是觸發(fā)詞。很多人在給LoRA數(shù)據(jù)集打標(biāo)時(shí)只寫(xiě)“a photo of a person”方向信息完全沒(méi)進(jìn)標(biāo)簽。建議在caption里加上明確的方位短語(yǔ)比如“a person facing right, left hand raised”“a car heading to the left, front bumper facing left”。這樣模型才能在訓(xùn)練時(shí)把方位詞和圖像特征穩(wěn)定關(guān)聯(lián)起來(lái)。觸發(fā)詞和方向綁定還有一個(gè)操作技巧把方向詞當(dāng)作一個(gè)獨(dú)立token反復(fù)出現(xiàn)不要和主體描述混在一起。比如不要只寫(xiě)“a photo of a person facing right”而是寫(xiě)成“a person facing right, facing right, right side”。雖然有點(diǎn)丑但注意力確實(shí)會(huì)更集中。另外訓(xùn)練過(guò)程中的驗(yàn)證也很重要。每訓(xùn)練幾百步固定幾個(gè)方向測(cè)試提示詞批量生成一批圖統(tǒng)計(jì)“facing right”的正確率。我一般要求正確率達(dá)到90%以上才收手否則就調(diào)數(shù)據(jù)或調(diào)訓(xùn)練參數(shù)再訓(xùn)。這個(gè)驗(yàn)證集很小二三十張圖就夠但能幫你省下大量事后補(bǔ)救的時(shí)間。6. 常見(jiàn)問(wèn)題與排查速查表現(xiàn)象可能原因首選處理prompt寫(xiě)清left/right但出圖方向隨機(jī)只用了L1語(yǔ)義錨定模型沒(méi)有空間條件約束加ControlNet草圖或區(qū)域提示詞ControlNet鎖住了位置但朝向反了草圖只有位置沒(méi)有朝向細(xì)節(jié)在草圖上畫(huà)明確的頭部/車(chē)頭方向改用Pose或SoftEdge生成文字/數(shù)字鏡像tokenizer缺乏空間方位語(yǔ)義局部重繪加文字參考圖或訓(xùn)練專(zhuān)用LoRA必要時(shí)后處理翻轉(zhuǎn)翻轉(zhuǎn)后人物手型別扭模型有解剖先驗(yàn)硬翻轉(zhuǎn)違反先驗(yàn)不要翻轉(zhuǎn)用姿態(tài)圖重繪手部細(xì)節(jié)同一seed方向穩(wěn)定但換步數(shù)就變采樣軌跡變化引發(fā)對(duì)稱(chēng)性破缺偏移固定采樣器、步數(shù)或加條件錨定區(qū)域提示詞邊界融合區(qū)域權(quán)重設(shè)置不當(dāng)或分隔不夠降低區(qū)域重疊加重“clear separation”權(quán)重排查這類(lèi)問(wèn)題我的基本流程是先生成一組10張圖統(tǒng)計(jì)方向正確率。如果正確率接近50%說(shuō)明模型基本沒(méi)有方位先驗(yàn)必須上條件錨定如果正確率在70%到85%說(shuō)明語(yǔ)義層有一點(diǎn)作用但不夠可以嘗試強(qiáng)化prompt表達(dá)或者降低CFG看是否改善如果正確率超過(guò)90%剩下的偶發(fā)錯(cuò)誤可以交給后處理翻轉(zhuǎn)兜底。有了這個(gè)量化感知你不會(huì)再把時(shí)間耗在盲目抽卡上。還有一個(gè)容易被忽視的點(diǎn)換模型對(duì)方向穩(wěn)定性影響很大。不同finetune版本的底??臻g理解力差異明顯。我在SDXL上實(shí)測(cè)方向穩(wěn)定性總體比SD1.5好但在復(fù)雜場(chǎng)景和多物體布局上仍然會(huì)翻車(chē)。所以如果你在一個(gè)模型上死活調(diào)不出正確方向可以考慮換一個(gè)模型版本測(cè)試這比反復(fù)改prompt效率高得多。7. 延伸思考與個(gè)人實(shí)操體會(huì)這套“絕對(duì)坐標(biāo)錨定法”不僅適用于圖像生成的左右問(wèn)題。我最近在嘗試視頻生成發(fā)現(xiàn)物體運(yùn)動(dòng)方向也可以套用同樣的思路給視頻模型一個(gè)固定的起始幀坐標(biāo)再在后續(xù)幀里用光流或者邊緣約束錨定運(yùn)動(dòng)軌跡產(chǎn)生的鏡頭里物體運(yùn)動(dòng)方向明顯更穩(wěn)定。文字生成方向問(wèn)題同理ROI區(qū)域的坐標(biāo)約束可以大幅降低字母鏡像概率。我個(gè)人在實(shí)際操作中的體會(huì)是控制方向最好分兩層想清楚先問(wèn)“模型能不能從內(nèi)部理解方向”再問(wèn)“能不能從外部強(qiáng)制方向”。理解是能力問(wèn)題強(qiáng)制是工程問(wèn)題。對(duì)大多數(shù)真實(shí)需求來(lái)說(shuō)我們不需要模型真正理解左右只需要它輸出穩(wěn)定。所以我的默認(rèn)方案永遠(yuǎn)是先用ControlNet草圖鎖布局再用區(qū)域提示詞補(bǔ)細(xì)節(jié)最后用檢測(cè)翻轉(zhuǎn)兜底。這套組合拳的穩(wěn)定性遠(yuǎn)遠(yuǎn)超過(guò)單一手段。如果你正在被圖像生成模型的左右不分折磨不妨從今天開(kāi)始在出圖流程里加入一個(gè)固定圖像坐標(biāo)系的小習(xí)慣生成前先在腦子里想清楚“畫(huà)面里哪個(gè)物體是方向基準(zhǔn)”然后用這個(gè)基準(zhǔn)去約束其他元素。這個(gè)方法說(shuō)起來(lái)很簡(jiǎn)單但真正把它落到實(shí)操流程里之后你會(huì)發(fā)現(xiàn)自己不再需要反復(fù)抽卡試方向了。把伽利略那句話說(shuō)到底給模型一個(gè)固定的岸它才分得清船在往哪開(kāi)。