我第一次把 CAD 导出的纯线稿丢进 Stable Diffusion,出来一张让全工作室笑了三天的图:窗户是歪的,楼板像热化了一样往下淌,承重柱凭空消失。当时我的结论是“AI 画建筑还不行”。后来把流程一层层拆开才发现,问题根本不在模型,在我给它的那张图。

你可能也经历过同样的挫败。用文字让 AI 出建筑图,它给你一堆“看起来像建筑”的东西,但只要脑子里有一个具体形体,文字就彻底不够用。于是你想到 img2img:把 CAD 截图丢进去,让它照着改。结果无非两头——去噪强度调低,它只给你换个材质颜色;调高,形体全散了。
这个矛盾是结构性的。扩散模型的本质是从纯噪声里一步步“长出”图像,img2img 只是把你的图混进噪声再抽回来。混入多少噪声,决定它有多大自由度——但无论怎么调,它都分不清像素里哪些是“几何”、哪些是“材质”。你希望几何 100% 保留、材质 100% 重造,img2img 做不到,因为没有任何一个参数能表达这个区分。
ControlNet 不是“更听话的 img2img”,它是给 UNet 装的检查员
2023 年 2 月,斯坦福的 ControlNet 论文 放出,Stable Diffusion 生态很快被它洗了一遍。官方实现开源在 GitHub,它解决的就是上面那个矛盾。
做法很朴素,细节很讲究:不动已经训练好的 UNet,而是复制一份它的编码器,通过一层初始化为零的卷积(zero convolution)接回原网络。训练开始时,这条控制通路输出全为零,等于不存在,预训练模型完全不受干扰;随着训练,它慢慢学会“该拧多大劲”。论文还发现一个出人意料的事实:不到 5 万张图像对——某些条件下只要一千张——就能训通一个新条件,这才是它迅速普及的真正原因。
论文里这样解释零卷积的设计:"zero convolution… to protect this backbone from any harmful noise"——用零卷积保护预训练主干不被训练噪声污染。
更关键的是注入位置。ControlNet 不是在某一个阶段把线稿看一遍,而是在 UNet 的每一个尺度上反复注入:粗尺度管构图,细尺度管细节,每一层都守着,模型想忘掉你的线稿都不行。代价也透明:论文报告显存增加约 23%,单步训练时间增加约 10%。说人话:img2img 是给模型一张参考图,ControlNet 是给模型定了一条宪法。
决定成败的是预处理,不是模型
这里是我踩过最大的坑。我一度以为 ControlNet 直接读我的 CAD 图,后来才明白:它读的是条件图(condition map)——由预处理模块从你的图里抽取出来的标准格式。线稿要先被翻译成它的语言,翻译器选错,后面全白搭。
| 预处理 | 提取什么 | 对建筑意味着什么 |
|---|---|---|
| MLSD | 只保留直线段 | 轮廓、窗格、楼板线都守得住,但弧线会被当噪声删掉 |
| Lineart | 连续线条 | 适合手绘草图,能把草稿线条“接顺”,有弧线时用它 |
| Scribble | 粗放涂鸦式边缘 | 容错率最高,概念阶段不想被几何锁死时选它 |
| Canny | 所有像素级边缘 | 会把填充、网格、尺寸线全当结构,对 CAD 是灾难 |
MLSD 背后的 M-LSD 直线检测模型 天生为直线场景设计,所以 MLSD 版 ControlNet 几乎成了建筑生成的默认起手式。但如果你喂的本来就是干净的 CAD 线稿,预处理要选 None,让模型直接用原图。自动预处理会“重新检测”一遍边缘,把你的精确线条重新猜一遍,凭空多出误差。
还有一个只有建筑人才会撞上的问题:CAD 线稿是语义过载的。粗线是外墙,细线是窗框,虚线是隐藏边,但在条件图里所有线权重一样,AI 分不清哪条承重、哪条装饰。导出前你得自己完成降维:关掉尺寸标注,关掉填充,统一线宽,白底黑线,只留轮廓和主要立面线。这一步没人替你,而且它比选哪个模型重要得多。
一套能用的工作流,从导图到放大
- 整理图纸:关掉标注图层,统一线宽,白底黑线导出 PNG,分辨率不低于 1024;如果是黑底白线,先反色。
- 配置 ControlNet:选 MLSD 或 lineart 模型;图够干净就 preprocessor 选 None,分辨率不够再开 512-1024 的自动预处理。
- 写提示词:只描述材质、氛围、视角:glass curtain wall, aluminum louvers, photorealistic, golden hour, eye-level view。
- 定参数:Control Weight 0.6-0.8,End Control Step 0.7-0.8,CFG 5-7,先跑四张看趋势再收敛。
- 放大出图:满意后 img2img 两倍放大,denoise 0.3,或叠一个 tile ControlNet 保细节。
| 参数 | 建议范围 | 我踩过的坑 |
|---|---|---|
| Control Weight | 0.5-0.8 | 拉到 1.0 线是准了,材质像塑料;降到 0.5 以下,立面开始自己漂 |
| End Control Step | 0.65-0.8 | 全程锁死,最后几步没机会修光影,图又平又假 |
| Denoise | 0.55-0.75 | 超过 0.85 等于放弃线稿,低于 0.5 只是换了个颜色 |
这套流程会在什么时候崩
先是曲线。MLSD 只认直线,弧形立面会被拆成一段段折线,甚至直接删掉。方案里有曲面,就换 lineart 或 scribble,然后接受几何精度下降。
再是模数。AI 对“窗间墙 900mm、开窗 1500mm”的节奏毫无概念,同一张图里窗格间距忽大忽小。它适合回答“陶板还是铝板更适合这个立面”,不适合回答“幕墙分格对不对齐”。
最后是语义。ControlNet 保住的是“线在哪”,不是“这根线代表什么”。想表达“这一片是玻璃、那一片是实墙”,线稿不够——得叠 segmentation 或 depth 的多重 ControlNet 才能锁住材质分区。门槛高,但效果是另一个级别。
进阶:多重 ControlNet 怎么叠
Unit 1 用 MLSD,权重 0.7,锁形体;Unit 2 用 depth,权重 0.4,锁体量;Unit 3 用 segmentation,权重 0.5,锁玻璃/实墙分区。三个同时开显存压力明显上升,先在 512 分辨率试通,再上高分辨率。
常见翻车现场,和怎么躲开
同样的参数,为什么我的线还是歪的?
九成是预处理没关,干净的 CAD 线稿被自动预处理重新猜了一遍;剩下一成是线太细或粗细不一,导出前把线宽统一到 2-3px 以上。
手绘草图也能走这套流程吗?
能,选 scribble。它训练时专门吃过“画得不准”的苦,容错率最高,代价是形体约束也最松。
8GB 显存跑得动吗?
SD1.5 加单个 ControlNet、512 分辨率没问题;上 1024 加多重 ControlNet 才会吃力。这套工作流性价比的顶点就在 768 左右。
把它放回设计流程,它到底值多少
我的判断:这是目前把“具体形体”和“图像生成”连起来的最实用接口,没有之一。它的价值不是替代设计,而是把概念阶段的外立面探索从“一周三张渲染”变成“一下午五十个方案”。CAD 仍然是结构诚实的底线,渲染器仍然是交付精度的底线,但它们中间那块探索空白,被 ControlNet 填上了。
它失败的方式同样明确:当问题本身就是几何问题时——层高不对、柱距不匀、幕墙模数踩了规范——它帮不上忙,还会用好看的材质把这些错误包装得更难发现。用线稿生成图,图的命运在导出线稿那一刻就大致决定了。想通这一点,你就不会轻易被任何一张“惊艳的 AI 概念图”骗到。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/734.html