揭秘版权保护下的视频隐形水印算法(下篇)
视频水印,作为保护知识产权的重要手段,早已被大众习惯且接受,但是这种方法仍然存在着多方面的不足。对于观众来说,盖在画面一角的 logo 多少会影响到他们的观赏体验。对于视频所有者来说,这种直接显示在画面上的水印也很容易被定位和攻击。一些厂家为了应对这些攻击,将水印时不时地从随机的方向插入到画面里,从而增加 delogo 的难度,但这就更进一步降低了观众的观看体验。针对这些问题,隐形水印这门技术被提出并逐渐发展了起来。在《视频隐形水印算法(上篇)》中,我们给大家介绍了封装层以及基于 LSB 的隐形水印技术。这些方法虽然运算量较低,易于实现,但添加的水印也比较脆弱。比起保护知识版权,它们更多地被应用于隐藏数据或传输附属信息。接下来,本文将介绍一些在变换域上操作的隐形水印算法,它们能够更好地应对各类攻击。在阅读本文前可能需要一些前置知识,包括离散余弦变换(DCT),离散小波变换(DWT)以及奇异值分解(SVD)等等。若你对这些内容感到陌生,可以浏览以下几个知乎专栏文章链接大致了解一下:
详解离散余弦变换(DCT):https://zhuanlan.zhihu.com/p/85299446
形象易懂讲解算法 I——小波变换:https://zhuanlan.zhihu.com/p/22450818
奇异值分解(SVD):https://zhuanlan.zhihu.com/p/29846048
01 DCT 隐形水印
基于 DCT 的隐形水印是一类很常见的隐形水印算法,选择 DCT 的原因有很多。
一是人眼对图像中不同频率的信号敏感程度不同,直接在频率域上操作数据有利于控制主观感知到的失真程度,以保证水印的“隐形”。
二是不同频率的信号稳定性不同,在频率域加水印有助于控制水印的鲁棒性,保证水印在载体经历各类损伤后依然能够还原出来。三是理论上这类方法可以直接嵌入一些编码器,从而减少运算量。
但需要注意的是,上述一二两点其实是有矛盾的,水印数据所属的频率范围越低,鲁棒性越高,但图像失真也越大,反之亦然。因此大部分实现会选择在中频范围内添加水印。
下图是一个常见的水印嵌入流程。图像经过 DCT 变换后,把水印数据加到选好的频率系数上,再使用 IDCT 还原图像,这样水印的嵌入就完成了。
常见的基于 DCT 的水印嵌入流程
如果在提取水印时有原始图像作为参考,则图中的嵌入逻辑一般有如下几种选择。式中 vi 表示原始系数,xi 表示水印系数,α为常量。
有参时的水印嵌入公式
对应的水印提取流程
如果没有原始图像做参考,那么可以参考上篇的 LSB 方法,在嵌入时将原始系数以低精度形式量化,再将水印数据存储在高精度的区域中。
02 DWT 与 SVD
上文有提到隐形水印算法需要同时满足低视觉损失和高鲁棒性。能达到这个效果的工具不止 DCT,DWT 和 SVD 也是两个常见的选择。其中 DWT 一般使用 Haar 小波,其运算量较低,可以将图像分解成不同频带的四份,并且可以递归地执行多次,显著减少后续需要处理的数据量。因此它常被用来做隐形水印的预处理。而 SVD 则是将图像数据单纯地视为二维矩阵,利用奇异值的稳定性来保护水印。
下图是一个结合 DWT 和 SVD 的隐形水印例子。图中虽然仅进行了一轮 DWT,并选择了 LL 低频数据进行处理。但实际上也存在使用多轮 DWT,以及利用 LH 和 HL 数据做 SVD 的实现。它们对应的水印提取流程也只是个逆过程,这里就不再贴图了。
基于 DWT 与 SVD 的水印嵌入例子
03 万事皆可机器学习
为了进一步提升效果,一些研究者们也跟着流行的脚步,尝试使用机器学习的方法实现隐形水印。例如笔者撰写此文时参考的 Python 开源库 invisible-watermark[2]中,就有一种机器学习实现,名叫 RivaGAN。其框架如下图所示。Attention 模块根据原始图像推导出目标数据的分布 Attention Mask,Encoder 模块再利用这个数据将水印数据 D 嵌入视频中。RivaGan 在训练过程中分别使用了一个 Critic 网络评估画面失真和一个 Adversary 网络模拟主动攻击,并且增加了人工设计的 Noise 网络模拟常见的传输失真(包括缩放、裁剪、有损压缩),以期同时在画面失真和鲁棒性方面得到较好的结果。
RivaGAN 的水印处理流程
04 水印的混淆与加密
使用隐形水印时一般需要公开算法,毕竟没有人信任一个黑盒子的提取结果。但公开后,再复杂的水印嵌入方法都有被攻击者提取、抹除甚至替换可能性。为了防止这种情况,在嵌入水印时,往往会对水印数据本身或者嵌入的坐标信息进行混淆加密,通过 key 的形式管理。这样一来,只要攻击者没有密钥,即便他们已经知道水印的嵌入方式,也没办法探测出原有的水印数据。
完整的隐形水印系统
05 总结
本文简单介绍了隐形水印的频域方法和机器学习方法。由于这半篇内容涉及到了一些专业知识,无法像上篇那样详细地解释原理和细节。若读者对省略的部分感兴趣,除了相关论文,阅读 Python 的 invisibal-watermak 库源码也是一个不错的选择,它实现了三种水印嵌入方案,本文提到的几种变换都有用到。
参考文献
[1] I.J. Cox, J. Kilian, F.T. Leighton, T. Shamoon. Secure spread spectrum watermarking for multimedia. 1997.
[2] https://github.com/ShieldMnt/invisible-watermark
[3] Zhang, Kevin Alex and Xu, Lei and Cuesta-Infante, Alfredo and Veeramachaneni, Kalyan. Robust Invisible Video Watermarking with Attention. MIT EECS, September 2019.
[4] C.I. Podilchuk, E.J. Delp. Digital watermarking: algorithms and applications. 2001.
版权声明: 本文为 InfoQ 作者【拍乐云Pano】的原创文章。
原文链接:【http://xie.infoq.cn/article/d3456e6984c4c0add073c9f77】。文章转载请联系作者。
评论