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()
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()