Skip to content

HighCapacityImage

stegobox.codec.HighCapacityImage

Bases: BaseCodec

HighCapacityImage is a steganography method for Image.

Source code derived from: Atenrev/Deep-Image-Steganography-Reimplementation

Source code in stegobox/codec/high_capacity_image/high_capacity_image.py
class HighCapacityImage(BaseCodec):
    """
    HighCapacityImage is a steganography method for Image.

    Source code derived from:
    [Atenrev/Deep-Image-Steganography-Reimplementation](https://github.com/Atenrev/Deep-Image-Steganography-Reimplementation)
    """

    def __init__(self) -> None:
        super().__init__()
        self.Hnet_path = (
            "ckpt/high_capacity_video/netH_epoch_73,sumloss=0.000447,Hloss=0.000258.pth"
        )
        self.Rnet_path = (
            "ckpt/high_capacity_video/netR_epoch_73,sumloss=0.000447,Rloss=0.000252.pth"
        )

        self.Hnet = UnetGenerator(
            input_nc=6, output_nc=3, num_downs=7, output_function=nn.Sigmoid
        )
        self.Hnet.cuda()
        self.Hnet.apply(weights_init)
        self.Hnet.load_state_dict(torch.load(self.Hnet_path))

        self.Rnet = RevealNet(output_function=nn.Sigmoid)
        self.Rnet.cuda()
        self.Rnet.apply(weights_init)
        self.Rnet.load_state_dict(torch.load(self.Rnet_path))

        self.Hnet.eval()
        self.Rnet.eval()

    def my_transform(self, image):
        transform = transforms.Compose(
            [
                transforms.Resize([256, 256]),
                transforms.ToTensor(),
            ]
        )
        return transform(image)  # type: ignore

    def encode(self, carrier: Image.Image, payload: Image.Image) -> Image.Image:
        """Merge secret_img into host image

        Args:
            carrier: host image
            payload: payload in bits per pixel

        Returns:
            Image: stego image.
        """

        cover_img = self.my_transform(carrier).unsqueeze(0)
        secret_img = self.my_transform(payload).unsqueeze(0)

        concat_img = torch.cat([cover_img, secret_img], dim=1)
        concat_img = concat_img.cuda()

        with torch.no_grad():
            stego = self.Hnet(concat_img)
        to_pil = transforms.ToPILImage()
        return to_pil(stego.squeeze(0))

    def decode(self, carrier: Image.Image) -> Image.Image:
        """Extract payload from stego image

        Args:
            carrier: stego image

        Returns:
            Decoded payload image
        """

        with torch.no_grad():
            transf = transforms.ToTensor()
            rev_secret_img = self.Rnet(transf(carrier).unsqueeze(0).cuda())
        to_pil = transforms.ToPILImage()
        return to_pil(rev_secret_img.squeeze(0))

encode(carrier, payload)

Merge secret_img into host image

Parameters:

Name Type Description Default
carrier Image

host image

required
payload Image

payload in bits per pixel

required

Returns:

Name Type Description
Image Image

stego image.

Source code in stegobox/codec/high_capacity_image/high_capacity_image.py
def encode(self, carrier: Image.Image, payload: Image.Image) -> Image.Image:
    """Merge secret_img into host image

    Args:
        carrier: host image
        payload: payload in bits per pixel

    Returns:
        Image: stego image.
    """

    cover_img = self.my_transform(carrier).unsqueeze(0)
    secret_img = self.my_transform(payload).unsqueeze(0)

    concat_img = torch.cat([cover_img, secret_img], dim=1)
    concat_img = concat_img.cuda()

    with torch.no_grad():
        stego = self.Hnet(concat_img)
    to_pil = transforms.ToPILImage()
    return to_pil(stego.squeeze(0))

decode(carrier)

Extract payload from stego image

Parameters:

Name Type Description Default
carrier Image

stego image

required

Returns:

Type Description
Image

Decoded payload image

Source code in stegobox/codec/high_capacity_image/high_capacity_image.py
def decode(self, carrier: Image.Image) -> Image.Image:
    """Extract payload from stego image

    Args:
        carrier: stego image

    Returns:
        Decoded payload image
    """

    with torch.no_grad():
        transf = transforms.ToTensor()
        rev_secret_img = self.Rnet(transf(carrier).unsqueeze(0).cuda())
    to_pil = transforms.ToPILImage()
    return to_pil(rev_secret_img.squeeze(0))