| import spaces |
| import gradio as gr |
| import torch |
| from PIL import Image |
| import numpy as np |
| from util.feature_extraction_utils import normalize_transforms |
| from util.attack_utils import Attack |
| from util.prepare_utils import prepare_models, prepare_dir_vec, get_ensemble |
| from align.detector import detect_faces |
| from align.align_trans import get_reference_facial_points, warp_and_crop_face |
| import torchvision.transforms as transforms |
|
|
| to_tensor = transforms.ToTensor() |
|
|
| eps = 0.05 |
| n_iters = 50 |
| input_size = [112, 112] |
| attack_type = "lpips" |
| c_tv = None |
| c_sim = 0.05 |
| lr = 0.0025 |
| net_type = "alex" |
| noise_size = 0.005 |
| n_starts = 1 |
| kernel_size_gf = 7 |
| sigma_gf = 3 |
| combination = True |
| using_subspace = False |
| V_reduction_root = "./" |
| model_backbones = ["IR_152", "IR_152", "ResNet_152", "ResNet_152"] |
| model_roots = [ |
| "https://github.com/cmu-spuds/lowkey_gradio/releases/download/weights/Backbone_IR_152_Arcface_Epoch_112.pth", |
| "https://github.com/cmu-spuds/lowkey_gradio/releases/download/weights/Backbone_IR_152_Cosface_Epoch_70.pth", |
| "https://github.com/cmu-spuds/lowkey_gradio/releases/download/weights/Backbone_ResNet_152_Arcface_Epoch_65.pth", |
| "https://github.com/cmu-spuds/lowkey_gradio/releases/download/weights/Backbone_ResNet_152_Cosface_Epoch_68.pth", |
| ] |
| direction = 1 |
| crop_size = 112 |
| scale = crop_size / 112.0 |
|
|
| for root in model_roots: |
| torch.hub.load_state_dict_from_url(root, map_location="cpu", progress=True) |
|
|
|
|
| @spaces.GPU(duration=120) |
| def protect(img, progress=gr.Progress(track_tqdm=True)): |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
| models_attack, V_reduction, dim = prepare_models( |
| model_backbones, |
| input_size, |
| model_roots, |
| kernel_size_gf, |
| sigma_gf, |
| combination, |
| using_subspace, |
| V_reduction_root, |
| ) |
|
|
| img = Image.fromarray(img) |
| reference = get_reference_facial_points(default_square=True) * scale |
| h, w, c = np.array(img).shape |
|
|
| _, landmarks = detect_faces(img) |
| facial5points = [[landmarks[0][j], landmarks[0][j + 5]] for j in range(5)] |
|
|
| _, tfm = warp_and_crop_face( |
| np.array(img), facial5points, reference, crop_size=(crop_size, crop_size) |
| ) |
|
|
| |
| theta = normalize_transforms(tfm, w, h) |
| tensor_img = to_tensor(img).unsqueeze(0).to(device) |
|
|
| V_reduction = None |
| dim = 512 |
|
|
| |
| dir_vec_extractor = get_ensemble( |
| models=models_attack, |
| sigma_gf=None, |
| kernel_size_gf=None, |
| combination=False, |
| V_reduction=V_reduction, |
| warp=True, |
| theta_warp=theta, |
| ) |
| dir_vec = prepare_dir_vec(dir_vec_extractor, tensor_img, dim, combination) |
|
|
| img_attacked = tensor_img.clone() |
| attack = Attack( |
| models_attack, |
| dim, |
| attack_type, |
| eps, |
| c_sim, |
| net_type, |
| lr, |
| n_iters, |
| noise_size, |
| n_starts, |
| c_tv, |
| sigma_gf, |
| kernel_size_gf, |
| combination, |
| warp=True, |
| theta_warp=theta, |
| V_reduction=V_reduction, |
| ) |
| img_attacked = attack.execute(tensor_img, dir_vec, direction).detach().cpu() |
|
|
| img_attacked_pil = transforms.ToPILImage()(img_attacked[0]) |
| return img_attacked_pil |
|
|
|
|
| gr.Interface( |
| fn=protect, |
| inputs=gr.components.Image(height=512, width=512), |
| outputs=gr.components.Image(type="pil"), |
| allow_flagging="never", |
| ).launch(show_error=True, quiet=False, share=False) |
|
|