mcding
published version
ad552d8
raw
history blame
3.08 kB
import os
import io
import numpy as np
import onnxruntime as ort
from PIL import Image
import dotenv
dotenv.load_dotenv()
GT_MESSAGE = os.environ["GT_MESSAGE"]
QUALITY_COEFFICIENTS = {
"psnr": -0.0022186489180419534,
"ssim": -0.11337077856710862,
"nmi": -0.09878221979274945,
"lpips": 0.3412626374646173,
}
QUALITY_OFFSETS = {
"psnr": 43.54757854447622,
"ssim": 0.984229018845295,
"nmi": 1.7536553655336136,
"lpips": 0.014247652621287854,
}
def compute_performance(image):
session_options = ort.SessionOptions()
session_options.intra_op_num_threads = 1
session_options.inter_op_num_threads = 1
session_options.log_severity_level = 3
model = ort.InferenceSession(
"./kit/models/stable_signature.onnx",
sess_options=session_options,
)
inputs = np.stack(
[
(
(
np.array(
image,
dtype=np.float32,
)
/ 255.0
- [0.485, 0.456, 0.406]
)
/ [0.229, 0.224, 0.225]
)
.transpose((2, 0, 1))
.astype(np.float32)
],
axis=0,
)
outputs = model.run(
None,
{
"image": inputs,
},
)
decoded = (outputs[0] > 0).astype(int)[0]
gt_message = np.array([int(bit) for bit in GT_MESSAGE])
return 1 - np.mean(gt_message != decoded)
from .metrics import (
compute_image_distance_repeated,
load_perceptual_models,
compute_perceptual_metric_repeated,
load_aesthetics_and_artifacts_models,
compute_aesthetics_and_artifacts_scores,
)
def compute_quality(attacked_image, clean_image, quiet=True):
# Compress the image
buffer = io.BytesIO()
attacked_image.save(buffer, format="JPEG", quality=95)
buffer.seek(0)
# Update attacked_image with the compressed version
attacked_image = Image.open(buffer)
modes = ["psnr", "ssim", "nmi", "lpips"]
results = {}
for mode in modes:
if mode in ["psnr", "ssim", "nmi"]:
metrics = compute_image_distance_repeated(
[clean_image],
[attacked_image],
metric_name=mode,
num_workers=1,
verbose=not quiet,
)
results[mode] = metrics
elif mode == "lpips":
model = load_perceptual_models(
mode,
mode="alex",
device="cpu",
)
metrics = compute_perceptual_metric_repeated(
[clean_image],
[attacked_image],
metric_name=mode,
mode="alex",
model=model,
device="cpu",
)
results[mode] = metrics
normalized_quality = 0
for key, value in results.items():
normalized_quality += (value[0] - QUALITY_OFFSETS[key]) * QUALITY_COEFFICIENTS[
key
]
return normalized_quality