From c52b38e152b9820dac087ad43c3764a82ddd8a9f Mon Sep 17 00:00:00 2001 From: Shawn-Shan Date: Sun, 26 Jul 2020 14:37:55 -0500 Subject: [PATCH] replace skimage resize with image resize --- fawkes/differentiator.py | 2 ++ fawkes/protection.py | 45 ++++++++++++++++++++++------------------ fawkes/utils.py | 33 ++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/fawkes/differentiator.py b/fawkes/differentiator.py index 6f1731e..f84352a 100644 --- a/fawkes/differentiator.py +++ b/fawkes/differentiator.py @@ -407,6 +407,8 @@ class FawkesMaskGeneration: if iteration != 0 and iteration % (self.MAX_ITERATIONS // 3) == 0: LR = LR * 0.8 + if self.verbose: + print("Learning rate: ", LR) if iteration % (self.MAX_ITERATIONS // 5) == 0: if self.verbose == 1: diff --git a/fawkes/protection.py b/fawkes/protection.py index 8bf1f22..bb23608 100644 --- a/fawkes/protection.py +++ b/fawkes/protection.py @@ -26,16 +26,6 @@ def generate_cloak_images(protector, image_X, target_emb=None): return cloaked_image_X -def check_imgs(imgs): - if np.max(imgs) <= 1 and np.min(imgs) >= 0: - imgs = imgs * 255.0 - elif np.max(imgs) <= 255 and np.min(imgs) >= 0: - pass - else: - raise Exception("Image values ") - return imgs - - class Fawkes(object): def __init__(self, feature_extractor, gpu, batch_size): @@ -66,7 +56,7 @@ class Fawkes(object): def mode2param(self, mode): if mode == 'low': th = 0.003 - max_step = 50 + max_step = 40 lr = 20 elif mode == 'mid': th = 0.005 @@ -89,7 +79,6 @@ class Fawkes(object): def run_protection(self, image_paths, mode='low', th=0.04, sd=1e9, lr=10, max_step=500, batch_size=1, format='png', separate_target=True, debug=False): - if mode == 'custom': pass else: @@ -101,11 +90,16 @@ class Fawkes(object): image_paths, loaded_images = filter_image_paths(image_paths) if not image_paths: - raise Exception("No images in the directory") + print("No images in the directory") + return 3 + with graph.as_default(): faces = Faces(image_paths, loaded_images, self.aligner, verbose=1) original_images = faces.cropped_faces + if len(original_images) == 0: + print("No face detected. ") + return 2 original_images = np.array(original_images) with sess.as_default(): @@ -143,16 +137,19 @@ class Fawkes(object): faces.cloaked_cropped_faces = protected_images - cloak_perturbation = reverse_process_cloaked(protected_images) - reverse_process_cloaked( - original_images) - final_images = faces.merge_faces(cloak_perturbation) + # cloak_perturbation = reverse_process_cloaked(protected_images) - reverse_process_cloaked( + # original_images) + # final_images = faces.merge_faces(cloak_perturbation) + + final_images = faces.merge_faces(reverse_process_cloaked(protected_images), + reverse_process_cloaked(original_images)) for p_img, path in zip(final_images, image_paths): file_name = "{}_{}_cloaked.{}".format(".".join(path.split(".")[:-1]), mode, format) dump_image(p_img, file_name, format=format) print("Done!") - return None + return 1 def main(*argv): @@ -201,9 +198,17 @@ def main(*argv): image_paths = [path for path in image_paths if "_cloaked" not in path.split("/")[-1]] protector = Fawkes(args.feature_extractor, args.gpu, args.batch_size) - protector.run_protection(image_paths, mode=args.mode, th=args.th, sd=args.sd, lr=args.lr, max_step=args.max_step, - batch_size=args.batch_size, format=args.format, - separate_target=args.separate_target, debug=args.debug) + if args.mode != 'all': + protector.run_protection(image_paths, mode=args.mode, th=args.th, sd=args.sd, lr=args.lr, + max_step=args.max_step, + batch_size=args.batch_size, format=args.format, + separate_target=args.separate_target, debug=args.debug) + else: + for m in ['low', 'mid', 'high']: + protector.run_protection(image_paths, mode=m, th=args.th, sd=args.sd, lr=args.lr, + max_step=args.max_step, + batch_size=args.batch_size, format=args.format, + separate_target=args.separate_target, debug=args.debug) if __name__ == '__main__': diff --git a/fawkes/utils.py b/fawkes/utils.py index 3db36a2..d510fa9 100644 --- a/fawkes/utils.py +++ b/fawkes/utils.py @@ -25,7 +25,7 @@ from PIL import Image, ExifTags from keras.layers import Dense, Activation, Dropout from keras.models import Model from keras.preprocessing import image -from skimage.transform import resize +# from skimage.transform import resize from fawkes.align_face import align from six.moves.urllib.request import urlopen @@ -140,7 +140,6 @@ class Faces(object): cur_faces_square = [] if verbose: print("Find {} face(s) in {}".format(len(cur_faces), p.split("/")[-1])) - if eval_local: cur_faces = cur_faces[:1] @@ -152,16 +151,16 @@ class Faces(object): base = np.zeros((long_size, long_size, 3)) base[0:img.shape[0], 0:img.shape[1], :] = img cur_faces_square.append(base) - cur_index = align_img[1] cur_faces_square = [resize(f, (224, 224)) for f in cur_faces_square] + self.cropped_faces_shape.extend(cur_shapes) self.cropped_faces.extend(cur_faces_square) self.cropped_index.extend(cur_index) self.callback_idx.extend([i] * len(cur_faces_square)) - if not self.cropped_faces: - raise Exception("No faces detected") + if len(self.cropped_faces) == 0: + return self.cropped_faces = np.array(self.cropped_faces) @@ -173,15 +172,24 @@ class Faces(object): def get_faces(self): return self.cropped_faces - def merge_faces(self, cloaks): + def merge_faces(self, protected_images, original_images): self.cloaked_faces = np.copy(self.org_faces) for i in range(len(self.cropped_faces)): - cur_cloak = cloaks[i] + # cur_cloak = cloaks[i] + cur_protected = protected_images[i] + cur_original = original_images[i] + org_shape = self.cropped_faces_shape[i] old_square_shape = max([org_shape[0], org_shape[1]]) - reshape_cloak = resize(cur_cloak, (old_square_shape, old_square_shape)) + + # reshape_cloak = resize(cur_cloak, (old_square_shape, old_square_shape)) + cur_protected = resize(cur_protected, (old_square_shape, old_square_shape)) + cur_original = resize(cur_original, (old_square_shape, old_square_shape)) + + reshape_cloak = cur_protected - cur_original + reshape_cloak = reshape_cloak[0:org_shape[0], 0:org_shape[1], :] callback_id = self.callback_idx[i] @@ -211,6 +219,15 @@ def load_victim_model(number_classes, teacher_model=None, end2end=False, dropout return model +def resize(img, sz): + assert np.min(img) >= 0 and np.max(img) <= 255.0 + + from keras.preprocessing import image + im_data = image.array_to_img(img).resize((sz[1], sz[0])) + im_data = image.img_to_array(im_data) + return im_data + + def init_gpu(gpu_index, force=False): if isinstance(gpu_index, list): gpu_num = ','.join([str(i) for i in gpu_index])