Skip to content

HideJPEGinJPEGNips2017

stegobox.codec.HideJPEGinJPEGNips2017

Bases: BaseCodec

This steganography method is named: HideJPEGinJPEGNips2017

  • Created by: Ruinan Ma
  • Created time: 2022/09/28

This is a PyTorch implementation of image steganography via deep learning, which is released in paper - Hiding Images in Plain Sight: Deep Steganography.

Source code in stegobox/codec/hide_jpeginjpeg_nips2017/hide_jpeginjpeg.py
class HideJPEGinJPEGNips2017(BaseCodec):
    """
    This steganography method is named: `HideJPEGinJPEGNips2017`

    * Created by: Ruinan Ma
    * Created time: 2022/09/28

    This is a PyTorch implementation of image steganography via deep learning, which is
    released in paper - Hiding Images in Plain Sight: Deep Steganography.
    """

    def __init__(
        self,
        hnet_pth: str = "ckpt/hide_jpeginjpeg_nips2017/netH.pth",
        rnet_pth: str = "ckpt/hide_jpeginjpeg_nips2017/netR.pth",
        verbose: bool = False,
    ):
        super().__init__()
        self.Hnet_pth = hnet_pth
        self.Rnet_pth = rnet_pth
        self.verbose = verbose

        self.Hnet, self.Rnet = self.net_init(self.Hnet_pth, self.Rnet_pth)
        self.Hnet.eval()
        self.Rnet.eval()
        self.Hnet.zero_grad()
        self.Rnet.zero_grad()
        if verbose:
            if torch.cuda.is_available():
                print("Running 'HideJPEGinJPEGNips2017' with GPU.")
            else:
                print("Running 'HideJPEGinJPEGNips2017' with CPU.")

    def _transform(self, x: Image.Image) -> torch.Tensor:
        transform = transforms.Compose(
            [transforms.Resize([256, 256]), transforms.ToTensor()]
        )
        return transform(x)  # type: ignore

    def net_init(self, hnet_pth: str, rnet_pth: str):
        hnet = UnetGenerator(
            input_nc=6, output_nc=3, num_downs=7, output_function=nn.Sigmoid
        )
        hnet.cuda()
        hnet.apply(weights_init)
        hnet.load_state_dict(torch.load(hnet_pth))
        rnet = RevealNet(output_function=nn.Sigmoid)
        rnet.cuda()
        rnet.apply(weights_init)
        rnet.load_state_dict(torch.load(rnet_pth))
        if self.verbose:
            print("Hnet and Rnet load pretrained model successfully.")
        return hnet, rnet

    def encode(self, carrier: Image.Image, payload: Image.Image) -> torch.Tensor:
        """Encode image with format jpeg into image with format jpeg.

        Args:
            carrier: Cover image
            payload: Payload secret image

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

        if self.verbose:
            print("Encoding...")

        # carrier.size()-->torch.Size([3, 256, 256])
        carriert = self._transform(carrier)
        payloadt = self._transform(payload)

        # carrier.size()-->torch.Size([1, 3, 256, 256])
        carriert = carriert.unsqueeze(dim=0)
        payloadt = payloadt.unsqueeze(dim=0)

        # concat_img.size()-->torch.Size([1, 6, 256, 256])
        concat_img = torch.cat([carriert, payloadt], dim=1)

        if torch.cuda.is_available():
            concat_img = concat_img.cuda()

        # container_img.size()-->torch.Size([1, 3, 256, 256])
        container_img = self.Hnet(concat_img)
        return container_img

    def decode(self, carrier: Image.Image) -> torch.Tensor:
        """Decode secret image from encoded steganographic image.

        Args:
            carrier: Encoded carrier image.

        Returns:
            The decoded image if decode is successful.
        """

        if self.verbose:
            print("Decoding...")

        carriert = self._transform(carrier)
        carriert = carriert.unsqueeze(dim=0)

        if torch.cuda.is_available():
            carriert = carriert.cuda()

        reveal_img = self.Rnet(carriert)
        return reveal_img

encode(carrier, payload)

Encode image with format jpeg into image with format jpeg.

Parameters:

Name Type Description Default
carrier Image

Cover image

required
payload Image

Payload secret image

required

Returns:

Type Description
Tensor

Encoded steganographic image with format torch.tensor

Source code in stegobox/codec/hide_jpeginjpeg_nips2017/hide_jpeginjpeg.py
def encode(self, carrier: Image.Image, payload: Image.Image) -> torch.Tensor:
    """Encode image with format jpeg into image with format jpeg.

    Args:
        carrier: Cover image
        payload: Payload secret image

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

    if self.verbose:
        print("Encoding...")

    # carrier.size()-->torch.Size([3, 256, 256])
    carriert = self._transform(carrier)
    payloadt = self._transform(payload)

    # carrier.size()-->torch.Size([1, 3, 256, 256])
    carriert = carriert.unsqueeze(dim=0)
    payloadt = payloadt.unsqueeze(dim=0)

    # concat_img.size()-->torch.Size([1, 6, 256, 256])
    concat_img = torch.cat([carriert, payloadt], dim=1)

    if torch.cuda.is_available():
        concat_img = concat_img.cuda()

    # container_img.size()-->torch.Size([1, 3, 256, 256])
    container_img = self.Hnet(concat_img)
    return container_img

decode(carrier)

Decode secret image from encoded steganographic image.

Parameters:

Name Type Description Default
carrier Image

Encoded carrier image.

required

Returns:

Type Description
Tensor

The decoded image if decode is successful.

Source code in stegobox/codec/hide_jpeginjpeg_nips2017/hide_jpeginjpeg.py
def decode(self, carrier: Image.Image) -> torch.Tensor:
    """Decode secret image from encoded steganographic image.

    Args:
        carrier: Encoded carrier image.

    Returns:
        The decoded image if decode is successful.
    """

    if self.verbose:
        print("Decoding...")

    carriert = self._transform(carrier)
    carriert = carriert.unsqueeze(dim=0)

    if torch.cuda.is_available():
        carriert = carriert.cuda()

    reveal_img = self.Rnet(carriert)
    return reveal_img