跳转至

Humanizer — 对抗 AI 分类器

文件humanizer.py(51 行)

原理来源:NeuralBleach (MIT)

问题背景

AI 生成图像有一个共同特征:数字完美性

  • 完全无胶片颗粒噪声
  • 无光学色差(chromatic aberration)
  • 像素统计高度规则
  • 频域特征干净

AI 图像分类器(如 Hive Moderation、Optic AI、Illuminarty)正是利用这些特征来判断图像是否为 AI 生成。

解决方案:注入模拟胶片缺陷

通过人为注入胶片摄影的特征,使 AI 生成图像在统计特征上接近真实相机拍摄的照片。

实现

def apply_analog_humanizer(image, grain_intensity=4.0, chromatic_shift=1):
    img_f = image.astype(np.float64)
    r, g, b = img_f[:,:,0], img_f[:,:,1], img_f[:,:,2]

    # 1. 色差注入(chromatic aberration)
    r = np.roll(r, -chromatic_shift, axis=1)  # 红通道左移
    b = np.roll(b, chromatic_shift, axis=1)   # 蓝通道右移

    # 2. 胶片颗粒(高斯噪声)
    noise = np.random.normal(0, grain_intensity, img_f.shape)
    humanized = np.clip(img_f + noise, 0, 255).astype(np.uint8)

    return humanized

两个效果

1. 色差注入

真实相机镜头存在色差——不同波长的光折射角不同,导致 RGB 通道有微小的空间偏移。AI 生成图像完全没有这种偏移。

r = np.roll(r, -1, axis=1)  # 红通道向左偏移 1 像素
b = np.roll(b, 1, axis=1)   # 蓝通道向右偏移 1 像素

偏移量 chromatic_shift=1 像素——肉眼几乎不可见,但足以打破 AI 图像的"零色差"特征。

2. 胶片颗粒

真实胶片(甚至数码相机在高 ISO 下)都有颗粒噪声。AI 生成图像的像素值过于"干净"。

noise = np.random.normal(0, grain_intensity, img_f.shape)
# grain_intensity 典型值:2.0 ~ 6.0
  • 2.0:极轻微,肉眼几乎看不出
  • 4.0:中等,轻微胶片感
  • 6.0:明显,模拟高 ISO 胶片

参数调优

参数 范围 效果
grain_intensity 2.0 - 6.0 噪声强度,越高越"胶片"
chromatic_shift 1 - 3 色差偏移像素数,1 即可

使用方式

# CLI
remove-ai-watermarks invisible image.png -o clean.png --humanize 4.0

# Python API
from remove_ai_watermarks.humanizer import apply_analog_humanizer
result = apply_analog_humanizer(image, grain_intensity=4.0, chromatic_shift=1)

局限性

  • Humanizer 对抗的是统计特征检测器,不是对抗专门训练的分类器
  • 如果分类器训练数据包含胶片风格的 AI 图像,Humanizer 效果会减弱
  • 高 grain_intensity 会降低图像质量——需要在"绕过检测"和"视觉质量"之间取平衡
  • 对抗 GAN 指纹检测器(如 EXIF-based 方法)无效

与其他工具的关系

Humanizer 在 InvisibleEngine 的后处理阶段执行:

水印移除 → 人脸恢复 → Humanizer → 上采样 → 输出

它不是独立的水印去除手段,而是作为"最后一道伪装"叠加在扩散再生之后。