Example #1
0
def process_a_batch(image_paths, target_layer, arch, topk, output_dir, cuda):
    device = get_device(cuda)

    # Synset words
    classes = get_classtable()

    # Model from torchvision
    model = models.__dict__[arch](pretrained=True)
    model.to(device)
    model.eval()

    # Images
    images = load_images_only(image_paths)
    images = torch.stack(images).to(device)

    bp = BackPropagation(model=model)
    probs, ids = bp.forward(images)  # sorted

    # =========================================================================
    print("Grad-CAM:")

    gcam = GradCAM(model=model)
    _ = gcam.forward(images)

    for i in range(topk):
        # Grad-CAM
        gcam.backward(ids=ids[:, [i]])
        regions = gcam.generate(target_layer=target_layer)
        regions = regions.cpu().numpy()
        for j in range(len(images)):
            print("\t#{}: {} ({:.5f})".format(image_paths[j],
                                              classes[ids[j, i]], probs[j, i]))
            # Grad-CAM
            save_cam(filename=os.path.join(
                output_dir,
                "{}-{}-{}-{:.3}.png".format(os.path.basename(image_paths[j]),
                                            classes[ids[j, i]], ids[j, i],
                                            probs[j, i]),
            ),
                     gcam=regions[j, 0])
    bp.remove_hook()
    gcam.remove_hook()
    del bp
    del images
    del gcam
    del model
    del regions
    del probs
    del ids
    del _
    torch.cuda.empty_cache()
Example #2
0
def get_grad_cam(device, model, classes, images, labels, target_layers):
    # move the model to device
    model.to(device)

    # set the model in evaluation mode
    model.eval()

    # get the grad cam
    gcam = GradCAM(model=model, candidate_layers=target_layers)

    # images = torch.stack(images).to(device)

    # predicted probabilities and class ids
    pred_probs, pred_ids = gcam.forward(images)

    # actual class ids
    # target_ids = torch.LongTensor(labels).view(len(images), -1).to(device)
    target_ids = labels.view(len(images), -1).to(device)

    # backward pass wrt to the actual ids
    gcam.backward(ids=target_ids)

    # we will store the layers and correspondings images activations here
    layers_region = {}

    # fetch the grad cam layers of all the images
    for target_layer in target_layers:
        # logger.info(f'generating Grad-CAM for {target_layer}')

        # Grad-CAM
        regions = gcam.generate(target_layer=target_layer)

        layers_region[target_layer] = regions

    # we are done here, remove the hooks
    gcam.remove_hook()

    return layers_region, pred_probs, pred_ids
def demo1(target_layer, arch, topk, output_dir, cuda):
    """
    Visualize model responses given multiple images
    """

    device = get_device(cuda)

    # Synset words
    classes = get_classtable()

    # Model from torchvision
    model = models.__dict__[arch](pretrained=True)
    num_ftrs = model.classifier[6].in_features
    model.classifier[6] = nn.Linear(in_features=num_ftrs, out_features=10)
    model.load_state_dict(torch.load('model_imageclass10bn.pth'))
    #print(model)
    model.to(device)
    model.eval()
    #normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
    #trans = transforms.Compose([transforms.ToTensor(), normalize])
    dsets = Data()
    dset_loaders = torch.utils.data.DataLoader(dsets,
                                               batch_size=10,
                                               shuffle=False,
                                               num_workers=2)
    # =========================================================================

    print("Grad-CAM/Guided Backpropagation/Guided Grad-CAM:")
    #bp = BackPropagation(model=model)
    for batch, inp in enumerate(tqdm(dset_loaders), 1):
        #print(images)
        i = inp[0]
        raw_images = inp[1].numpy()
        #print(raw_images)
        paths = inp[2]
        images = i.cuda()
        #raw_images = r.cuda()
        #probs, ids = bp.forward(images)
        gcam = GradCAM(model=model)
        probs, ids = gcam.forward(images)
        #_ = gcam.forward(images)

        #gbp = GuidedBackPropagation(model=model)
        #_ = gbp.forward(images)

        for i in range(topk):
            # Guided Backpropagation
            #gbp.backward(ids=ids[:, [i]])
            #gradients = gbp.generate()

            # Grad-CAM
            gcam.backward(ids=ids[:, [i]], image=images)
            regions = gcam.generate(target_layer=target_layer)

            for j in range(len(images)):
                print("\t#{}: {} ({:.5f})".format(j, classes[ids[j, i]],
                                                  probs[j, i]))
                # Grad-CAM
                save_path = os.path.join(output_dir, paths[j].split('/')[6],
                                         paths[j].split('/')[7].split(".")[0])
                #save_path = os.path.join(output_dir, paths[j].split('/')[6],paths[j].split('/')[7].split(".")[0])
                create_path(
                    os.path.join(
                        save_path.split('/')[0],
                        save_path.split('/')[1]))
                save_gradcam(
                    filename1=save_path +
                    "gradcam.png".format(classes[ids[j, i]]),
                    filename2=save_path + ".png",
                    gcam=regions[j, 0],
                    raw_image=raw_images[j],
                )
        gcam.remove_hook()
        gcam.model.zero_grad()
        torch.cuda.empty_cache()