GANimation conditional attacks

This commit is contained in:
Nataniel Ruiz
2020-01-09 12:05:56 -04:00
parent 6fdd442e20
commit 3cde107dac
2 changed files with 65 additions and 16 deletions
+33 -2
View File
@@ -80,8 +80,7 @@ class LinfPGDAttack(object):
def perturb_iter_class(self, X_nat, y, c_trg):
"""
Given examples (X_nat, y), returns adversarial
examples within epsilon of X_nat in l_infinity norm.
Iterative Class Conditional Attack
"""
X = X_nat.clone().detach_()
@@ -113,6 +112,38 @@ class LinfPGDAttack(object):
return X, eta
def perturb_joint_class(self, X_nat, y, c_trg):
"""
Joint Class Conditional Attack
"""
X = X_nat.clone().detach_()
J = c_trg.size(0)
full_loss = 0.0
for i in range(self.k):
for j in range(J):
# print(i)
X.requires_grad = True
output_att, output_img = self.model(X, c_trg[j,:].unsqueeze(0))
out = imFromAttReg(output_att, output_img, X)
self.model.zero_grad()
loss = -self.loss_fn(output_att, y)
full_loss += loss
full_loss.backward()
grad = X.grad
X_adv = X + self.a * grad.sign()
eta = torch.clamp(X_adv - X_nat, min=-self.epsilon, max=self.epsilon)
X = torch.clamp(X_nat + eta, min=-1, max=1).detach_()
return X, eta
def clip_tensor(X, Y, Z):
# Clip X with Y min and Z max
X_np = X.data.cpu().numpy()
+32 -14
View File
@@ -404,29 +404,47 @@ class Solver(Utils):
x_advs = []
for idx, image_path in enumerate(images_to_animate_path):
image_to_animate = regular_image_transform(
Image.open(image_path)).unsqueeze(0).cuda()
image_to_animate = regular_image_transform(Image.open(image_path)).unsqueeze(0).cuda()
all_images = torch.cat([regular_image_transform(Image.open(path)).unsqueeze(0) for path in images_to_animate_path], dim=0).cuda()
if idx == 0:
for target_idx in range(targets.size(0)):
x_adv, perturb = pgd_attack.perturb(image_to_animate, black, targets[target_idx, :].unsqueeze(0).cuda())
x_advs.append((x_adv, perturb))
# Transfer to different images
# if idx == 0:
# for target_idx in range(targets.size(0)):
# x_adv, perturb = pgd_attack.perturb(image_to_animate, black, targets[target_idx, :].unsqueeze(0).cuda())
# x_advs.append((x_adv, perturb))
for target_idx in range(targets.size(0)):
# if target_idx == 0:
# img = regular_image_transform(Image.open(images_to_animate_path[idx])).unsqueeze(0).cuda()
# # x_adv, perturb = pgd_attack.perturb(img, black, targets[0, :].unsqueeze(0).cuda())
# x_adv, perturb = pgd_attack.perturb_iter_class(image_to_animate, black, targets[:, :].cuda())
# # _, perturb = pgd_attack.perturb_iter_data(image_to_animate, all_images, black, targets[68, :].unsqueeze(0).cuda())
# Transfer to different classes
if target_idx == 0:
# img = regular_image_transform(Image.open(images_to_animate_path[idx])).unsqueeze(0).cuda()
# Wrong Class
x_adv, perturb = pgd_attack.perturb(image_to_animate, black, targets[0, :].unsqueeze(0).cuda()
# Joint Class Conditional
# x_adv, perturb = pgd_attack.perturb_joint_class(image_to_animate, black, targets[:, :].cuda())
# Iterative Class Conditional
# x_adv, perturb = pgd_attack.perturb_iter_class(image_to_animate, black, targets[:, :].cuda())
# Iterative Data
# _, perturb = pgd_attack.perturb_iter_data(image_to_animate, all_images, black, targets[68, :].unsqueeze(0).cuda())
targets_au = targets[target_idx, :].unsqueeze(0).cuda()
# Normal Attack
# x_adv, perturb = pgd_attack.perturb(image_to_animate, black, targets_au)
x_adv, perturb = x_advs[target_idx]
# x_adv = image_to_animate + perturb
x_adv = image_to_animate
# x_adv, perturb = x_advs[target_idx]
x_adv = image_to_animate + perturb
# No Attack
# x_adv = image_to_animate
# print(image_to_animate.shape, x_adv.shape)
with torch.no_grad():
resulting_images_att, resulting_images_reg = self.G(
x_adv, targets_au)