# setup attack settings
    if args.adv_func == 'logits':
        adv_func = LogitsAdvLoss(kappa=args.kappa)
    else:
        adv_func = CrossEntropyAdvLoss()
    dist_func = L2Dist()
    # hyper-parameters from their official tensorflow code
    attacker = CWPerturb(model, adv_func, dist_func,
                         attack_lr=args.attack_lr,
                         init_weight=10., max_weight=80.,
                         binary_step=args.binary_step,
                         num_iter=args.num_iter)

    # attack
    test_set = ModelNet40Attack(args.data_root, num_points=args.num_points,
                                normalize=True)
    test_sampler = DistributedSampler(test_set, shuffle=False)
    test_loader = DataLoader(test_set, batch_size=args.batch_size,
                             shuffle=False, num_workers=4,
                             pin_memory=True, drop_last=False,
                             sampler=test_sampler)

    # run attack
    attacked_data, real_label, target_label, success_num = attack()

    # accumulate results
    data_num = len(test_set)
    success_rate = float(success_num) / float(data_num)

    # save results
    save_path = './attack/results/{}_{}/Perturb'.\
Esempio n. 2
0
def main():
    # build model
    model = PointNet2ClsSsg(num_classes=40)
    model = nn.DataParallel(model).cuda()
    model.eval()

    # load model weight
    print('Loading weight {}'.format(BEST_WEIGHTS['pointnet2']))
    state_dict = torch.load(BEST_WEIGHTS['pointnet2'])
    try:
        model.load_state_dict(state_dict)
    except RuntimeError:
        model.module.load_state_dict(state_dict)

    # load dataset
    test_set = ModelNet40Attack('data/attack_data.npz', num_points=1024,
                                normalize=True)
    test_loader = DataLoader(test_set, batch_size=1,
                             shuffle=True, num_workers=4,
                             pin_memory=True, drop_last=False)

    ti = 412
    data_iter = iter(test_loader)
    for i in range(ti):
        data = next(data_iter)
    total_num = 0
    success_num = 0
    at_success_num = 0
    i = 0
    all_adv = []
    all_real_label = []
    all_target_label = []
    for x, label, target in tqdm(test_loader):
        # x, label, target = data
        x, label, target = x.cuda(), label.long().cuda(), target.long().cuda()
        x = x.transpose(2, 1).contiguous()
        x.requires_grad = True
        rx = x.clone()

        x_pred = model(x)
        R1 = LRP_scores(model, x, None, label, label)
        x_pred = torch.argmax(x_pred, dim=-1)
        # if x_pred != label:
        #     # all_adv.append(x_adv.transpose(1, 2).contiguous().detach().cpu().numpy())
        #     # all_real_label.append(label.detach().cpu().numpy())
        #     # all_target_label.append(target.detach().cpu().numpy())
        #     continue

        total_num += x.shape[0]
        x_adv = AOA_Attack(model, x, label, target)
        pred, _, _ = model(x_adv)
        pred = torch.argmax(pred, dim=-1)
        success_num += (pred != label).sum().cpu().item()
        logits_at = model_at(x_adv)
        pred_at = torch.argmax(logits_at, dim=-1)
        at_success_num += (pred_at != label).sum().cpu().item()
        i += 1
        if i % 20 == 0:
            print("current attack success rate is", success_num / total_num)
            print("current pointnet++ attack success rate is", at_success_num / total_num)
        all_adv.append(x_adv.transpose(1, 2).contiguous().detach().cpu().numpy())
        all_real_label.append(label.detach().cpu().numpy())
        all_target_label.append(target.detach().cpu().numpy())
        # if i % 20 == 0:
        #     break
        # R0 = LRP_scores(model, x_adv, label, label)
        # R1 = LRP_scores(model, x, label, label)
        # utils.pc_heatmap(x_adv.transpose(2, 1)[0], R0[0].sum(-2).unsqueeze(-1))

    attacked_data = np.concatenate(all_adv, axis=0)  # [num_data, K, 3]
    real_label = np.concatenate(all_real_label, axis=0)  # [num_data]
    target_label = np.concatenate(all_target_label, axis=0)  # [num_data]
    # save results
    save_path = 'attack/results/{}_{}/AOA/{}'. \
        format('mn40', 1024, 'pointnet')
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    save_name = '{}-budget_{}-iter_{}' \
                '-success_{:.4f}-rank_{}.npz'. \
        format('aoa', 0.5,
               200, success_num/total_num, 0)
    np.savez(os.path.join(save_path, save_name),
             test_pc=attacked_data.astype(np.float32),
             test_label=real_label.astype(np.uint8),
             target_label=target_label.astype(np.uint8))
    print("total attack success rate is", success_num/total_num)