Ejemplo n.º 1
0
 def stat_ap(self):
     cls_num = [0 for _ in self.category]
     cls_score = [np.array([], dtype=np.float32) for _ in self.category]
     cls_tp = [np.array([], dtype=np.bool) for _ in self.category]
     for data in tqdm.tqdm(self.loader):
         for key in data:
             t = data[key]
             if torch.is_tensor(t):
                 data[key] = utils.ensure_device(t)
         tensor = torch.autograd.Variable(data['tensor'], volatile=True)
         batch_size = tensor.size(0)
         pred = pybenchmark.profile('inference')(model._inference)(
             self.inference, tensor)
         _prob, pred['cls'] = conv_logits(pred)
         pred['iou'] = pred['iou'].contiguous()
         pred['prob'] = pred['iou'] * _prob
         for key in pred:
             pred[key] = pred[key].data
         if self.config.getboolean('eval', 'debug'):
             self.debug_data(data)
             self.debug_pred(pred)
         norm_bbox(data, pred)
         for path, size, difficult, image, data_yx_min, data_yx_max, data_cls, yx_min, yx_max, iou, prob, cls in zip(
                 *(data[key]
                   for key in 'path, size, difficult'.split(', ')),
                 *(torch.unbind(data[key])
                   for key in 'image, yx_min, yx_max, cls'.split(', ')),
                 *(torch.unbind(pred[key].view(batch_size, -1, 2))
                   for key in 'yx_min, yx_max'.split(', ')),
                 *(torch.unbind(pred[key].view(batch_size, -1))
                   for key in 'iou, prob, cls'.split(', '))):
             data_yx_min, data_yx_max, data_cls = filter_valid(
                 data_yx_min, data_yx_max, data_cls, difficult)
             for c in data_cls.cpu().numpy():
                 cls_num[c] += 1
             yx_min, yx_max, cls, score = self.filter_visible(
                 yx_min, yx_max, iou, prob, cls)
             keep = pybenchmark.profile('nms')(utils.postprocess.nms)(
                 yx_min, yx_max, score,
                 self.config.getfloat('detect', 'overlap'))
             if keep:
                 keep = utils.ensure_device(torch.LongTensor(keep))
                 yx_min, yx_max, cls, score = (t[keep]
                                               for t in (yx_min, yx_max,
                                                         cls, score))
                 for c in set(cls.cpu().numpy()):
                     c = int(c)  # PyTorch's bug
                     _score, tp = self.filter_cls(c, path, data_yx_min,
                                                  data_yx_max, data_cls,
                                                  yx_min, yx_max, cls,
                                                  score)
                     cls_score[c] = np.append(cls_score[c],
                                              _score.cpu().numpy())
                     cls_tp[c] = np.append(cls_tp[c], tp)
     return cls_num, cls_score, cls_tp
Ejemplo n.º 2
0
 def stat_ap(self):
     cls_num = [0 for _ in self.category]
     cls_score = [np.array([], dtype=np.float32) for _ in self.category]
     cls_tp = [np.array([], dtype=np.bool) for _ in self.category]
     for data in tqdm.tqdm(self.loader):
         for key in data:
             t = data[key]
             if torch.is_tensor(t):
                 data[key] = utils.ensure_device(t)
         tensor = torch.autograd.Variable(data['tensor'], volatile=True)
         pred = pybenchmark.profile('inference')(model._inference)(
             self.inference, tensor)
         pred['iou'] = pred['iou'].contiguous()
         logits = get_logits(pred)
         pred['prob'] = F.softmax(logits, -1)
         for key in pred:
             pred[key] = pred[key].data
         if self.config.getboolean('eval', 'debug'):
             self.debug_data(data)
             self.debug_pred(pred)
         norm_bbox_data(data)
         norm_bbox_pred(pred)
         for path, difficult, image, data_yx_min, data_yx_max, data_cls, iou, yx_min, yx_max, prob in zip(
                 *(data[key] for key in 'path, difficult'.split(', ')),
                 *(torch.unbind(data[key])
                   for key in 'image, yx_min, yx_max, cls'.split(', ')),
                 *(torch.unbind(pred[key])
                   for key in 'iou, yx_min, yx_max, prob'.split(', '))):
             data_yx_min, data_yx_max, data_cls = filter_valid(
                 data_yx_min, data_yx_max, data_cls, difficult)
             for c in data_cls.cpu().numpy():
                 cls_num[c] += 1
             iou = iou.view(-1)
             yx_min, yx_max, prob = (t.view(-1, t.size(-1))
                                     for t in (yx_min, yx_max, prob))
             ret = postprocess(self.config, iou, yx_min, yx_max, prob)
             if ret is not None:
                 iou, yx_min, yx_max, cls, score = ret
                 for c in set(cls.cpu().numpy()):
                     c = int(c)  # PyTorch's bug
                     _score, tp = self.filter_cls(c, path, data_yx_min,
                                                  data_yx_max, data_cls,
                                                  yx_min, yx_max, cls,
                                                  score)
                     cls_score[c] = np.append(cls_score[c],
                                              _score.cpu().numpy())
                     cls_tp[c] = np.append(cls_tp[c], tp)
     return cls_num, cls_score, cls_tp
Ejemplo n.º 3
0
 def stat_ap(self):
     cls_num = [0 for _ in self.category]
     cls_score = [np.array([], dtype=np.float32) for _ in self.category]
     cls_tp = [np.array([], dtype=np.bool) for _ in self.category]
     for data in tqdm.tqdm(self.loader):
         for key in data:
             t = data[key]
             if torch.is_tensor(t):
                 data[key] = utils.ensure_device(t)
         tensor = torch.autograd.Variable(data['tensor'], volatile=True)
         pred = pybenchmark.profile('inference')(model._inference)(self.inference, tensor)
         pred['iou'] = pred['iou'].contiguous()
         logits = get_logits(pred)
         pred['prob'] = F.softmax(logits, -1)
         for key in pred:
             pred[key] = pred[key].data
         if self.config.getboolean('eval', 'debug'):
             self.debug_data(data)
             self.debug_pred(pred)
         norm_bbox_data(data)
         norm_bbox_pred(pred)
         for path, difficult, image, data_yx_min, data_yx_max, data_cls, iou, yx_min, yx_max, prob in zip(*(data[key] for key in 'path, difficult'.split(', ')), *(torch.unbind(data[key]) for key in 'image, yx_min, yx_max, cls'.split(', ')), *(torch.unbind(pred[key]) for key in 'iou, yx_min, yx_max, prob'.split(', '))):
             data_yx_min, data_yx_max, data_cls = filter_valid(data_yx_min, data_yx_max, data_cls, difficult)
             for c in data_cls.cpu().numpy():
                 cls_num[c] += 1
             iou = iou.view(-1)
             yx_min, yx_max, prob = (t.view(-1, t.size(-1)) for t in (yx_min, yx_max, prob))
             ret = postprocess(self.config, iou, yx_min, yx_max, prob)
             if ret is not None:
                 iou, yx_min, yx_max, cls, score = ret
                 for c in set(cls.cpu().numpy()):
                     c = int(c)  # PyTorch's bug
                     _score, tp = self.filter_cls(c, path, data_yx_min, data_yx_max, data_cls, yx_min, yx_max, cls, score)
                     cls_score[c] = np.append(cls_score[c], _score.cpu().numpy())
                     cls_tp[c] = np.append(cls_tp[c], tp)
     return cls_num, cls_score, cls_tp