You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

adversarial_attack.py 9.5 kB

3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. # Copyright 2022 Huawei Technologies Co., Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # ============================================================================
  15. import os
  16. import re
  17. import numpy as np
  18. import face_recognition as fr
  19. import face_recognition_models as frm
  20. import dlib
  21. import matplotlib.image as mp
  22. from PIL import Image, ImageDraw
  23. import mindspore
  24. import mindspore.dataset.vision.py_transforms as P
  25. from mindspore.dataset.vision.py_transforms import ToPIL as ToPILImage
  26. from mindspore.dataset.vision.py_transforms import ToTensor
  27. from mindspore import Parameter, ops, nn, Tensor
  28. from loss_design import MyTrainOneStepCell, MyWithLossCell, FaceLossTargetAttack, FaceLossNoTargetAttack
  29. from FaceRecognition.eval import get_net
  30. class FaceAdversarialAttack(object):
  31. """
  32. Class used to create adversarial facial recognition attacks.
  33. """
  34. def __init__(self, input_img, target_img, seed=None):
  35. """
  36. Initialization for attack class.
  37. Args:
  38. input_img (numpy.ndarray): The input image.
  39. target_img (numpy.ndarray): The target image.
  40. seed (int): optional Sets custom seed for reproducability. Default is generated randomly.
  41. """
  42. if (seed is not None): np.random.seed(seed)
  43. self.MEAN = Tensor([0.485, 0.456, 0.406])
  44. self.STD = Tensor([0.229, 0.224, 0.225])
  45. self.expand_dims = mindspore.ops.ExpandDims()
  46. self.imageize = ToPILImage()
  47. self.tensorize = ToTensor()
  48. self.normalize = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  49. self.resnet = get_net()
  50. self.input_tensor = Tensor(self.normalize(self.tensorize(input_img)))
  51. self.target_tensor = Tensor(self.normalize(self.tensorize(target_img)))
  52. mp.imsave('./outputs/input_image.jpg', np.transpose(self._reverse_norm(self.input_tensor).asnumpy(), (1, 2, 0)))
  53. mp.imsave('./outputs/target_image.jpg',
  54. np.transpose(self._reverse_norm(self.target_tensor).asnumpy(), (1, 2, 0)))
  55. self.input_emb = self.resnet(self.expand_dims(self.input_tensor, 0))
  56. self.target_emb = self.resnet(self.expand_dims(self.target_tensor, 0))
  57. self.adversarial_emb = None
  58. self.mask_tensor = self._create_mask(input_img)
  59. self.ref = self.mask_tensor
  60. self.pm = Parameter(self.mask_tensor)
  61. self.opt = nn.Adam([self.pm], learning_rate=0.01, weight_decay=0.0001)
  62. def train(self, attack_method):
  63. """
  64. Optimized adversarial image.
  65. Args:
  66. attack_method (Sting) : Including target attack and non-target attack.
  67. Returns:
  68. Tensor, adversarial image.
  69. Tensor, mask image.
  70. """
  71. if attack_method == "non-target attack":
  72. loss = FaceLossNoTargetAttack(self.target_emb)
  73. if attack_method == "target_attack":
  74. loss = FaceLossTargetAttack(self.target_emb)
  75. net_with_criterion = MyWithLossCell(self.resnet, loss, self.input_tensor)
  76. train_net = MyTrainOneStepCell(net_with_criterion, self.opt)
  77. for i in range(2000):
  78. self.mask_tensor = Tensor(self.pm)
  79. grads, loss = train_net(self.mask_tensor)
  80. print("epoch %d ,loss: %f \n " % (i, loss.asnumpy().item()))
  81. self.mask_tensor = ops.clip_by_value(
  82. self.mask_tensor, Tensor(0, mindspore.float32), Tensor(1, mindspore.float32))
  83. adversarial_tensor = self._apply(
  84. self.input_tensor,
  85. (self.mask_tensor - self.MEAN[:, None, None]) / self.STD[:, None, None],
  86. self.ref)
  87. adversarial_tensor = self._reverse_norm(adversarial_tensor)
  88. return adversarial_tensor, self.mask_tensor
  89. def test(self):
  90. """
  91. Test the recognition of adversarial images by the model.
  92. """
  93. adversarial_tensor = self._apply(
  94. self.input_tensor,
  95. (self.mask_tensor - self.MEAN[:, None, None] )/ self.STD[:, None, None],
  96. self.ref)
  97. self.adversarial_emb = self.resnet(self.expand_dims(adversarial_tensor, 0))
  98. self.input_emb = self.resnet(self.expand_dims(self.input_tensor, 0))
  99. self.target_emb = self.resnet(self.expand_dims(self.target_tensor, 0))
  100. adversarial = np.argmax(self.adversarial_emb.asnumpy())
  101. target = np.argmax(self.target_emb.asnumpy())
  102. input = np.argmax(self.input_emb.asnumpy())
  103. print("input:", input)
  104. print("input_confidence:", self.input_emb.asnumpy()[0][input])
  105. print("================================")
  106. print("adversarial:", adversarial)
  107. print("adversarial_confidence:", self.adversarial_emb.asnumpy()[0][adversarial])
  108. print("Confidence changes for target:", self.adversarial_emb.asnumpy()[0][target])
  109. print("Confidence changes for input:", self.adversarial_emb.asnumpy()[0][input])
  110. print("================================")
  111. print("target:", target)
  112. print("target_confidence:", self.target_emb.asnumpy()[0][target])
  113. print("input: %d, target: %d, adversarial: %d" % (input, target, adversarial))
  114. def _reverse_norm(self, image_tensor):
  115. """
  116. Reverses normalization for a given image_tensor.
  117. Args:
  118. image_tensor (Tensor): image.
  119. Returns:
  120. Tensor, image.
  121. """
  122. tensor = image_tensor * self.STD[:, None, None] + self.MEAN[:, None, None]
  123. return tensor
  124. def _apply(self,
  125. image_tensor,
  126. mask_tensor,
  127. reference_tensor
  128. ):
  129. """
  130. Apply a mask over an image.
  131. Args:
  132. image_tensor (Tensor): Canvas to be used to apply mask on.
  133. mask_tensor (Tensor): Mask to apply over the image.
  134. reference_tensor (Tensor): Used to reference mask boundaries
  135. Returns:
  136. Tensor, image.
  137. """
  138. tensor = mindspore.numpy.where((reference_tensor == 0), image_tensor, mask_tensor)
  139. return tensor
  140. def _create_mask(self, face_image):
  141. """
  142. Create mask image.
  143. Args:
  144. face_image (PIL.Image): image of a detected face.
  145. Returns:
  146. mask_tensor : a mask image.
  147. """
  148. mask = Image.new('RGB', face_image.size, color=(0, 0, 0))
  149. d = ImageDraw.Draw(mask)
  150. landmarks = fr.face_landmarks(np.array(face_image))
  151. area = [landmark
  152. for landmark in landmarks[0]['chin']
  153. if landmark[1] > max(landmarks[0]['nose_tip'])[1]]
  154. area.append(landmarks[0]['nose_bridge'][1])
  155. d.polygon(area, fill=(255, 255, 255))
  156. mask_array = np.array(mask)
  157. mask_array = mask_array.astype(np.float32)
  158. for i in range(mask_array.shape[0]):
  159. for j in range(mask_array.shape[1]):
  160. for k in range(mask_array.shape[2]):
  161. if mask_array[i][j][k] == 255.:
  162. mask_array[i][j][k] = 0.5
  163. else:
  164. mask_array[i][j][k] = 0
  165. mask_tensor = Tensor(mask_array)
  166. mask_tensor = mask_tensor.swapaxes(0, 2).swapaxes(1, 2)
  167. mask_tensor.requires_grad = True
  168. return mask_tensor
  169. def _reverse_norm(self, image_tensor):
  170. """
  171. Reverses normalization for a given image_tensor.
  172. Args:
  173. image_tensor (Tensor): Tensor.
  174. Returns:
  175. Tensor, image.
  176. """
  177. tensor = image_tensor * self.STD[:, None, None] + self.MEAN[:, None, None]
  178. return tensor
  179. def detect_face(image_loc):
  180. """
  181. Helper function to run the facial detection and alignment process using
  182. dlib. Detects a given face and aligns it using dlib's 5 point landmark
  183. detector.
  184. Args:
  185. image_loc (numpy.ndarray): image file location.
  186. Returns:
  187. face_image : Resized face image.
  188. """
  189. detector = dlib.get_frontal_face_detector()
  190. shape_predictor = dlib.shape_predictor(frm.pose_predictor_model_location())
  191. image = dlib.load_rgb_image(image_loc)
  192. dets = detector(image, 1)
  193. faces = dlib.full_object_detections()
  194. for detection in dets:
  195. faces.append(shape_predictor(image, detection))
  196. face_image = Image.fromarray(dlib.get_face_chip(image, faces[0], size=112))
  197. return face_image
  198. def load_data(path_to_data):
  199. """
  200. Helper function for loading image data. Allows user to load the input, target,
  201. and test images.
  202. Args:
  203. path_to_data (String): Path to the given data.
  204. Returns:
  205. list : List of resized face images.
  206. """
  207. img_files = [f for f in os.listdir(path_to_data) if re.search(r'.*\.(jpe?g|png)', f)]
  208. img_files_locs = [os.path.join(path_to_data, f) for f in img_files]
  209. image_list = []
  210. for loc in img_files_locs:
  211. image_list.append(detect_face(loc))
  212. return image_list

MindArmour关注AI的安全和隐私问题。致力于增强模型的安全可信、保护用户的数据隐私。主要包含3个模块:对抗样本鲁棒性模块、Fuzz Testing模块、隐私保护与评估模块。 对抗样本鲁棒性模块 对抗样本鲁棒性模块用于评估模型对于对抗样本的鲁棒性,并提供模型增强方法用于增强模型抗对抗样本攻击的能力,提升模型鲁棒性。对抗样本鲁棒性模块包含了4个子模块:对抗样本的生成、对抗样本的检测、模型防御、攻防评估。