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
|
|
required
|
payload |
Image
|
payload in bits per pixel
|
required
|
Returns:
Name | Type |
Description |
Image |
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
|
|
required
|
Returns:
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))
|