Spaces:
Running
Running
import gradio as gr | |
import os | |
import glob | |
import json | |
import re | |
from pathlib import Path | |
import json | |
def group_images_by_index(image_paths, is_audio=False): | |
# Regular expression pattern to extract the key from each image path | |
if is_audio: | |
pattern = r"audio_(\d+).png" | |
else: | |
pattern = r"img_(\d+).png" | |
# Dictionary to store the grouped images | |
grouped_images = {} | |
# Iterate over each image path | |
for image_path in image_paths: | |
# Extract the key using the regular expression pattern | |
match = re.search(pattern, image_path) | |
if match: | |
key = int(match.group(1)) | |
# Add the image path to the corresponding group in the dictionary | |
if key not in grouped_images: | |
grouped_images[key] = [] | |
grouped_images[key].append(image_path) | |
# Sort the dictionary by keys | |
sorted_grouped_images = dict(sorted(grouped_images.items())) | |
return sorted_grouped_images | |
def build_image_description(i, data_none, data_attack): | |
if i == 0: | |
fake_det_score = float(data_none["fake_det_score"]) | |
return f"det_score: {fake_det_score:.2f}" | |
elif i == 1: | |
psnr = float(data_none["psnr"]) | |
ssim = float(data_none["ssim"]) | |
lpips = float(data_none["lpips"]) | |
det_score = float(data_none["watermark_det_score"]) | |
p_value = data_none["p_value"] | |
bit_acc = data_none["bit_acc"] | |
return f"psnr: {psnr:.2f} ssim: {ssim:.2f} lpips: {lpips:.2f} det_score: {det_score:.2f} p_value: {p_value} bit_acc: {bit_acc}" | |
elif i == 2: | |
fake_det_score = float(data_attack["fake_det_score"]) | |
return f"det_score: {fake_det_score:.2f}" | |
elif i == 3: | |
det_score = float(data_attack["watermark_det_score"]) | |
p_value = data_attack["p_value"] | |
word_acc = data_attack["word_acc"] | |
bit_acc = data_attack["bit_acc"] | |
return f"word_acc: {word_acc:.2f} det_score: {det_score:.2f} p_value: {p_value} bit_acc: {bit_acc}" | |
def build_audio_description(i, data_none, data_attack): | |
if i == 0: | |
tn_detect_prob = float(data_none["tn_detect_prob"]) | |
return f"det_score: {tn_detect_prob:.2f}" | |
elif i == 1: | |
snr = float(data_none["snr"]) | |
sisnr = float(data_none["sisnr"]) | |
stoi = float(data_none["stoi"]) | |
pesq = float(data_none["pesq"]) | |
det_score = float(data_none["detect_prob"]) | |
bit_acc = data_none["ba"] | |
return f"snr: {snr:.2f} sisnr: {sisnr:.2f} stoi: {stoi:.2f} pesq: {pesq:.2f} det_score: {det_score:.2f} bit_acc: {bit_acc}" | |
elif i == 2: | |
tn_detect_prob = float(data_attack["tn_detect_prob"]) | |
return f"det_score: {tn_detect_prob:.2f}" | |
elif i == 3: | |
det_score = float(data_attack["detect_prob"]) | |
bit_acc = data_attack["ba"] | |
return f"det_score: {det_score:.2f} bit_acc: {bit_acc}" | |
def build_image_infos(abs_path: Path): | |
with (abs_path / "data/image_eval_results.json").open("r") as f: | |
image_data = json.loads(f.read()) | |
examples_dir = Path("./examples/image") | |
image_infos = {} | |
model_image_infos = {} | |
for model_name in os.listdir(examples_dir): | |
model_attacks_dir = examples_dir / model_name | |
for attack_name in os.listdir(model_attacks_dir): | |
attack_dir = model_attacks_dir / attack_name | |
image_paths = glob.glob(f"{attack_dir}/*.png") | |
all_files = [] | |
for i, files in group_images_by_index(image_paths).items(): | |
data_none = image_data["eval"]["val2014"]["wam"]["none"][i] | |
data_attack = image_data["eval"]["val2014"]["wam"][attack_name][i] | |
files = sorted([(f, Path(f).stem) for f in files], key=lambda x: x[1]) | |
files = files[2:] + files[:2] | |
files = [ | |
(f, f"{n}\n{build_image_description(i, data_none, data_attack)}") | |
for i, (f, n) in enumerate(files) | |
] | |
all_files.extend(files) | |
model_image_infos[attack_name] = all_files | |
image_infos[model_name] = model_image_infos | |
return image_infos | |
def build_audio_infos(abs_path: Path): | |
with (abs_path / "data/audio_eval_results.json").open("r") as f: | |
audio_data = json.loads(f.read()) | |
examples_dir = Path("./examples/audio") | |
audio_infos = {} | |
model_audio_infos = {} | |
for model_name in os.listdir(examples_dir): | |
model_attacks_dir = examples_dir / model_name | |
for attack_name in os.listdir(model_attacks_dir): | |
attack_dir = model_attacks_dir / attack_name | |
image_paths = glob.glob(f"{attack_dir}/*.png") | |
all_files = [] | |
for i, files in group_images_by_index(image_paths, is_audio=True).items(): | |
data_none = audio_data["eval"]["ravdess"][model_name]["identity"][i] | |
data_attack = audio_data["eval"]["ravdess"][model_name][attack_name][i] | |
files = sorted([(f, Path(f).stem) for f in files], key=lambda x: x[1]) | |
files = files[2:] + files[:2] | |
files = [ | |
(f, f"{n}\n{build_audio_description(i, data_none, data_attack)}") | |
for i, (f, n) in enumerate(files) | |
] | |
all_files.extend(files) | |
model_audio_infos[attack_name] = all_files | |
audio_infos[model_name] = model_audio_infos | |
return audio_infos | |
def examples_tab(abs_path: Path): | |
image_infos = build_image_infos(abs_path) | |
# First combo box (category selection) | |
model_choice = gr.Dropdown( | |
choices=list(image_infos.keys()), | |
label="Select a Model", | |
value=None, | |
) | |
# Second combo box (subcategory selection) | |
# Initialize with options from the first category by default | |
attack_choice = gr.Dropdown( | |
choices=list(image_infos["wam"].keys()), | |
label="Select an Attack", | |
value=None, | |
) | |
# Gallery component to display images | |
gallery = gr.Gallery( | |
label="Image Gallery", | |
columns=4, | |
rows=1, | |
) | |
# Update options for the second combo box when the first one changes | |
def update_subcategories(selected_category): | |
values = list(image_infos[selected_category].keys()) | |
values = [(v, v) for v in values] | |
attack_choice.choices = values | |
# return gr.Dropdown.update(choices=list(image_infos[selected_category].keys())) | |
# Function to load images based on selections from both combo boxes | |
def load_images(category, subcategory): | |
return image_infos.get(category, {}).get(subcategory, []) | |
# Update gallery based on both combo box selections | |
model_choice.change( | |
fn=update_subcategories, inputs=model_choice, outputs=attack_choice | |
) | |
attack_choice.change( | |
fn=load_images, inputs=[model_choice, attack_choice], outputs=gallery | |
) | |
def audio_examples_tab(abs_path: Path): | |
audio_infos = build_audio_infos(abs_path) | |
# First combo box (category selection) | |
model_choice = gr.Dropdown( | |
choices=list(audio_infos.keys()), | |
label="Select a Model", | |
value=None, | |
) | |
# Second combo box (subcategory selection) | |
# Initialize with options from the first category by default | |
attack_choice = gr.Dropdown( | |
choices=list(audio_infos["audioseal"].keys()), | |
label="Select an Attack", | |
value=None, | |
) | |
# Gallery component to display images | |
gallery = gr.Gallery( | |
label="Image Gallery", columns=4, rows=1, object_fit="scale-down" | |
) | |
# Update options for the second combo box when the first one changes | |
def update_subcategories(selected_category): | |
values = list(audio_infos[selected_category].keys()) | |
values = [(v, v) for v in values] | |
attack_choice.choices = values | |
# return gr.Dropdown.update(choices=list(image_infos[selected_category].keys())) | |
# Function to load images based on selections from both combo boxes | |
def load_audios(category, subcategory): | |
return audio_infos.get(category, {}).get(subcategory, []) | |
# Update gallery based on both combo box selections | |
model_choice.change( | |
fn=update_subcategories, inputs=model_choice, outputs=attack_choice | |
) | |
attack_choice.change( | |
fn=load_audios, inputs=[model_choice, attack_choice], outputs=gallery | |
) | |