def main(args): # 输入 img = io.imread(args.image_path) img = np.float32(cv2.resize(img, (224, 224))) / 255 inputs = prepare_input(img) # 输出图像 image_dict = {} # 网络 net = get_net(args.network, args.weight_path) # Grad-CAM layer_name = get_last_conv_name(net) if args.layer_name is None else args.layer_name grad_cam = GradCAM(net, layer_name) mask = grad_cam(inputs, args.class_id) # cam mask image_dict['cam'], image_dict['heatmap'] = gen_cam(img, mask) grad_cam.remove_handlers() # Grad-CAM++ grad_cam_plus_plus = GradCamPlusPlus(net, layer_name) mask_plus_plus = grad_cam_plus_plus(inputs, args.class_id) # cam mask image_dict['cam++'], image_dict['heatmap++'] = gen_cam(img, mask_plus_plus) grad_cam_plus_plus.remove_handlers() # GuidedBackPropagation gbp = GuidedBackPropagation(net) inputs.grad.zero_() # 梯度置零 grad = gbp(inputs) gb = gen_gb(grad) image_dict['gb'] = norm_image(gb) # 生成Guided Grad-CAM cam_gb = gb * mask[..., np.newaxis] image_dict['cam_gb'] = norm_image(cam_gb) save_image(image_dict, os.path.basename(args.image_path), args.network, args.output_dir)
def main(args): ##### #TODO:build model & load weight from mmdet.datasets.transforms import ImageTransform from tqdm import tqdm config_file = args.config_file checkpoint_file = args.checkpoint_file cfg = Config.fromfile(config_file) device = 'cuda:0' model = init_detector(config_file, checkpoint_file, device=device) print(model) ###### # Grad-CAM # layer_name = get_last_conv_name(model) layer_name = 'backbone.layer4.2.conv3' folder = '/EHDD1/ADD/data/iSAID_Devkit/preprocess/dataset/iSAID_patches/val/images/' dst_folder = '/EHDD1/ADD/data/iSAID_Devkit/preprocess/dataset/iSAID_patches/val/cam' os.makedirs(dst_folder, exist_ok=True) os.makedirs(dst_folder+'++', exist_ok=True) imlist_total = os.listdir(folder) imlist = list(filter(ispure, imlist_total)) ##### for image in tqdm(imlist[1::2]): #TODO : prepare input grad_cam = GradCAM(model, layer_name) grad_cam_plus_plus = GradCamPlusPlus(model, layer_name) img = mmcv.imread(os.path.join(folder, image)) if img.shape[0] != img.shape[1]: print(image) continue img_transform = ImageTransform(size_divisor=cfg.data.test.size_divisor, **cfg.img_norm_cfg) data = _prepare_data(img, img_transform, model.cfg, device) ####### image_dict = {} mask = grad_cam(data) # cam mask grad_cam.remove_handlers() image_dict['overlay'], image_dict['heatmap'], image_dict['mask'] = gen_cam(img, mask) save_image(image_dict, image.split('.')[0], output_dir=dst_folder) # # Grad-CAM++ # grad_cam_plus_plus = GradCamPlusPlus(model, layer_name) image_dict = {} mask_plus_plus = grad_cam_plus_plus(data) # cam mask image_dict['overlay'], image_dict['heatmap'], image_dict['mask'] = gen_cam(img, mask_plus_plus) grad_cam_plus_plus.remove_handlers() save_image(image_dict, image.split('.')[0], output_dir=dst_folder+'++') torch.cuda.empty_cache()
def main(args): setup_logger(name="fvcore") logger = setup_logger() logger.info("Arguments: " + str(args)) cfg = setup_cfg(args) print(cfg) # 构建模型 model = build_model(cfg) # 加载权重 checkpointer = DetectionCheckpointer(model) checkpointer.load(cfg.MODEL.WEIGHTS) # 加载图像 path = os.path.expanduser(args.input) original_image = read_image(path, format="BGR") height, width = original_image.shape[:2] transform_gen = T.ResizeShortestEdge( [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST) image = transform_gen.get_transform(original_image).apply_image( original_image) image = torch.as_tensor(image.astype("float32").transpose( 2, 0, 1)).requires_grad_(True) inputs = {"image": image, "height": height, "width": width} # Grad-CAM layer_name = get_last_conv_name(model) grad_cam = GradCAM(model, layer_name) mask, box, class_id = grad_cam(inputs) # cam mask grad_cam.remove_handlers() # image_dict = {} img = original_image[..., ::-1] x1, y1, x2, y2 = box image_dict['predict_box'] = img[y1:y2, x1:x2] image_cam, image_dict['heatmap'] = gen_cam(img[y1:y2, x1:x2], mask) # Grad-CAM++ grad_cam_plus_plus = GradCamPlusPlus(model, layer_name) mask_plus_plus = grad_cam_plus_plus(inputs) # cam mask _, image_dict['heatmap++'] = gen_cam(img[y1:y2, x1:x2], mask_plus_plus) grad_cam_plus_plus.remove_handlers() # 获取类别名称 meta = MetadataCatalog.get( cfg.DATASETS.TEST[0] if len(cfg.DATASETS.TEST) else "__unused") label = meta.thing_classes[class_id] print("label:{}".format(label)) # # GuidedBackPropagation # gbp = GuidedBackPropagation(model) # inputs['image'].grad.zero_() # 梯度置零 # grad = gbp(inputs) # print("grad.shape:{}".format(grad.shape)) # gb = gen_gb(grad) # gb = gb[y1:y2, x1:x2] # image_dict['gb'] = gb # # 生成Guided Grad-CAM # cam_gb = gb * mask[..., np.newaxis] # image_dict['cam_gb'] = norm_image(cam_gb) save_image(image_dict, os.path.basename(path))
def main(args): #setup_logger(name="fvcore") #logger = setup_logger() #logger.info("Arguments: " + str(args)) #cfg = setup_cfg(args) print(cfg) #build_model #model = build_model(cfg) if torch.cuda.is_available() and not args.cuda: print("WARNING: You have a CUDA device, so you should probably run with --cuda") np.random.seed(cfg.RNG_SEED) if args.dataset == "pascal_voc": args.imdb_name = "voc_2007_trainval" args.imdbval_name = "voc_2007_test" args.set_cfgs = ['ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] elif args.dataset == "pascal_voc_0712": args.imdb_name = "voc_2007_trainval+voc_2012_trainval" args.imdbval_name = "voc_2007_test" args.set_cfgs = ['ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] elif args.dataset == "coco": args.imdb_name = "coco_2014_train+coco_2014_valminusminival" args.imdbval_name = "coco_2014_minival" args.set_cfgs = ['ANCHOR_SCALES', '[4, 8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] elif args.dataset == "imagenet": args.imdb_name = "imagenet_train" args.imdbval_name = "imagenet_val" args.set_cfgs = ['ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] elif args.dataset == "vg": args.imdb_name = "vg_150-50-50_minitrain" args.imdbval_name = "vg_150-50-50_minival" args.set_cfgs = ['ANCHOR_SCALES', '[4, 8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] args.cfg_file = "./../../cfgs/{}_ls.yml".format(args.net) if args.large_scale else "cfgs/{}.yml".format(args.net) if args.cfg_file is not None: cfg_from_file(args.cfg_file) if args.set_cfgs is not None: cfg_from_list(args.set_cfgs) print('Using config:') pprint.pprint(cfg) cfg.TRAIN.USE_FLIPPED = False imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdbval_name, False) imdb.competition_mode(on=True) print('{:d} roidb entries'.format(len(roidb))) input_dir = args.load_dir + "/" + args.net + "/" + args.dataset if not os.path.exists(input_dir): raise Exception('There is no input directory for loading network from ' + input_dir) load_name = os.path.join(input_dir, 'faster_rcnn_{}_{}_{}.pth'.format(args.checksession, args.checkepoch, args.checkpoint)) # initilize the network here. if args.net == 'vgg16': fasterRCNN = vgg16(imdb.classes, pretrained=False, class_agnostic=args.class_agnostic) elif args.net == 'res101': fasterRCNN = resnet(imdb.classes, 101, pretrained=False, class_agnostic=args.class_agnostic) elif args.net == 'res50': fasterRCNN = resnet(imdb.classes, 50, pretrained=False, class_agnostic=args.class_agnostic) elif args.net == 'res152': fasterRCNN = resnet(imdb.classes, 152, pretrained=False, class_agnostic=args.class_agnostic) else: print("network is not defined") pdb.set_trace() fasterRCNN.create_architecture() #load weight #checkpointer = DetectionCheckpointer(model) #checkpointer.load(cfg.MODEL.WEIGHTS) print("load checkpoint %s" % (load_name)) checkpoint = torch.load(load_name) fasterRCNN.load_state_dict(checkpoint['model']) if 'pooling_mode' in checkpoint.keys(): cfg.POOLING_MODE = checkpoint['pooling_mode'] print('load model successfully!') #load image path = os.path.expanduser(args.input) #original_image = read_image(path, format="BGR") #height, width = original_image.shape[:2] #transform_gen = T.ResizeShortestEdge( # [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST #) #image = transform_gen.get_transform(original_image).apply_image(original_image) #image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1)).requires_grad_(True) original_image = asarray(Image.open(path)) height, width = original_image.shape[:2] image = roibatchLoader(roidb, ratio_list, ratio_index, 1, \ imdb.num_classes, training=False, normalize = False) images = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0, pin_memory=True) images_iter = iter(dataloader) inputs = {"image": image, "height": height, "width": width} # Grad-CAM layer_name = get_last_conv_name(fasterRCNN) grad_cam = GradCAM(fasterRCNN, layer_name) mask, box, class_id = grad_cam(inputs) # cam mask grad_cam.remove_handlers() # image_dict = {} img = original_image[..., ::-1] x1, y1, x2, y2 = box image_dict['predict_box'] = img[y1:y2, x1:x2] image_cam, image_dict['heatmap'] = gen_cam(img[y1:y2, x1:x2], mask) # Grad-CAM++ grad_cam_plus_plus = GradCamPlusPlus(model, layer_name) mask_plus_plus = grad_cam_plus_plus(inputs) # cam mask _, image_dict['heatmap++'] = gen_cam(img[y1:y2, x1:x2], mask_plus_plus) grad_cam_plus_plus.remove_handlers() # get name of classes meta = MetadataCatalog.get( cfg.DATASETS.TEST[0] if len(cfg.DATASETS.TEST) else "__unused" ) label = meta.thing_classes[class_id] print("label:{}".format(label)) # # GuidedBackPropagation # gbp = GuidedBackPropagation(model) # inputs['image'].grad.zero_() # make gradient zero # grad = gbp(inputs) # print("grad.shape:{}".format(grad.shape)) # gb = gen_gb(grad) # gb = gb[y1:y2, x1:x2] # image_dict['gb'] = gb # Guided Grad-CAM # cam_gb = gb * mask[..., np.newaxis] # image_dict['cam_gb'] = norm_image(cam_gb) save_image(image_dict, os.path.basename(path))