参考链接:
[CVPR 2022] 基于图像解耦生成的无嵌入隐写 - 知乎 这篇论文介绍的很好
信息隐藏|Image Disentanglement Autoencoder for Steganography without Embedding实现无嵌入隐写的 图像无纠缠自动隐写器
代码:https://github.com/Lemok00/IDEAS
无嵌入隐写(steganography without embedding, SWE)隐藏秘密信息的过程不会直接修改载体图像,因此具有免疫传统隐写分析器攻击的独特优势。
现有无嵌入隐写可以分为两类:
- 基于映射的SWE通过设计映射机制,将秘密信息转换为从现有图像集中选取的图像哈希序列,其关键缺陷在于载密容量很小;
- 基于生成的SWE提出训练生成对抗网络(generative adversarial networks,GANs)等深度生成网络,通过生成器将秘密信息转换为生成图像以隐藏秘密信息。
现有基于生成的SWE的三个问题:(1)生成的载密图像不够真实,影响对不可察觉性(imperceptibility)的要求;(2)生成器的生成多样性受限,可能引发潜在的安全问题;(3)秘密信息的提取准确率较低。
本文提出了一种基于生成的SWE方法——用于隐写术的图像解耦自动编码器IDEAS(Image DisEntanglement Autoencoder for Steganography)。通过将图像解耦为结构和纹理两种特征,IDEAS可以利用结构特征的稳定性提升秘密信息的提取准确率,同时利用随机采样纹理特征提升生成多样性,从而提高隐写的安全性。此外,作者还设计了一种自适应映射机制,在确保不同等级的提取要求的前提下,进一步增强合成图像的多样性。
本文提出的IDEAS网络的训练流程图,包括三个部分:(a)编码结构和纹理持征,(b)合成图像、©提取输入秘密张量。
解耦编码器 E,将图像解耦编码为结构张量和纹理向量两种特征;
生成器 G,根据结构张量和纹理向量生成真实图像;
结构生成器G_stru ,将均匀采样的秘密张量转换到结构特征空间,以隐藏秘密信息;
提取器Ex ,从编码的结构张量中进一步提取秘密张量;
图像判别器 D_real,预测输入图像为真实图像的概率;
纹理判别器D_co ,预测输入图像块和参考图像块来自同一图像的概率;
分布判别器D_dist ,预测输入向量来自特定分布的概率。
IDEAS的训练过程包含三部分:
(1)特征编码和生成(Feature encoding and generation)部分:训练编码器将参考图像解耦为结构特征和纹理特征,并通过分布判别器和判别损失强制纹理编码空间符合用于随机采样纹理的特定分布([-1, 1]区间上的均匀分布),以及训练结构生成器将均匀采样的秘密张量转换到结构特征空间以隐藏秘密信息;
(2)图像生成(Image synthesis)部分:通过训练生成器根据不同的结构和纹理特征组合生成图像,并通过重建损失约束图像重建能力、通过纹理判别器约束生成图像的纹理相似度、通过图像判别器约束生成图像的真实度,从而实现高质量的图像解耦生成; 采用StyleGAN2作为backbone architecture
(3)秘密张量提取(Secret tensor extraction):训练编码器从生成图像中恢复其原始结构特征,并训练提取器从提取的结构特征中提取秘密张量。
图2为IDEAS的秘密通信流程图,主要包括两个阶段:
(1)隐藏阶段(Hiding phase)用于秘密信息的发送,该阶段首先将秘密信息映射为秘密张量,然后使用结构生成器转换为结构特征并和随机采样的纹理特征一起输入生成器生成载密图像;
(2)提取阶段(Extraction phase)用于秘密信息的提取,该阶段首先使用编码器恢复载密图像的结构特征,然后使用提取器提取秘密张量,最后将秘密张量逆向映射为秘密信息。
为了提高安全性(合成风格多样性),作者设计了自适应的映射机制,根据映射参数的不同,IDEAS具有三种模式:(1)应对需要高提取准确率应用场景的提取优先模式;(2)平衡模式;(3)应对需要高安全性应场景的多样性优先模式。
重点关注安全性和提取准确性(这个一直是神经网络模型的弱点)
提取准确率在256bit和512bit时接近100% ,隐藏容量为256×σ(范围为1,2,3)×N(范围为1,2)
IDEAS生成的载密图像具有真实的结构、清晰的纹理和多样的风格,在生成图像质量和隐写安全性方面具有显著优势。
实验设置:
数据集: IDEAS和基线模型是在来自两个公开可用数据集的三个子集上进行训练的,分别是来自LSUN的卧室和教堂图像,以及来自FFHQ的人脸图像。每个子集包括70,000个随机选择的图像,归一化为256 × 256像素。
评价指标: 通过比较受试者工作特征(ROC)曲线下面积(AUC)和Frechet初始距离(FID)来评估模型,以衡量隐写分析工具和主观视觉感知的不可检测性。同时,我们比较了不同隐藏容量下IDEAS与基准SWE方法的秘密消息提取精度。IDEAS总共包含64.5M个参数,图像合成耗时12.0 ms,消息提取耗时9.4 ms。
容量在256bit~1536bit之间
代码复现
01 下载LSUN数据集
以下3种下载方式任选一种:
1)https://pan.baidu.com/s/17cf-7ZktjbmitZUzt9KJTg#list/path=%2F 提取码:gyl5 (开VIP速度很快)
2)http://dl.yf.io/lsun/scenes/
3)https://github.com/fyu/lsun 用脚本-c传场景参数
02 train
- 命令行python train的时候报错:
OSError: /home/miniconda3/envs/IDEAS/lib/python3.7/site-packages/nvidia/cublas/lib/libcublas.so.11: undefined symbol: cublasLtGetStatusString, version libcublasLt.so.11
原因: CUDA和nvidia版本不匹配 https://blog.csdn.net/bulucc/article/details/130406842
解决方案: 添加报错的lib路径 - apt-get update时报错
E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决方案:https://blog.csdn.net/zjrwinner/article/details/131785246
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
如果还无法解决再输入:
sudo dpkg --configure -a
sudo rm /var/lib/dpkg/lock-frontend
RuntimeError: Ninja is required to load C++ extensions
解决方案:sudo apt-get install ninja-build
pip3 install ninja
-
sudo apt-get install ninja-build
报错pkg: 依赖关系问题使得 ubuntu-drivers-common 的配置工作不能继续: ubuntu-drivers-common 依赖于 udev (>= 204-0ubuntu4~);然而:软件包 udev 尚未配置。 dpkg: 处理软件包 ubuntu-drivers-common (--configure)时出错: 依赖关系问题 - 仍未被配置 dpkg: 依赖关系问题使得 update-notifier 的配置工作不能继续: update-notifier 依赖于 ubuntu-drivers-common;然而:软件包 ubuntu-drivers-common 尚未配置。
解决方案: pip安装即可
以下命令可能会导致系统错误,不建议使用(踩坑记录)
1. 运行以下命令,重新配置udev软件包:
sudo dpkg --configure udev
如果该命令成功完成,则再次尝试配置ubuntu-drivers-common软件包。
2. 如果第一种方法不起作用,您可以尝试运行以下命令以强制重新配置所有未配置的软件包:
sudo dpkg --configure -a
这将尝试重新配置所有具有未满足依赖项的软件包。
3. 如果上述方法都没有解决问题,您可以尝试删除相关软件包并重新安装。运行以下命令来删除ubuntu-drivers-common和udev软件包:
sudo apt-get remove ubuntu-drivers-common udev
我在这一步之后就可以安装ninja-build了
然后运行以下命令重新安装这些软件包:
sudo apt-get install ubuntu-drivers-common udev
** -
ubuntu下安装ImageMagick7 参考这篇文章
排掉这些bug,就可以进行训练了
python train.py --exp_name NAME --dataset_type TYPE --dataset_path PATH --num_iters ITERS
训练结果: