Skip to content

Latest commit

 

History

History
278 lines (217 loc) · 17 KB

File metadata and controls

278 lines (217 loc) · 17 KB

潜在扩散模型生成式水印的开源工具包

Home Paper Models Colab DOC PYPI CONDA-FORGE

语言版本: English | 中文 | Français | Español

🔥 作为一个新发布的项目,我们欢迎 PR! 如果您已经实现了 LDM 水印算法或有兴趣贡献一个算法,我们很乐意将其包含在 MarkDiffusion 中。加入我们的社区,帮助让生成式水印技术对每个人都更易用!

目录

🔥 更新日志

🛠 (2025.12.19) 为所有功能添加了包含658个测试用例的完整测试套件。

🛠 (2025.12.10) 使用 GitHub Actions 添加了持续集成测试系统。

🎯 (2025.10.10) 添加 Mask、Overlay、AdaptiveNoiseInjection 图像攻击工具,感谢付哲语的 PR!

🎯 (2025.10.09) 添加 FrameRateAdapter、FrameInterpolationAttack 视频攻击工具,感谢司路阳的 PR!

🎯 (2025.10.08) 添加 SSIM、BRISQUE、VIF、FSIM 图像质量分析器,感谢王欢的 PR!

(2025.10.07) 添加 SFW 水印方法,感谢王欢的 PR!

(2025.10.07) 添加 VideoMark 水印方法,感谢李翰乾的 PR!

(2025.9.29) 添加 GaussMarker 水印方法,感谢司路阳的 PR!

🔓 MarkDiffusion 简介

👀 概述

MarkDiffusion 是一个用于潜在扩散模型生成式水印的开源 Python 工具包。随着基于扩散的生成模型应用范围的扩大,确保生成媒体的真实性和来源变得至关重要。MarkDiffusion 简化了水印技术的访问、理解和评估,使研究人员和更广泛的社区都能轻松使用。注意:如果您对 LLM 水印(文本水印)感兴趣,请参考我们团队的 MarkLLM 工具包。

该工具包包含三个关键组件:统一的实现框架,用于简化水印算法集成和用户友好的界面;机制可视化套件,直观地展示添加和提取的水印模式,帮助公众理解;以及全面的评估模块,提供 31 个工具的标准实现,涵盖三个关键方面——可检测性、鲁棒性和输出质量,以及 6 个自动化评估流水线。

MarkDiffusion Overview

💍 核心特性

  • 统一实现框架: MarkDiffusion 提供了一个模块化架构,支持十一种最先进的 LDM 生成式图像/视频水印算法。

  • 全面的算法支持: 目前实现了来自两大类别的 11 种水印算法:基于模式的方法(Tree-Ring、Ring-ID、ROBIN、WIND、SFW)和基于密钥的方法(Gaussian-Shading、PRC、SEAL、VideoShield、GaussMarker、VideoMark)。

  • 可视化解决方案: 该工具包包含定制的可视化工具,能够清晰而深入地展示不同水印算法在各种场景下的运行方式。这些可视化有助于揭示算法机制,使其对用户更易理解。

  • 评估模块: 拥有 31 个评估工具,涵盖可检测性、鲁棒性和对输出质量的影响,MarkDiffusion 提供全面的评估能力。它具有 6 个自动化评估流水线:水印检测流水线、图像质量分析流水线、视频质量分析流水线以及专门的鲁棒性评估工具。

✨ 已实现算法

算法 类别 目标 参考文献
Tree-Ring 模式 图像 Tree-Ring Watermarks: Fingerprints for Diffusion Images that are Invisible and Robust
Ring-ID 模式 图像 RingID: Rethinking Tree-Ring Watermarking for Enhanced Multi-Key Identification
ROBIN 模式 图像 ROBIN: Robust and Invisible Watermarks for Diffusion Models with Adversarial Optimization
WIND 模式 图像 Hidden in the Noise: Two-Stage Robust Watermarking for Images
SFW 模式 图像 Semantic Watermarking Reinvented: Enhancing Robustness and Generation Quality with Fourier Integrity
Gaussian-Shading 密钥 图像 Gaussian Shading: Provable Performance-Lossless Image Watermarking for Diffusion Models
GaussMarker 密钥 图像 GaussMarker: Robust Dual-Domain Watermark for Diffusion Models
PRC 密钥 图像 An undetectable watermark for generative image models
SEAL 密钥 图像 SEAL: Semantic Aware Image Watermarking
VideoShield 密钥 视频 VideoShield: Regulating Diffusion-based Video Generation Models via Watermarking
VideoMark 密钥 视频 VideoMark: A Distortion-Free Robust Watermarking Framework for Video Diffusion Models

🎯 评估模块

评估流水线

MarkDiffusion 支持八个流水线,两个用于检测(WatermarkedMediaDetectionPipeline 和 UnWatermarkedMediaDetectionPipeline),六个用于质量分析。下表详细说明了质量分析流水线。

质量分析流水线 输入类型 所需数据 适用指标
DirectImageQualityAnalysisPipeline 单张图像 生成的有/无水印图像 单张图像评估指标
ReferencedImageQualityAnalysisPipeline 图像 + 参考内容 生成的有/无水印图像 + 参考图像/文本 需要在单张图像和参考内容(文本/图像)之间计算的指标
GroupImageQualityAnalysisPipeline 图像集(+ 参考图像集) 生成的有/无水印图像集(+ 参考图像集) 需要在图像集上计算的指标
RepeatImageQualityAnalysisPipeline 图像集 重复生成的有/无水印图像集 用于评估重复生成图像集的指标
ComparedImageQualityAnalysisPipeline 两张对比图像 生成的有水印和无水印图像 测量两张图像之间差异的指标
DirectVideoQualityAnalysisPipeline 单个视频 生成的视频帧集 整体视频评估指标

评估工具

工具名称 评估类别 功能描述 输出指标
FundamentalSuccessRateCalculator 可检测性 计算固定阈值水印检测的分类指标 各种分类指标
DynamicThresholdSuccessRateCalculator 可检测性 计算动态阈值水印检测的分类指标 各种分类指标
图像攻击工具
Rotation 鲁棒性(图像) 图像旋转攻击,测试水印对旋转变换的抗性 旋转后的图像/帧
CrSc(裁剪与缩放) 鲁棒性(图像) 裁剪和缩放攻击,评估水印对尺寸变化的鲁棒性 裁剪/缩放后的图像/帧
GaussianNoise 鲁棒性(图像) 高斯噪声攻击,测试水印对噪声干扰的抗性 噪声损坏的图像/帧
GaussianBlurring 鲁棒性(图像) 高斯模糊攻击,评估水印对模糊处理的抗性 模糊后的图像/帧
JPEGCompression 鲁棒性(图像) JPEG 压缩攻击,测试水印对有损压缩的鲁棒性 压缩后的图像/帧
Brightness 鲁棒性(图像) 亮度调整攻击,评估水印对亮度变化的抗性 亮度修改后的图像/帧
Mask 鲁棒性(图像) 图像遮罩攻击,测试水印对随机黑色矩形部分遮挡的抗性 遮罩后的图像/帧
Overlay 鲁棒性(图像) 图像覆盖攻击,测试水印对涂鸦式笔触和注释的抗性 覆盖后的图像/帧
AdaptiveNoiseInjection 鲁棒性(图像) 自适应噪声注入攻击,测试水印对内容感知噪声的抗性(高斯/椒盐/泊松/斑点) 自适应噪声处理后的图像/帧
视频攻击工具
MPEG4Compression 鲁棒性(视频) MPEG-4 视频压缩攻击,测试视频水印的压缩鲁棒性 压缩后的视频帧
FrameAverage 鲁棒性(视频) 帧平均攻击,通过帧间平均破坏水印 平均后的视频帧
FrameSwap 鲁棒性(视频) 帧交换攻击,通过改变帧序列测试鲁棒性 交换后的视频帧
FrameRateAdapter 鲁棒性(视频) 帧率转换攻击,在保持时长的同时重采样帧 重采样后的帧序列
FrameInterpolationAttack 鲁棒性(视频) 帧插值攻击,插入混合帧以改变时间密度 插值后的视频帧
图像质量分析器
InceptionScoreCalculator 质量(图像) 评估生成图像的质量和多样性 IS 分数
FIDCalculator 质量(图像) Fréchet Inception Distance,测量生成图像和真实图像之间的分布差异 FID 值
LPIPSAnalyzer 质量(图像) 学习感知图像块相似度,评估感知质量 LPIPS 距离
CLIPScoreCalculator 质量(图像) 基于 CLIP 的文本-图像一致性评估 CLIP 相似度分数
PSNRAnalyzer 质量(图像) 峰值信噪比,测量图像失真 PSNR 值(dB)
NIQECalculator 质量(图像) 自然图像质量评估器,无参考质量评估 NIQE 分数
SSIMAnalyzer 质量(图像) 两张图像之间的结构相似性指数 SSIM 值
BRISQUEAnalyzer 质量(图像) 盲/无参考图像空间质量评估器,无需参考即可评估图像的感知质量 BRISQUE 分数
VIFAnalyzer 质量(图像) 视觉信息保真度分析器,比较失真图像与参考图像以量化保留的视觉信息量 VIF 值
FSIMAnalyzer 质量(图像) 特征相似性指数分析器,基于相位一致性和梯度幅度比较两张图像的结构相似性 FSIM 值
视频质量分析器
SubjectConsistencyAnalyzer 质量(视频) 评估视频中主体对象的一致性 主体一致性分数
BackgroundConsistencyAnalyzer 质量(视频) 评估视频中背景的连贯性和稳定性 背景一致性分数
MotionSmoothnessAnalyzer 质量(视频) 评估视频运动的平滑度 运动平滑度指标
DynamicDegreeAnalyzer 质量(视频) 测量视频中的动态水平和变化幅度 动态度值
ImagingQualityAnalyzer 质量(视频) 综合评估视频成像质量 成像质量分数

🧩 快速开始

Google Colab 演示

如果您想在不安装任何内容的情况下试用 MarkDiffusion,可以使用 Google Colab 查看其工作方式。

安装

(推荐) 我们为 MarkDiffusion 发布了 pypi 包。您可以直接使用 pip 安装:

conda create -n markdiffusion python=3.11
conda activate markdiffusion
pip install markdiffusion[optional]

(替代方案)对于仅限于使用 conda 环境的用户,我们还提供了 conda-forge 包,可以使用以下命令安装:

conda create -n markdiffusion python=3.11
conda activate markdiffusion
conda config --add channels conda-forge
conda config --set channel_priority strict
conda install markdiffusion

但是,请注意,某些高级功能需要 conda 上不可用的额外包,因此无法包含在发布版本中。如有必要,您需要单独安装这些包。

如何使用工具包

安装后,有两种方式使用 MarkDiffusion:

  1. 克隆仓库以尝试演示或用于自定义开发。 MarkDiffusion_demo.ipynb notebook 提供了各种用例的详细演示——请查看以获取指导。以下是使用 TR 算法生成和检测带水印图像的快速示例:

    import torch
    from watermark.auto_watermark import AutoWatermark
    from utils.diffusion_config import DiffusionConfig
    from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
    
    # 设备设置
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    
    # 配置扩散流水线
    scheduler = DPMSolverMultistepScheduler.from_pretrained("model_path", subfolder="scheduler")
    pipe = StableDiffusionPipeline.from_pretrained("model_path", scheduler=scheduler).to(device)
    diffusion_config = DiffusionConfig(
        scheduler=scheduler,
        pipe=pipe,
        device=device,
        image_size=(512, 512),
        num_inference_steps=50,
        guidance_scale=7.5,
        gen_seed=42,
        inversion_type="ddim"
    )
    
    # 加载水印算法
    watermark = AutoWatermark.load('TR', 
                                algorithm_config='config/TR.json',
                                diffusion_config=diffusion_config)
    
    # 生成带水印的媒体
    prompt = "A beautiful sunset over the ocean"
    watermarked_image = watermark.generate_watermarked_media(prompt)
    watermarked_image.save("watermarked_image.png")
    
    # 检测水印
    detection_result = watermark.detect_watermark_in_media(watermarked_image)
    print(f"Watermark detected: {detection_result}")
  2. 在代码中直接导入 markdiffusion 库,无需克隆仓库。 MarkDiffusion_pypi_demo.ipynb notebook 提供了通过 markdiffusion 库使用 MarkDiffusion 的全面示例——请查看以获取指导。以下是一个快速示例:

    import torch
    from markdiffusion.watermark import AutoWatermark
    from markdiffusion.utils import DiffusionConfig
    from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
    
    # 设备
    device = "cuda" if torch.cuda.is_available() else "cpu"
    print(f"Using device: {device}")
    
    # 模型路径
    MODEL_PATH = "huanzi05/stable-diffusion-2-1-base"
    
    # 初始化调度器和流水线
    scheduler = DPMSolverMultistepScheduler.from_pretrained(MODEL_PATH, subfolder="scheduler")
    pipe = StableDiffusionPipeline.from_pretrained(
        MODEL_PATH,
        scheduler=scheduler,
        torch_dtype=torch.float16 if device == "cuda" else torch.float32,
        safety_checker=None,
    ).to(device)
    
    # 创建用于图像生成的 DiffusionConfig
    image_diffusion_config = DiffusionConfig(
        scheduler=scheduler,
        pipe=pipe,
        device=device,
        image_size=(512, 512),
        guidance_scale=7.5,
        num_inference_steps=50,
        gen_seed=42,
        inversion_type="ddim"
    )
    
    # 加载 Tree-Ring 水印算法
    tr_watermark = AutoWatermark.load('TR', diffusion_config=image_diffusion_config)
    print("TR watermark algorithm loaded successfully!")
    
    # 生成带水印的图像
    prompt = "A beautiful landscape with mountains and a river at sunset"
    
    watermarked_image = tr_watermark.generate_watermarked_media(input_data=prompt)
    
    # 显示带水印的图像
    watermarked_image.save("watermarked_image.png")
    print("Watermarked image generated!")
    
    # 检测带水印图像中的水印
    detection_result = tr_watermark.detect_watermark_in_media(watermarked_image)
    print("Watermarked image detection result:")
    print(detection_result)

🛠 测试模块

我们提供了一套全面的测试模块来确保代码质量。该模块包含658个单元测试,覆盖率约为95%。详情请参考 test/ 目录。

引用

@article{pan2025markdiffusion,
  title={MarkDiffusion: An Open-Source Toolkit for Generative Watermarking of Latent Diffusion Models},
  author={Pan, Leyi and Guan, Sheng and Fu, Zheyu and Si, Luyang and Wang, Zian and Hu, Xuming and King, Irwin and Yu, Philip S and Liu, Aiwei and Wen, Lijie},
  journal={arXiv preprint arXiv:2509.10569},
  year={2025}
}