🔥 作为一个新发布的项目,我们欢迎 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 是一个用于潜在扩散模型生成式水印的开源 Python 工具包。随着基于扩散的生成模型应用范围的扩大,确保生成媒体的真实性和来源变得至关重要。MarkDiffusion 简化了水印技术的访问、理解和评估,使研究人员和更广泛的社区都能轻松使用。注意:如果您对 LLM 水印(文本水印)感兴趣,请参考我们团队的 MarkLLM 工具包。
该工具包包含三个关键组件:统一的实现框架,用于简化水印算法集成和用户友好的界面;机制可视化套件,直观地展示添加和提取的水印模式,帮助公众理解;以及全面的评估模块,提供 31 个工具的标准实现,涵盖三个关键方面——可检测性、鲁棒性和输出质量,以及 6 个自动化评估流水线。
-
统一实现框架: MarkDiffusion 提供了一个模块化架构,支持十一种最先进的 LDM 生成式图像/视频水印算法。
-
全面的算法支持: 目前实现了来自两大类别的 11 种水印算法:基于模式的方法(Tree-Ring、Ring-ID、ROBIN、WIND、SFW)和基于密钥的方法(Gaussian-Shading、PRC、SEAL、VideoShield、GaussMarker、VideoMark)。
-
可视化解决方案: 该工具包包含定制的可视化工具,能够清晰而深入地展示不同水印算法在各种场景下的运行方式。这些可视化有助于揭示算法机制,使其对用户更易理解。
-
评估模块: 拥有 31 个评估工具,涵盖可检测性、鲁棒性和对输出质量的影响,MarkDiffusion 提供全面的评估能力。它具有 6 个自动化评估流水线:水印检测流水线、图像质量分析流水线、视频质量分析流水线以及专门的鲁棒性评估工具。
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 | 质量(视频) | 综合评估视频成像质量 | 成像质量分数 |
如果您想在不安装任何内容的情况下试用 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:
-
克隆仓库以尝试演示或用于自定义开发。
MarkDiffusion_demo.ipynbnotebook 提供了各种用例的详细演示——请查看以获取指导。以下是使用 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}")
-
在代码中直接导入 markdiffusion 库,无需克隆仓库。
MarkDiffusion_pypi_demo.ipynbnotebook 提供了通过 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}
}

