gandissect

GitHub
1.8k 279 较难 1 次阅读 1个月前MIT开发框架图像
AI 解读 由 AI 自动生成,仅供参考

gandissect 是一款基于 PyTorch 的开源工具,旨在“解剖”生成对抗网络(GAN),帮助人们直观地理解其内部神经元是如何工作的。它解决了 GAN 长期被视为“黑盒”的难题,通过将网络内部的抽象单元与人类可识别的概念(如树木、窗户、云朵等)进行关联,让用户能够清晰地看到哪些神经元控制了图像中的特定物体或属性。

这款工具特别适合 AI 研究人员、开发者以及对生成模型原理感兴趣的设计师使用。借助 gandissect,用户不仅可以可视化分析 GAN 不同层级的特征表示,还能诊断并修复生成图像中的伪影,甚至通过激活或抑制特定神经元来直接编辑图像内容,例如从会议室照片中移除椅子,或在风景画中增添窗户。

其核心技术亮点在于将复杂的神经网络激活映射为语义明确的视觉概念,并提供了静态分析报告与交互式演示(如 GANPaint)两种使用方式。无论是为了学术研究模型的可解释性,还是为了探索创意图像编辑的新可能,gandissect 都提供了一套强大且易用的解决方案,让深奥的算法逻辑变得触手可及。

使用场景

某游戏美术团队正在利用生成对抗网络(GAN)批量构建虚拟城市景观,但在生成的教堂图像中,窗户经常错位或出现不自然的伪影,严重影响场景可用性。

没有 gandissect 时

  • 开发人员只能像“盲人摸象”一样随机调整潜在向量,无法定位具体是哪个神经元控制了“窗户”的生成。
  • 遇到画面伪影时,缺乏诊断手段,往往需要重新训练整个模型或耗费数天尝试不同的网络架构。
  • 想要移除画面中多余的物体(如错误的门窗),只能依赖后期 PS 手工修图,无法从模型源头进行干预。
  • 团队内部难以沟通模型内部逻辑,因为黑盒特性导致无法向非技术人员解释生成结果偏差的原因。

使用 gandissect 后

  • 通过可视化分析,团队迅速定位到第 4 层中特定的一组神经元专门负责“窗户”概念,实现了精准控制。
  • 利用工具的诊断功能,直接识别并抑制了产生伪影的异常神经元,无需重新训练即可显著提升画质。
  • 借助交互式演示,开发者可以直接“关闭”控制特定物体的神经元,在生成阶段就自动移除不需要的窗户或添加新元素。
  • 生成的静态分析报告将抽象的神经元与人类可理解的概念(如门、树、砖墙)对应,让美术与算法团队能基于共同语言高效协作。

gandissect 将 GAN 从不可控的黑盒变成了可解释、可编辑的透明系统,极大降低了生成式内容的调试与定制成本。

运行环境要求

操作系统
  • Linux
GPU

必需 NVIDIA GPU (支持 CUDA),具体型号和显存大小未说明,但需运行大型 GAN 模型和分割网络

内存

未说明

依赖
notes该项目为 2018 年发布的早期版本 (v0.9 alpha),依赖较旧版本的 PyTorch (0.4.1)。建议使用 conda 创建环境并运行提供的脚本 (setup_env.sh, download_data.sh) 来安装依赖和下载数据集及预训练模型。主要功能包括对 GAN 内部单元的可解释性分析、静态报告生成以及运行交互式 Web 编辑服务器。
python3.x
PyTorch 0.4.1
conda
netdissect
gandissect hero image

快速开始

GANDissect

项目 | 演示 | 论文 | 视频

GAN Dissection 是一种检查生成对抗网络(GAN)内部表示的方法,以理解其内部单元如何与人类可解释的概念相对应。它是 NetDissect 的一部分。

这个仓库允许你解剖一个 GAN 模型,并将解剖结果以静态摘要或交互式可视化的方式呈现。尝试我们的交互式 GANPaint 演示,与 GAN 互动并绘制图像。

概述

生成对抗网络的可视化与理解
David BauJun-Yan ZhuHendrik StrobeltBolei ZhouJoshua B. TenenbaumWilliam T. FreemanAntonio Torralba
MIT CSAIL、MIT-IBM Watson AI Lab、香港中文大学、IBM 研究院
发表于 arXiv,2018年。

分析与应用

GAN 中可解释的单元

分析不同层

诊断和改进 GAN

从会议室中移除物体

从不同自然场景中移除窗户

在图像中插入新物体

发布历史

v 0.9 alpha - 2018年11月26日

快速入门

让我们设置环境并解剖一个 churchoutdoor GAN。这需要一块支持 CUDA 的 GPU 和一定的磁盘空间。

设置

要从本仓库安装所有必需的软件,请确保已安装 conda,然后运行:

script/setup_env.sh      # 创建包含依赖项的 conda 环境
script/make_dirs.sh      # 创建数据集和解剖目录
script/download_data.sh  # 下载支持数据和演示用 GAN
source activate netd     # 进入 conda 环境
pip install -v -e .      # 将本地 netdissect 包链接到环境中

详细信息。该代码依赖于 Python 3、PyTorch 4.1 以及其他几个包。对于 conda 用户,script/environment.yml 提供了详细的依赖关系。对于 pip 用户,setup.py 列出了所有必需的依赖项。

数据。download_data.sh 脚本会下载用于解剖分类器的分割数据集、用于解剖 GAN 的分割网络,以及若干用于解剖的示例 GAN 模型。这些文件将被下载到 dataset/models/ 目录中。如果你不想下载示例网络,可以使用 python -m netdissect --download 命令仅下载 netdissect 本身所需的数据和模型。

解剖一个 GAN

GAN 示例:解剖由 Karras 训练的 LSUN 客厅渐进式 GAN 的三层:

python -m netdissect \
   --gan \
   --model "netdissect.proggan.from_pth_file('models/karras/livingroom_lsun.pth')" \
   --outdir "dissect/livingroom" \
   --layer layer1 layer4 layer7 \
   --size 1000

结果会在 dissect/livingroom/dissect.html 生成一个静态 HTML 页面,并在 dissect/livingroom/dissect.json 生成一个包含指标的 JSON 文件。

你可以测试自己的模型:--model 参数是一个完全限定的 Python 函数或构造函数,用于加载要测试的 GAN。--layer 参数是完全限定的层名(类似于 state_dict 样式)。

默认情况下,使用基于场景的分割,但可以通过向 --segmenter 提供替代的类构造函数来替换不同的分割器类。有关分割器基类的信息,请参阅 netdissect/segmenter.py

运行 GAN 编辑服务器(alpha)

一旦 GAN 被解剖,你就可以运行一个提供 API 的 Web 服务器,该服务器可以根据(可选)干预生成图像。

python -m netdissect.server --address 0.0.0.0

编辑界面(右)将在 http://localhost:5001/ 提供服务。

其他 URL:

高级用法

解剖一个分类器(NetDissect)

分类器示例:解剖 torchvision 中预训练的 alexnet 的三层:

python -m netdissect \
   --model "torchvision.models.alexnet(pretrained=True)" \
   --layers features.6:conv3 features.8:conv4 features.10:conv5 \
   --imgsize 227 \
   --outdir dissect/alexnet-imagenet

分类器不需要特殊的 Web 服务器。

命令行详细说明

netdissect 命令行工具的文档。

用法:python -m netdissect [-h] [--model MODEL] [--pthfile PTHFILE]
                            [--outdir OUTDIR] [--layers LAYERS [LAYERS ...]]
                            [--segments SEGMENTS] [--segmenter SEGMENTER]
                            [--download] [--imgsize IMGSIZE]
                            [--netname NETNAME] [--meta META [META ...]]
                            [--examples EXAMPLES] [--size SIZE]
                            [--batch_size BATCH_SIZE]
                            [--num_workers NUM_WORKERS]
                            [--quantile_threshold {[0-1],iqr}] [--no-labels]
                            [--maxiou] [--covariance] [--no-images]
                            [--no-report] [--no-cuda] [--gen] [--gan]
                            [--perturbation PERTURBATION] [--add_scale_offset]
                            [--quiet]

可选参数:

  -h, --help            显示此帮助信息并退出
  --model MODEL         用于测试的模型构造函数
  --pthfile PTHFILE     模型 .pth 文件的文件名
  --outdir OUTDIR       解剖输出的目录
  --layers LAYERS [LAYERS ...]
                        以空格分隔的要解剖的层名称列表,格式为 layername[:reportedname]
  --segments SEGMENTS   包含分割数据集的目录
  --segmenter SEGMENTER
                        分割类的构造函数
  --download            如果需要,则下载 Broden 数据集
  --imgsize IMGSIZE     使用的输入图像大小
  --netname NETNAME     生成报告中网络的名称
  --meta META [META ...]
                        要添加到报告中的元数据 JSON 文件
  --examples EXAMPLES   每个单元的图像示例数量
  --size SIZE           使用的数据集子集大小
  --batch_size BATCH_SIZE
                        前向传播的批量大小
  --num_workers NUM_WORKERS
                        DataLoader 工作线程的数量
  --quantile_threshold {[0-1],iqr}
                        用于掩码的分位数
  --no-labels           禁用单元标注
  --maxiou              启用 MaxIOU 计算
  --covariance          启用协方差计算
  --no-images           禁用单元图像的生成
  --no-report           禁用报告摘要的生成
  --no-cuda             禁用 CUDA 的使用
  --gen                 测试生成器模型(例如 GAN)
  --gan                 --gen 的同义词
  --perturbation PERTURBATION
                        要应用的扰动攻击文件名
  --add_scale_offset    根据步幅和填充偏移掩码
  --quiet               静音控制台输出

API,适用于分类器

该工具也可以在代码中作为函数使用,具体步骤如下:

  1. 加载您希望解剖的卷积神经网络模型,并调用 imodel = InstrumentedModel(model),然后通过 imodel.retain_layers([layernames,..]) 对模型进行插桩。
  2. 使用 BrodenDataset 类加载分割数据集;通过 transform_image 参数对图像进行归一化以适应模型要求,并通过 size 参数截断数据集。
  3. 选择一个用于写入输出的目录,然后调用 dissect(outdir, imodel, dataset)

可以通过减小 BrodenDatasetsize 来快速进行近似解剖。生成示例图像可能耗时较长,可通过 examples_per_unit 设置每单位生成的图像数量。

示例:

    from netdissect import InstrumentedModel, dissect
    from netdissect import BrodenDataset

    model = InstrumentedModel(load_my_model())
    model.eval()
    model.cuda()
    model.retain_layers(['conv1', 'conv2', 'conv3', 'conv4', 'conv5'])
    bds = BrodenDataset('dataset/broden1_227',
            transform_image=transforms.Compose([
                transforms.ToTensor(),
                transforms.Normalize(IMAGE_MEAN, IMAGE_STDEV)]),
            size=10000)
    dissect('result/dissect', model, bds,
            batch_size=100,
            examples_per_unit=10)

Broden 数据集主要针对自然场景照片中的语义对象、部件、材质、颜色等。如果您想使用不同的语义分割来分析模型,可以替换其他分割数据集,并提供一个 segrunner 参数,该参数描述了如何从数据集中获取分割结果和 RGB 图像。详细信息请参阅 ClassifierSegRunner

API,适用于生成器

同样地:

  1. 加载您希望解剖的生成器模型,并调用 retain_layers(model, [layernames,..]) 对模型进行插桩。
  2. 创建用于测试的 z 输入样本数据集。如果您的模型使用均匀正态分布,z_dataset_for_model 可以生成这样的数据集。
  3. 选择一个用于写入输出的目录,然后调用 dissect(outdir, model, dataset, segrunner=GeneratorSegRunner())

解剖所需的时间与数据集中样本的数量成正比。

    from netdissect import InstrumentedModel, dissect
    from netdissect import z_dataset_for_model, GeneratorSegRunner

    model = InstrumentedModel(load_my_model())
    model.eval()
    model.cuda()
    model.retain_layers(model, ['layer3', 'layer4', 'layer5'])
    zds = z_dataset_for_model(size, model)
    dissect('result/gandissect', model, zds,
            segrunner=GeneratorSegRunner(),
            batch_size=100,
            examples_per_unit=10)

GeneratorSegRunner 默认运行一个面向自然场景照片中语义对象、部件和材质的语义分割网络。若需使用其他语义分割,可在 GeneratorSegRunner 的构造函数中传入自定义的 Segmenter 子类。

引用

如果您在研究中使用此代码,请引用我们的论文:

@inproceedings{bau2019gandissect,
 title={GAN Dissection: Visualizing and Understanding Generative Adversarial Networks},
 author={Bau, David and Zhu, Jun-Yan and Strobelt, Hendrik and Zhou, Bolei and Tenenbaum, Joshua B. and Freeman, William T. and Torralba, Antonio},
 booktitle={Proceedings of the International Conference on Learning Representations (ICLR)},
 year={2019}
}

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架