
Hipervínculos Invisibles en Fotografías Físicas
Matthew Tancik, Ben Mildenhall, Ren Ng Universidad de California, Berkeley

Este repositorio es una versión del código del informe de ArXiv que se encuentra aquí. El proyecto explora ocultar datos en imágenes manteniendo la similitud perceptual. Nuestra contribución es la capacidad de extraer los datos después de que la imagen codificada (StegaStamp) ha sido impresa y fotografiada con una cámara (estos pasos introducen corrupciones en la imagen). Este repositorio contiene el código y los modelos preentrenados para replicar los resultados mostrados en el artículo. Además, el repositorio contiene el código necesario para entrenar los modelos codificador y decodificador.
Si encuentra nuestro trabajo útil, considere citar:
@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_PATH = DIR_OF_DATASET_IMAGES
bash scripts/base.sh EXP_NAME
El entrenamiento se realiza en train.py. Hay varios hiperparámetros, muchos correspondientes a los parámetros de aumento. scripts/bash.sh proporciona un buen punto de partida.
El código de entrenamiento para el modelo detector (utilizado para segmentar StegaStamps) no está incluido en este repositorio. El modelo utilizado en el artículo fue entrenado usando el modelo BiSeNet publicado aquí. CROP_WIDTH y CROP_HEIGHT se establecieron en 1024, todos los demás parámetros se configuraron por defecto. El conjunto de datos se generó colocando aleatoriamente StegaStamps deformados en imágenes más grandes.
Para visualizar el entrenamiento, ejecute el siguiente comando y navegue a http://localhost:6006 en su navegador.
tensorboard --logdir logs
El script encode_image.py se puede usar para codificar un mensaje en una imagen o un directorio de imágenes. El modelo predeterminado espera un secreto codificado en utf-8 de <= 7 caracteres (mensaje de 100 bits -> 56 bits después de ECC).
Codificar un mensaje en una imagen:
python encode_image.py \
saved_models/stegastamp_pretrained \
--image test_im.png \
--save_dir out/ \
--secret Hello
Esto guardará tanto el StegaStamp como el residual que se aplicó a la imagen original.
El script decode_image.py se puede usar para decodificar un mensaje de un StegaStamp.
Ejemplo de uso:
python decode_image.py \
saved_models/stegastamp_pretrained \
--image out/test_hidden.png
El script detector.py se puede usar para detectar y decodificar StegaStamps en una imagen. Esto es útil en casos donde hay múltiples StegaStamps presentes o el StegaStamp no llena el cuadro de la imagen.
Para usar el detector, asegúrese de descargar el modelo detector como se describe en la sección de instalación. La resolución de video de entrada recomendada es 1920x1080.
python detector.py \
--detector_model detector_models/stegastamp_detector \
--decoder_model saved_models/stegastamp_pretrained \
--video test_vid.mp4
Agregue la bandera --save_video FILENAME para guardar los resultados.
La bandera --visualize_detector se puede usar para visualizar la salida de la red detectora. La máscara corresponde a la máscara de segmentación, los polígonos coloreados se ajustan a esta máscara de segmentación usando un conjunto de heurísticas. Las salidas del detector pueden ser ruidosas y son sensibles al tamaño del stegastamp. No se explora una optimización adicional de la red de detección en este artículo.