def val300_coco(model_path): print("loading model at {}".format(model_path)) from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval dboxes = dboxes300_coco() encoder = Encoder(dboxes) trans = SSDTransformer(dboxes, (300, 300), val=True) #annotate = "../../coco_ssd/instances_minival2014.json" #coco_root = "../../coco_data/val2014" #annotate = "../../coco_ssd/image_info_test-dev2015.json" #coco_root = "../../coco_data/test2015" annotate = "../../coco_ssd/instances_val2017.json" coco_root = "../../coco_data/val2017" cocoGt = COCO(annotation_file=annotate) coco = COCODetection(coco_root, annotate, trans) model = SSD300(coco.labelnum) od = torch.load(model_path) model.load_state_dict(od["model"]) model.eval() model.cuda() ret = [] inv_map = {v: k for k, v in coco.label_map.items()} start = time.time() for idx, image_id in enumerate(coco.img_keys): img, (htot, wtot), _, _ = coco[idx] with torch.no_grad(): print("Parsing image: {}/{}".format(idx + 1, len(coco)), end="\r") ploc, plabel = model(img.unsqueeze(0).cuda()) try: result = encoder.decode_batch(ploc, plabel, 0.50, 200)[0] except: #raise print("") print("No object detected in idx: {}".format(idx), end="\r") continue loc, label, prob = [r.cpu().numpy() for r in result] for loc_, label_, prob_ in zip(loc, label, prob): ret.append([image_id, loc_[0]*wtot, \ loc_[1]*htot, (loc_[2] - loc_[0])*wtot, (loc_[3] - loc_[1])*htot, prob_, inv_map[label_]]) print("") print("Predicting Ended, totoal time: {:.2f} s".format(time.time() - start)) cocoDt = cocoGt.loadRes(np.array(ret)) E = COCOeval(cocoGt, cocoDt, iouType='bbox') #E.params.useSegm = 0 #E.params.recThrs = [0.5] #E.params.maxDets = [10, 100, 200] E.evaluate() E.accumulate() E.summarize()
def dboxes300_coco(): figsize = 300 feat_size = [38, 19, 10, 5, 3, 1] steps = [8, 16, 32, 64, 100, 300] # use the scales here: https://github.com/amdegroot/ssd.pytorch/blob/master/data/config.py scales = [21, 45, 99, 153, 207, 261, 315] aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] dboxes = DefaultBoxes(figsize, feat_size, steps, scales, aspect_ratios) return dboxes if __name__ == "__main__": dboxes = dboxes300_coco() encoder = Encoder(dboxes) saved_inputs = torch.load('inputs.pth') bboxes = saved_inputs['bbox'].float() scores = saved_inputs['scores'].float() criteria = float(saved_inputs['criteria']) max_num = int(saved_inputs['max_output']) print('bboxes: {}, scores: {}'.format(bboxes.shape, scores.shape)) for i in range(bboxes.shape[0]): box, label, score = encoder.decode_batch(bboxes[i, :, :].unsqueeze(0), scores[i, :, :].unsqueeze(0), criteria, max_num)[0] print('r: {}'.format(label))