Matthew Tancik,Ben Mildenhall,Ren Ng 加州大学伯克利分校

此仓库是 arXiv 报告(链接为英文)的代码发布版。该项目探索了在保持感知相似性的同时将数据隐藏到图像中。我们的贡献在于:编码图像(StegaStamp)经过打印并用相机拍摄后(这些步骤会引入图像失真),仍能提取出其中的数据。本仓库包含用于复现论文中结果的代码和预训练模型。此外,还包含训练编码器和解码器模型所需的代码。
如果您觉得我们的工作有用,请考虑引用:
@inproceedings{2019stegastamp,
title={StegaStamp: Invisible Hyperlinks in Physical Photographs},
author={Tancik, Matthew and Mildenhall, Ben and Ng, Ren},
booktitle={IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2020}
}
git clone --recurse-submodules https://github.com/tancik/StegaStamp.git
cd StegaStamp
pip install -r requirements.txt
train.py 中设置数据集路径TRAIN_PATH = DIR_OF_DATASET_IMAGES
bash scripts/base.sh EXP_NAME
训练在 train.py 中执行。包含许多超参数,其中大部分对应数据增强参数。scripts/bash.sh 是一个很好的起点。
检测器模型(用于分割 StegaStamp)的训练代码未包含在此仓库中。论文中使用的模型是通过 这里 发布的 BiSeNet 模型训练的。CROP_WIDTH 和 CROP_HEIGHT 设置为 1024,其他参数均使用默认值。数据集通过将扭曲的 StegaStamp 随机放置到更大的图像上生成。
要可视化训练过程,请运行以下命令并在浏览器中访问 http://localhost:6006。
tensorboard --logdir logs
脚本 encode_image.py 可用于将消息编码到单张图像或一个图像目录中。默认模型接受长度不超过 7 个字符的 UTF-8 编码秘密(100 位消息 → 经过 ECC 后为 56 位)。
将消息编码到图像中:
python encode_image.py \
saved_models/stegastamp_pretrained \
--image test_im.png \
--save_dir out/ \
--secret Hello
这将保存 StegaStamp 以及应用于原始图像的残差。
脚本 decode_image.py 可用于从 StegaStamp 中解码消息。
示例用法:
python decode_image.py \
saved_models/stegastamp_pretrained \
--image out/test_hidden.png
脚本 detector.py 可用于检测并解码图像中的 StegaStamp。这在存在多个 StegaStamp 或 StegaStamp 未填满图像帧的情况下很有用。
要使用检测器,请确保按安装部分的说明下载检测器模型。建议输入视频分辨率为 1920x1080。
python detector.py \
--detector_model detector_models/stegastamp_detector \
--decoder_model saved_models/stegastamp_pretrained \
--video test_vid.mp4
添加 --save_video FILENAME 标志以保存输出结果。
--visualize_detector 标志可用于可视化检测网络的输出。掩码对应分割掩码,彩色多边形通过一组启发式规则拟合到该分割掩码上。检测器输出可能存在噪声,且对 StegaStamp 的大小敏感。本文未进一步优化检测网络。