Skip to content

MultiNet3PNGinPNGarxiv2021

stegobox.codec.MultiNet3PNGinPNGarxiv2021

Bases: BaseCodec

This steganography method is named: MultiNet3PNGinPNGarxiv2021

  • Created by: Ruinan Ma
  • Created time: 2022/10/27

This is a PyTorch implementation of image steganography via deep learning, which is released in paper - Multi-Image Steganography Using Deep Neural Networks https://arxiv.org/pdf/2101.00350.pdf

Source code in stegobox/codec/multinet_3pnginpng_arxiv2021/multinet_3pnginpng.py
class MultiNet3PNGinPNGarxiv2021(BaseCodec):
    """
    This steganography method is named: `MultiNet3PNGinPNGarxiv2021`

    * Created by: Ruinan Ma
    * Created time: 2022/10/27

    This is a PyTorch implementation of image steganography via deep learning, which is
    released in paper - Multi-Image Steganography Using Deep Neural Networks
    https://arxiv.org/pdf/2101.00350.pdf
    """

    def __init__(
        self,
        para_path: str = "ckpt/multinet_3pnginpng_arxiv2021/multinet.pth",
        verbose: bool = False,
    ) -> None:
        super().__init__()
        self.verbose = verbose
        self.para_path = para_path
        self.model = self.net_init()
        self.model.load_state_dict(torch.load(self.para_path, map_location=device))
        self.transform = transforms.Compose(
            [transforms.Resize((64, 64)), transforms.ToTensor()]
        )
        if verbose:
            if torch.cuda.is_available():
                print("Running MultiNet with GPU.")
            else:
                print("Running MultiNet with CPU.")

    def net_init(self):
        prep_1 = PrepNetwork1()
        prep_2 = PrepNetwork2()
        prep_3 = PrepNetwork3()
        hiding_net = HidingNetwork()
        rev_1 = RevealNetwork1()
        rev_2 = RevealNetwork2()
        rev_3 = RevealNetwork3()
        encoder = Encoder(prep_1, prep_2, prep_3, hiding_net)
        decoder = Decoder(rev_1, rev_2, rev_3)
        model = SteganoModel(encoder, decoder)
        model.to(device)
        return model

    def encode(self, _, __) -> None:
        raise NotImplementedError("Use encode_multiple instead.")

    def decode(self, _) -> None:
        raise NotImplementedError("Use decode_multiple instead.")

    def encode_multiple(
        self,
        carrier: Image.Image,
        payload1: Image.Image,
        payload2: Image.Image,
        payload3: Image.Image,
    ) -> torch.Tensor:
        """Encode images with format png into image with format png.

        Args:
            carrier: cover image
            payload1: Payload secret image1
            payload2: Payload secret image2
            payload3: Payload secret image2

        Returns:
            Encoded steganographic image with format torch.tensor
        """

        if self.verbose:
            print("Encoding...")
        carrier = self.transform(carrier)
        payload1 = self.transform(payload1)
        payload2 = self.transform(payload2)
        payload3 = self.transform(payload3)

        carrier = carrier.unsqueeze(dim=0)  # type: ignore
        payload1 = payload1.unsqueeze(dim=0)  # type: ignore
        payload2 = payload2.unsqueeze(dim=0)  # type: ignore
        payload3 = payload3.unsqueeze(dim=0)  # type: ignore

        carrier = carrier.to(device)  # type: ignore
        payload1 = payload1.to(device)  # type: ignore
        payload2 = payload2.to(device)  # type: ignore
        payload3 = payload3.to(device)  # type: ignore

        payload1 = self.model.encoder.prep_network1(payload1)
        payload2 = self.model.encoder.prep_network2(payload2)
        payload3 = self.model.encoder.prep_network3(payload3)

        container = self.model.encoder.hiding_network(
            payload1, payload2, payload3, carrier
        )

        # container = self.model.encoder(carrier, payload1, payload2, payload3)

        return container

    def decode_multiple(
        self, container: Image.Image
    ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
        """Decode secret image from encoded steganographic image.

        Args:
            container: Encoded carrier image.

        Returns:
            Three decoded images if decode is successful.
        """

        if self.verbose:
            print("Decoding...")
        container = self.transform(container)
        container = container.unsqueeze(dim=0)  # type: ignore
        container = container.to(device)  # type: ignore

        reveal_payload1, reveal_payload2, reveal_payload3 = self.model.decoder(
            container
        )

        return reveal_payload1, reveal_payload2, reveal_payload3

encode_multiple(carrier, payload1, payload2, payload3)

Encode images with format png into image with format png.

Parameters:

Name Type Description Default
carrier Image

cover image

required
payload1 Image

Payload secret image1

required
payload2 Image

Payload secret image2

required
payload3 Image

Payload secret image2

required

Returns:

Type Description
Tensor

Encoded steganographic image with format torch.tensor

Source code in stegobox/codec/multinet_3pnginpng_arxiv2021/multinet_3pnginpng.py
def encode_multiple(
    self,
    carrier: Image.Image,
    payload1: Image.Image,
    payload2: Image.Image,
    payload3: Image.Image,
) -> torch.Tensor:
    """Encode images with format png into image with format png.

    Args:
        carrier: cover image
        payload1: Payload secret image1
        payload2: Payload secret image2
        payload3: Payload secret image2

    Returns:
        Encoded steganographic image with format torch.tensor
    """

    if self.verbose:
        print("Encoding...")
    carrier = self.transform(carrier)
    payload1 = self.transform(payload1)
    payload2 = self.transform(payload2)
    payload3 = self.transform(payload3)

    carrier = carrier.unsqueeze(dim=0)  # type: ignore
    payload1 = payload1.unsqueeze(dim=0)  # type: ignore
    payload2 = payload2.unsqueeze(dim=0)  # type: ignore
    payload3 = payload3.unsqueeze(dim=0)  # type: ignore

    carrier = carrier.to(device)  # type: ignore
    payload1 = payload1.to(device)  # type: ignore
    payload2 = payload2.to(device)  # type: ignore
    payload3 = payload3.to(device)  # type: ignore

    payload1 = self.model.encoder.prep_network1(payload1)
    payload2 = self.model.encoder.prep_network2(payload2)
    payload3 = self.model.encoder.prep_network3(payload3)

    container = self.model.encoder.hiding_network(
        payload1, payload2, payload3, carrier
    )

    # container = self.model.encoder(carrier, payload1, payload2, payload3)

    return container

decode_multiple(container)

Decode secret image from encoded steganographic image.

Parameters:

Name Type Description Default
container Image

Encoded carrier image.

required

Returns:

Type Description
tuple[Tensor, Tensor, Tensor]

Three decoded images if decode is successful.

Source code in stegobox/codec/multinet_3pnginpng_arxiv2021/multinet_3pnginpng.py
def decode_multiple(
    self, container: Image.Image
) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
    """Decode secret image from encoded steganographic image.

    Args:
        container: Encoded carrier image.

    Returns:
        Three decoded images if decode is successful.
    """

    if self.verbose:
        print("Decoding...")
    container = self.transform(container)
    container = container.unsqueeze(dim=0)  # type: ignore
    container = container.to(device)  # type: ignore

    reveal_payload1, reveal_payload2, reveal_payload3 = self.model.decoder(
        container
    )

    return reveal_payload1, reveal_payload2, reveal_payload3