Building-GAN模型结构详解
论文名称:《Building-GAN Graph-Conditioned Architectural Volumetric Design Generation》
论文及源码:https://github.com/AutodeskAILab/Building-GAN
在开始前,先帮你建立两个基础认知:
- GAN的核心逻辑:Building-GAN是基于“生成对抗网络(GAN)”的模型,本质是“生成器(造‘假’建筑设计)”和“判别器(辨‘假’)”的对抗训练——生成器努力让设计看起来像真实建筑师做的,判别器努力分清“真实设计”和“生成设计”,最终两者共同进步,生成器能输出高质量设计。
- 模型目标:根据建筑师提供的两个输入(①程序图:比如“电梯要连走廊、卫生间要在办公室附近”的功能规则;②合规设计空间:比如“不能超过10层、不能挡邻居采光”的空间限制),自动生成3D建筑体积设计(类似建筑的“毛坯框架”,包含每层房间布局和整体3D形状)。
一、模型整体框架
Building-GAN分为两大核心模块:生成器(Generator) 和 判别器(Discriminator),对应GAN的经典结构。
- 生成器:“创造设计”——从输入的“程序图”和“合规空间”出发,输出3D建筑体积设计(用“voxel graph”表示)。
- 判别器:“检查设计”——输入一个设计(可能是真实设计,也可能是生成器造的假设计),判断它“像真实设计的概率”,同时给生成器反馈,帮它改进。
下面我们逐个拆解这两个模块,重点讲“每个部分是什么、做什么、为什么这么设计”(避开复杂公式,只讲核心逻辑)。
二、核心模块1:生成器(Generator)——“设计创造者”
生成器是Building-GAN的创新核心,它要解决一个关键问题:如何把“功能规则(程序图)”和“3D空间结构(voxel graph)”结合起来(比如“电梯要连走廊”这个规则,要对应到3D空间里“电梯的体素和走廊的体素挨在一起”)。
生成器包含3个关键子模块,按“处理顺序”串联:
2.1 子模块1:Program GNN——“读懂功能规则”
(1)什么是Program GNN?
- 先明确输入:程序图(Program Graph),是建筑师画的“功能关系图”——
- 节点:代表建筑里的“功能房间”(比如电梯、走廊、办公室、卫生间,共6种类型),每个节点还带信息(比如“这个电梯在3楼”)。
- 边:代表“房间之间要连通”(比如电梯节点和走廊节点之间有边,意思是“电梯要和走廊开门连通”)。
- GNN(图神经网络):专门处理“图结构数据”的模型(比如社交网络、知识图谱,或者这里的程序图)。因为程序图不是图片(不能用CNN)、不是文字序列(不能用RNN),只有GNN能“看懂”节点之间的连接关系。
(2)它做什么?
把“程序图”里的功能规则,转换成机器能理解的“向量(嵌入)”——
- 给每个程序节点(比如“3楼电梯”)加一点随机噪声(让生成的设计有多样性,避免每次都一样),再结合FAR(容积率,比如“总建筑面积不能超过地块面积的1.8倍”)、TPR(目标功能占比,比如“办公室要占50%面积”)这些约束,把节点信息变成一个向量(比如128维的数字串)。
- 反复“传递消息”:让每个节点“参考邻居节点的信息”更新自己的向量(比如“电梯节点”会参考“走廊节点”的向量,记住“我要和走廊连通”),这个过程重复5次,确保每个节点都充分理解全局功能规则。
(3)为什么这么设计?
- 不用CNN/RNN:因为程序图是“非网格、非序列”的图结构,只有GNN能捕捉节点间的“连通关系”(这是建筑功能的核心,比如“卫生间必须连走廊”,断了就用不了)。
- 加噪声/FAR/TPR:噪声是为了生成多种设计(建筑师需要多方案选择);FAR/TPR是建筑合规的硬约束,必须让模型一开始就“记住”这些规则,避免生成不合规的设计。
2.2 子模块2:Voxel GNN——“搭建3D空间框架”
(1)什么是Voxel GNN?
- 先明确输入:voxel graph(体素图),是模型用来表示3D建筑的“空间语言”——
- 节点:代表一个“小长方体(体素)”,每个节点带信息(比如这个体素的位置x/y/z、尺寸长/宽/高)。
- 边:代表两个体素“挨在一起”(比如一个体素在另一个体素的右边,共享一面墙,就有边)。
- 关键特点:非均匀(比如大办公室用大体积素,小卫生间用小体积素),不像传统体素(全是一样大的小方块)那样浪费内存。
- Voxel GNN:用GNN处理voxel graph,让模型“理解3D空间结构”。
(2)它做什么?
把“合规设计空间”(比如“地块40×40米,最高50米”)转换成3D的voxel graph框架,过程分两步:
- 编码体素信息:给每个体素节点加一点随机噪声,再加上“位置编码(PE)”——比如“这个体素在2楼”,就给它加一个“2楼专属标签”,让模型分清“上下楼层”(避免把1楼的房间画到3楼)。
- 反复“传递空间消息”:让每个体素节点“参考邻居体素的信息”更新自己的向量(比如“这个体素是走廊”,会参考旁边体素的向量,确保“走廊旁边是办公室,不是外墙”),这个过程重复12次——比Program GNN多,因为3D空间关系比2D功能关系更复杂(要考虑上下左右前后)。
(3)为什么这么设计?
- 用voxel graph不用传统体素:传统体素是“规则小方块”,比如一个大办公室要拆成几百个小方块,浪费内存;voxel graph用“非均匀体素”,一个办公室一个节点,效率高,还能避免生成“锯齿边界”(传统体素画的墙会有像素感,voxel graph能画平整的墙)。
- 加位置编码(PE):3D建筑的“楼层”是核心(比如1楼要大厅,2-10楼是办公室),PE能让模型明确“每个体素在第几层”,避免楼层混乱(比如把电梯画到半空中,不连贯)。
- 12次消息传递:3D空间需要“长距离感知”(比如电梯要从1楼通到10楼,体素节点要知道“我是1楼电梯,上面9楼的电梯体素要和我对齐”),多传递几次消息才能捕捉这种长距离关系。
2.3 子模块3:跨模态指针模块——“连接功能和空间”
这是Building-GAN最关键的创新!初学者可以理解为“翻译官”——把Program GNN“读懂的功能规则”,翻译成Voxel GNN“能懂的空间指令”。
(1)为什么需要它?
之前的模型(比如House-GAN)有个大问题:“功能和空间脱节”——比如程序图里写了“电梯连走廊”,但生成的3D设计里电梯却在墙角,不连走廊,根本没法用。原因是没有专门的模块把“功能规则”和“空间结构”绑定。
(2)它做什么?
在Voxel GNN传递消息的过程中,每2步就“插一次手”,做3件事:
- 输出“mask(掩码)”:判断每个体素“要不要用”(比如地块边缘的体素超出合规空间,就标为“不用”)。
- 输出“attention(注意力)”:告诉每个体素“你对应程序图里的哪个节点”(比如“这个体素是电梯,对应程序图里3楼的电梯节点”),确保空间结构符合功能规则。
- 更新体素向量:用Program GNN的功能向量,修正Voxel GNN的空间向量(比如“这个体素是电梯,要往走廊的方向调整位置”)。
(3)为什么这么设计?
- 每2步插一次手:如果只在最后插一次,Voxel GNN可能已经画错了(比如把电梯画到外墙),再改就来不及了;每2步改一次,能及时纠正偏差,确保“功能不跑偏”。
- 用attention不用固定映射:不同楼层的程序节点数量不一样(比如1楼有2个走廊,3楼有1个走廊),固定映射会出错;attention能“动态匹配”(每个体素自己找对应的程序节点),更灵活。
三、核心模块2:判别器(Discriminator)——“设计质检员”
判别器的目标很简单:“看一个设计,判断它是真实建筑师做的(真实样本),还是生成器造的(假样本)”。但Building-GAN的判别器做了特殊设计,让它“检查得更全面”。
3.1 它是什么?
本质是一个“图神经网络”,输入是“生成的voxel graph”或“真实的voxel graph”,输出是两个分数:
- 建筑级分数:“这个设计从整体上看像不像真实建筑?”(比如“总层数符合FAR吗?电梯有没有从1楼通到顶楼?”)。
- 楼层级分数:“这个设计的每一层单独看像不像真实楼层?”(比如“1楼的大厅位置对吗?某一层的卫生间有没有连走廊?”)。
3.2 它做什么?
- 编码voxel graph:和Voxel GNN类似,把输入的voxel graph转换成向量,捕捉空间和功能信息(比如每个体素的类型、位置)。
- 分两级打分:
- 建筑级:把所有楼层的体素向量“汇总”,判断整体是否合规(比如“总建筑面积有没有超FAR”)。
- 楼层级:把每一层的体素向量单独“汇总”,判断每层是否合理(比如“3楼的办公室面积有没有达到TPR要求”)。
- 给生成器反馈:如果生成的设计“建筑级分数低”(比如整体超高度),就告诉生成器“下次要控制总高度”;如果“楼层级分数低”(比如某层卫生间没连走廊),就告诉生成器“下次要检查每层的连通性”。
3.3 为什么这么设计?
- 分两级打分:如果只看整体(建筑级),可能漏看局部问题(比如整体合规,但某一层房间全乱了);只看局部(楼层级),可能漏看整体问题(比如每层都合理,但总层数超了FAR)。两级结合,检查更全面。
- 用GNN不用CNN:和Voxel GNN一样,因为输入是voxel graph(图结构),CNN处理不了非均匀的图,只有GNN能捕捉体素间的“空间和功能关系”(这是判断设计真实性的核心)。
四、总结:模型设计的“逻辑闭环”
Building-GAN的每个设计,都是为了解决“传统方法做不了3D建筑体积设计”的痛点,逻辑闭环如下:
- 痛点1:3D功能规则复杂(多楼层、多房间连接)→ 用Program GNN处理程序图,捕捉功能连通性。
- 痛点2:3D空间效率低(传统体素浪费内存)→ 用voxel graph+Voxel GNN,非均匀体素省资源,还能画平整边界。
- 痛点3:功能和空间脱节(设计不合用)→ 用跨模态指针模块,动态绑定功能规则和空间结构。
- 痛点4:生成设计不真实(整体/局部有缺陷)→ 用双级判别器,全面检查整体和每层的合理性。
对初学者来说,记住一个比喻:生成器像“新手建筑师助理”,Program GNN帮它看懂需求,Voxel GNN帮它画3D草稿,指针模块帮它对照需求改草稿;判别器像“资深建筑师”,从整体和局部检查草稿,指出问题;两者反复磨合,助理最终能画出符合要求的3D设计。