mirror of
https://github.com/Shawn-Shan/fawkes.git
synced 2024-12-22 07:09:33 +05:30
make it into a class
Former-commit-id: a16d0d213b568eb5cbc21229b940394fc58e1818 [formerly 4bb10aac31590439604bc9750fc51a6003be5b4c] Former-commit-id: 2316435e65d25480560f94dc6a9aff560fe0673e
This commit is contained in:
parent
9d176d62b2
commit
f5749d0ae4
@ -4,7 +4,7 @@
|
|||||||
# @Link : https://www.shawnshan.com/
|
# @Link : https://www.shawnshan.com/
|
||||||
|
|
||||||
|
|
||||||
__version__ = '0.0.5'
|
__version__ = '0.0.6'
|
||||||
|
|
||||||
from .detect_faces import create_mtcnn, run_detect_face
|
from .detect_faces import create_mtcnn, run_detect_face
|
||||||
from .differentiator import FawkesMaskGeneration
|
from .differentiator import FawkesMaskGeneration
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import glob
|
import glob
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import tensorflow as tf
|
import tensorflow as tf
|
||||||
import logging
|
|
||||||
logging.getLogger('tensorflow').disabled = True
|
logging.getLogger('tensorflow').disabled = True
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -17,7 +19,6 @@ from fawkes.differentiator import FawkesMaskGeneration
|
|||||||
from fawkes.utils import load_extractor, init_gpu, select_target_label, dump_image, reverse_process_cloaked, \
|
from fawkes.utils import load_extractor, init_gpu, select_target_label, dump_image, reverse_process_cloaked, \
|
||||||
Faces
|
Faces
|
||||||
|
|
||||||
|
|
||||||
random.seed(12243)
|
random.seed(12243)
|
||||||
np.random.seed(122412)
|
np.random.seed(122412)
|
||||||
|
|
||||||
@ -51,8 +52,88 @@ def check_imgs(imgs):
|
|||||||
return imgs
|
return imgs
|
||||||
|
|
||||||
|
|
||||||
|
class Fawkes(object):
|
||||||
|
def __init__(self, feature_extractor, gpu, batch_size):
|
||||||
|
self.feature_extractor = feature_extractor
|
||||||
|
self.gpu = gpu
|
||||||
|
self.batch_size = batch_size
|
||||||
|
self.sess = init_gpu(gpu)
|
||||||
|
self.fs_names = [feature_extractor]
|
||||||
|
if isinstance(feature_extractor, list):
|
||||||
|
self.fs_names = feature_extractor
|
||||||
|
|
||||||
|
self.feature_extractors_ls = [load_extractor(name) for name in self.fs_names]
|
||||||
|
|
||||||
|
def mode2param(self, mode):
|
||||||
|
if mode == 'low':
|
||||||
|
th = 0.003
|
||||||
|
max_step = 20
|
||||||
|
lr = 20
|
||||||
|
elif mode == 'mid':
|
||||||
|
th = 0.005
|
||||||
|
max_step = 50
|
||||||
|
lr = 15
|
||||||
|
elif mode == 'high':
|
||||||
|
th = 0.008
|
||||||
|
max_step = 500
|
||||||
|
lr = 15
|
||||||
|
elif mode == 'ultra':
|
||||||
|
if not tf.test.is_gpu_available():
|
||||||
|
print("Please enable GPU for ultra setting...")
|
||||||
|
sys.exit(1)
|
||||||
|
th = 0.01
|
||||||
|
max_step = 2000
|
||||||
|
lr = 8
|
||||||
|
else:
|
||||||
|
raise Exception("mode must be one of 'low', 'mid', 'high', 'ultra', 'custom'")
|
||||||
|
return th, max_step, lr
|
||||||
|
|
||||||
|
def run_protection(self, image_paths, mode='mid', th=0.04, sd=1e9, lr=10, max_step=500, batch_size=1, format='png',
|
||||||
|
separate_target=True):
|
||||||
|
if mode == 'custom':
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
th, max_step, lr = self.mode2param(mode)
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
if not image_paths:
|
||||||
|
raise Exception("No images in the directory")
|
||||||
|
|
||||||
|
faces = Faces(image_paths, self.sess, verbose=1)
|
||||||
|
|
||||||
|
orginal_images = faces.cropped_faces
|
||||||
|
orginal_images = np.array(orginal_images)
|
||||||
|
|
||||||
|
if separate_target:
|
||||||
|
target_embedding = []
|
||||||
|
for org_img in orginal_images:
|
||||||
|
org_img = org_img.reshape([1] + list(org_img.shape))
|
||||||
|
tar_emb = select_target_label(org_img, self.feature_extractors_ls, self.fs_names)
|
||||||
|
target_embedding.append(tar_emb)
|
||||||
|
target_embedding = np.concatenate(target_embedding)
|
||||||
|
else:
|
||||||
|
target_embedding = select_target_label(orginal_images, self.feature_extractors_ls, self.fs_names)
|
||||||
|
|
||||||
|
protected_images = generate_cloak_images(self.sess, self.feature_extractors_ls, orginal_images,
|
||||||
|
target_emb=target_embedding, th=th, faces=faces, sd=sd,
|
||||||
|
lr=lr, max_step=max_step, batch_size=batch_size)
|
||||||
|
|
||||||
|
faces.cloaked_cropped_faces = protected_images
|
||||||
|
|
||||||
|
cloak_perturbation = reverse_process_cloaked(protected_images) - reverse_process_cloaked(orginal_images)
|
||||||
|
final_images = faces.merge_faces(cloak_perturbation)
|
||||||
|
|
||||||
|
for p_img, cloaked_img, path in zip(final_images, protected_images, image_paths):
|
||||||
|
file_name = "{}_{}_cloaked.{}".format(".".join(path.split(".")[:-1]), mode, format)
|
||||||
|
dump_image(p_img, file_name, format=format)
|
||||||
|
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
print('attack cost %f s' % (elapsed_time))
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
|
||||||
def main(*argv):
|
def main(*argv):
|
||||||
start_time = time.time()
|
|
||||||
if not argv:
|
if not argv:
|
||||||
argv = list(sys.argv)
|
argv = list(sys.argv)
|
||||||
|
|
||||||
@ -86,85 +167,20 @@ def main(*argv):
|
|||||||
parser.add_argument('--format', type=str,
|
parser.add_argument('--format', type=str,
|
||||||
help="final image format",
|
help="final image format",
|
||||||
default="png")
|
default="png")
|
||||||
args = parser.parse_args(argv[1:])
|
|
||||||
|
|
||||||
if args.mode == 'low':
|
args = parser.parse_args(argv[1:])
|
||||||
args.feature_extractor = "high_extract"
|
|
||||||
args.th = 0.003
|
|
||||||
args.max_step = 20
|
|
||||||
args.lr = 20
|
|
||||||
elif args.mode == 'mid':
|
|
||||||
args.feature_extractor = "high_extract"
|
|
||||||
args.th = 0.005
|
|
||||||
args.max_step = 50
|
|
||||||
args.lr = 15
|
|
||||||
elif args.mode == 'high':
|
|
||||||
args.feature_extractor = "high_extract"
|
|
||||||
args.th = 0.008
|
|
||||||
args.max_step = 500
|
|
||||||
args.lr = 15
|
|
||||||
elif args.mode == 'ultra':
|
|
||||||
if not tf.test.is_gpu_available():
|
|
||||||
print("Please enable GPU for ultra setting...")
|
|
||||||
sys.exit(1)
|
|
||||||
# args.feature_extractor = ["high_extract", 'high2_extract']
|
|
||||||
args.feature_extractor = "high_extract"
|
|
||||||
args.th = 0.01
|
|
||||||
args.max_step = 2000
|
|
||||||
args.lr = 8
|
|
||||||
elif args.mode == 'custom':
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
raise Exception("mode must be one of 'low', 'mid', 'high', 'ultra', 'custom'")
|
|
||||||
|
|
||||||
assert args.format in ['png', 'jpg', 'jpeg']
|
assert args.format in ['png', 'jpg', 'jpeg']
|
||||||
if args.format == 'jpg':
|
if args.format == 'jpg':
|
||||||
args.format = 'jpeg'
|
args.format = 'jpeg'
|
||||||
|
|
||||||
sess = init_gpu(args.gpu)
|
|
||||||
|
|
||||||
image_paths = glob.glob(os.path.join(args.directory, "*"))
|
image_paths = glob.glob(os.path.join(args.directory, "*"))
|
||||||
image_paths = [path for path in image_paths if "_cloaked" not in path.split("/")[-1]]
|
image_paths = [path for path in image_paths if "_cloaked" not in path.split("/")[-1]]
|
||||||
if not image_paths:
|
|
||||||
raise Exception("No images in the directory")
|
|
||||||
|
|
||||||
faces = Faces(image_paths, sess, verbose=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,
|
||||||
orginal_images = faces.cropped_faces
|
batch_size=args.batch_size, format=args.format,
|
||||||
orginal_images = np.array(orginal_images)
|
separate_target=args.separate_target)
|
||||||
|
|
||||||
fs_names = [args.feature_extractor]
|
|
||||||
if isinstance(args.feature_extractor, list):
|
|
||||||
fs_names = args.feature_extractor
|
|
||||||
|
|
||||||
feature_extractors_ls = [load_extractor(name) for name in fs_names]
|
|
||||||
|
|
||||||
if args.separate_target:
|
|
||||||
target_embedding = []
|
|
||||||
for org_img in orginal_images:
|
|
||||||
org_img = org_img.reshape([1] + list(org_img.shape))
|
|
||||||
tar_emb = select_target_label(org_img, feature_extractors_ls, fs_names)
|
|
||||||
target_embedding.append(tar_emb)
|
|
||||||
target_embedding = np.concatenate(target_embedding)
|
|
||||||
else:
|
|
||||||
target_embedding = select_target_label(orginal_images, feature_extractors_ls, fs_names)
|
|
||||||
|
|
||||||
protected_images = generate_cloak_images(sess, feature_extractors_ls, orginal_images,
|
|
||||||
target_emb=target_embedding, th=args.th, faces=faces, sd=args.sd,
|
|
||||||
lr=args.lr, max_step=args.max_step, batch_size=args.batch_size)
|
|
||||||
|
|
||||||
faces.cloaked_cropped_faces = protected_images
|
|
||||||
|
|
||||||
cloak_perturbation = reverse_process_cloaked(protected_images) - reverse_process_cloaked(orginal_images)
|
|
||||||
final_images = faces.merge_faces(cloak_perturbation)
|
|
||||||
|
|
||||||
for p_img, cloaked_img, path in zip(final_images, protected_images, image_paths):
|
|
||||||
file_name = "{}_{}_cloaked.{}".format(".".join(path.split(".")[:-1]), args.mode, args.format)
|
|
||||||
dump_image(p_img, file_name, format=args.format)
|
|
||||||
|
|
||||||
elapsed_time = time.time() - start_time
|
|
||||||
print('attack cost %f s' % (elapsed_time))
|
|
||||||
print("Done!")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
Reference in New Issue
Block a user