0x00 开源链接
0x01 原理讲解
首先,通过加载预训练的模型,对图片的任意颜色通道进行特征提取,生成一个水印检测的概率图。概率图中每个像素的值表示该像素属于水印的可能性。可以通过设置 threshold 来决定水印检测的敏感度。
网络的简要结构如下:
graph TD
A[Input: 1 Channel] --> B[Conv2d: 1->16, 7x7, Padding=3]
B --> C[LeakyReLU]
C --> D[Conv2d: 16->32, 7x7, Padding=3]
D --> E[LeakyReLU]
E --> F[Conv2d: 32->128, 7x7, Padding=3]
F --> G[LeakyReLU]
G --> H[Conv2d: 128->4, 11x11, Padding=5]
H --> I[LeakyReLU]
I --> J[Conv2d: 4->1, 3x3, Padding=1]
J --> K[Output: 1 Channel]
这种结构适合处理输入特征较少,但需要逐步提取高层次特征并回归为单通道输出的任务,例如图像特征提取、语义分割或深度估计等任务。
然后进行形态学处理(Erosion 和 Dilation):使用数学形态学操作对生成的Mask进行优化。Erosion(腐蚀)减小Mask范围,去除可能的误标记区域。Dilation(膨胀)增大Mask范围,确保水印区域完全覆盖。
传统理论认为Erosion + Dilation可以共同构成图像开运算。然而当噪声较大时,当噪声较大时,Dilation 的模板略大于 Erosion 的模板,可以更有效地平滑噪声,同时保留目标结构的完整性。在噪声较多的情况下,Erosion 会导致目标边缘部分变薄或断裂,而随后的 Dilation 使用较大的模板能够填补这些缺失部分,恢复结构的连续性,避免目标形态因噪声而被过度削弱。
最后使用Stable Diffusion进行局部重绘。