
Hiperlinks Invisíveis em Fotografias Físicas
Matthew Tancik, Ben Mildenhall, Ren Ng Universidade da Califórnia, Berkeley

Este repositório é uma versão do código para o relatório ArXiv encontrado aqui. O projeto explora a ocultação de dados em imagens mantendo a similaridade perceptual. Nossa contribuição é a capacidade de extrair os dados depois que a imagem codificada (StegaStamp) foi impressa e fotografada com uma câmera (essas etapas introduzem corrupções na imagem). Este repositório contém o código e os modelos pré-treinados para replicar os resultados mostrados no artigo. Além disso, o repositório contém o código necessário para treinar os modelos codificador e decodificador.
Se você achar nosso trabalho ú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
O treinamento é realizado em train.py. Existem vários hiperparâmetros, muitos correspondentes aos parâmetros de aumento de dados. scripts/bash.sh fornece um bom ponto de partida.
O código de treinamento para o modelo detector (usado para segmentar StegaStamps) não está incluído neste repositório. O modelo usado no artigo foi treinado usando o modelo BiSeNet disponibilizado aqui. CROP_WIDTH e CROP_HEIGHT foram definidos como 1024, todos os outros parâmetros foram mantidos como padrão. O dataset foi gerado colocando aleatoriamente StegaStamps distorcidos em imagens maiores.
Para visualizar o treinamento, execute o seguinte comando e navegue até http://localhost:6006 no seu navegador.
tensorboard --logdir logs
O script encode_image.py pode ser usado para codificar uma mensagem em uma imagem ou em um diretório de imagens. O modelo padrão espera um segredo codificado em utf-8 com até 7 caracteres (mensagem de 100 bits -> 56 bits após ECC).
Codifique uma mensagem em uma imagem:
python encode_image.py \
saved_models/stegastamp_pretrained \
--image test_im.png \
--save_dir out/ \
--secret Hello
Isso salvará tanto o StegaStamp quanto o resíduo aplicado à imagem original.
O script decode_image.py pode ser usado para decodificar uma mensagem de um StegaStamp.
Exemplo de uso:
python decode_image.py \
saved_models/stegastamp_pretrained \
--image out/test_hidden.png
O script detector.py pode ser usado para detectar e decodificar StegaStamps em uma imagem. Isso é útil em casos onde há vários StegaStamps presentes ou o StegaStamp não preenche o quadro da imagem.
Para usar o detector, certifique-se de baixar o modelo detector conforme descrito na seção de instalação. A resolução de vídeo recomendada para entrada é 1920x1080.
python detector.py \
--detector_model detector_models/stegastamp_detector \
--decoder_model saved_models/stegastamp_pretrained \
--video test_vid.mp4
Adicione a flag --save_video FILENAME para salvar os resultados.
A flag --visualize_detector pode ser usada para visualizar a saída da rede detectora. A máscara corresponde à máscara de segmentação; os polígonos coloridos são ajustados a essa máscara de segmentação usando um conjunto de heurísticas. As saídas do detector podem ser ruidosas e são sensíveis ao tamanho do stegastamp. A otimização adicional da rede de detecção não é explorada neste artigo.