def decode(self, loc_preds, cls_preds, input_size): '''Decode outputs back to bouding box locations and class labels. Args: loc_preds: (tensor) predicted locations, sized [#anchors, 4]. cls_preds: (tensor) predicted class labels, sized [#anchors, #classes]. input_size: (tuple) model input size of (w,h). Returns: boxes: (tensor) decode box locations, sized [#obj,4]. labels: (tensor) class labels for each box, sized [#obj,]. ''' CLS_THRESH = 0.5 NMS_THRESH = 0.5 input_size = torch.Tensor(input_size) anchor_boxes = self._get_anchor_boxes(input_size) # xywh loc_xy = loc_preds[:, :2] loc_wh = loc_preds[:, 2:] xy = loc_xy * anchor_boxes[:, 2:] + anchor_boxes[:, :2] wh = loc_wh.exp() * anchor_boxes[:, 2:] boxes = torch.cat([xy - wh / 2, xy + wh / 2], 1) # [#anchors,4] score, labels = cls_preds.sigmoid().max(1) # [#anchors,] ids = score > CLS_THRESH ids = ids.nonzero().squeeze() # [#obj,] keep = box_nms(boxes[ids], score[ids], threshold=NMS_THRESH) return boxes[ids][keep], labels[ids][keep]
def decode(self, loc_preds, cls_preds, score_thresh=0.5, nms_thresh=0.45): '''Decode predicted loc/cls back to real box locations and class labels. Args: loc_preds: (tensor) predicted loc, sized [#anchors,4]. cls_preds: (tensor) predicted conf, sized [#anchors,#classes]. score_thresh: (float) threshold for object confidence score. nms_thresh: (float) threshold for box nms. Returns: boxes: (tensor) bbox locations, sized [#obj,4]. labels: (tensor) class labels, sized [#obj,]. ''' anchor_boxes = change_box_order(self.anchor_boxes, 'xyxy2xywh').cuda() xy = loc_preds[:, :2] * anchor_boxes[:, 2:] + anchor_boxes[:, :2] wh = loc_preds[:, 2:].exp() * anchor_boxes[:, 2:] box_preds = torch.cat([xy - wh / 2, xy + wh / 2], 1) boxes = [] labels = [] scores = [] num_classes = cls_preds.size(1) # print (num_classes) for i in range(num_classes - 1): score = cls_preds[:, i + 1] # class i corresponds to (i+1) column # print (score) mask = score > score_thresh # print (mask) if not mask.any(): # print ("continue") continue box = box_preds[mask] score = score[mask] # print(box.size()) # print(score.size()) keep = box_nms(box, score, nms_thresh) boxes.append(box[keep]) labels.append(torch.empty_like(keep).fill_(i)) scores.append(score[keep]) # print (sizeof(boxes)) #print (np.array(boxes).shape) boxes = torch.cat(boxes, 0) labels = torch.cat(labels, 0) scores = torch.cat(scores, 0) return boxes, labels, scores
def decode(self, loc_preds, cls_preds, score_thresh=0.2, nms_thresh=0.45): print("decode called") '''Decode predicted loc/cls back to real box locations and class labels. Args: loc_preds: (tensor) predicted loc, sized [8732,4]. cls_preds: (tensor) predicted conf, sized [8732,21]. score_thresh: (float) threshold for object confidence score. nms_thresh: (float) threshold for box nms. Returns: boxes: (tensor) bbox locations, sized [#obj,4]. labels: (tensor) class labels, sized [#obj,]. ''' variances = (0.1, 0.2) xy = loc_preds[:, :2] * variances[ 0] * self.default_boxes[:, 2:] + self.default_boxes[:, :2] wh = torch.exp( loc_preds[:, 2:] * variances[1]) * self.default_boxes[:, 2:] box_preds = torch.cat([xy - wh / 2, xy + wh / 2], 1) boxes = [] labels = [] scores = [] num_classes = cls_preds.size(1) for i in range(num_classes - 1): score = cls_preds[:, i + 1] # class i corresponds to (i+1) column mask = score > score_thresh if not mask.any(): continue idxs = mask.nonzero().squeeze() if len(idxs.shape) == 0: box = box_preds[None, idxs, :] else: box = box_preds[idxs, :] score = score[mask] keep = box_nms(box, score, nms_thresh) boxes.append(box[keep]) labels.append(torch.LongTensor(len(box[keep])).fill_(i)) scores.append(score[keep]) boxes = torch.cat(boxes, 0) labels = torch.cat(labels, 0) scores = torch.cat(scores, 0) return boxes, labels, scores
def decode(self, loc_preds, cls_preds, score_thresh=0.6, nms_thresh=0.45): '''Decode predicted loc/cls back to real box locations and class labels. Args: loc_preds: (tensor) predicted loc, sized [8732,4]. cls_preds: (tensor) predicted conf, sized [8732,21]. score_thresh: (float) threshold for object confidence score. nms_thresh: (float) threshold for box nms. Returns: boxes: (tensor) bbox locations, sized [#obj,4]. labels: (tensor) class labels, sized [#obj,]. ''' variances = (0.1, 0.2) xy = loc_preds[:, :2] * variances[ 0] * self.default_boxes[:, 2:] + self.default_boxes[:, :2] wh = torch.exp( loc_preds[:, 2:] * variances[1]) * self.default_boxes[:, 2:] box_preds = torch.cat([xy - wh / 2, xy + wh / 2], 1) boxes = [] labels = [] scores = [] num_classes = cls_preds.size(1) for i in range(num_classes - 1): score = cls_preds[:, i + 1] # class i corresponds to (i+1) column mask = score > score_thresh if not mask.any(): continue box = box_preds[mask.nonzero().squeeze()] score = score[mask] if nms_thresh < 1.0: keep = box_nms(box, score, nms_thresh) else: keep = list(range(len(box))) boxes.append(box[keep]) labels.append(torch.LongTensor(len(box[keep])).fill_(i)) scores.append(score[keep]) try: boxes = torch.cat(boxes, 0) except RuntimeError: return torch.FloatTensor([]), torch.FloatTensor( []), torch.FloatTensor([]) labels = torch.cat(labels, 0) scores = torch.cat(scores, 0) return boxes, labels, scores
def decode(self, loc_preds, cls_preds, score_thresh=0.6, nms_thresh=0.45): '''Decode predicted loc/cls back to real box locations and class labels. Args: loc_preds: (tensor) predicted loc, sized [8732,4] or [8732,8]. cls_preds: (tensor) predicted conf, sized [8732,21]. score_thresh: (float) threshold for object confidence score. nms_thresh: (float) threshold for box nms. Returns: boxes: (tensor) bbox locations, sized [#obj,4]. labels: (tensor) class labels, sized [#obj,]. ''' #print("decode") #print(loc_preds.size()) #print(cls_preds.size()) variances = (1, 0.2) #xy = loc_preds[:,:2] * variances[0] * self.default_boxes[:,2:] + self.default_boxes[:,:2] #wh = torch.exp(loc_preds[:,2:]*variances[1]) * self.default_boxes[:,2:] #box_preds = torch.cat([xy-wh/2, xy+wh/2], 1) default_boxes = change_box_order(self.default_boxes, 'xywh2xyxyxyxy') box_preds = loc_preds * variances[ 0] * self.default_boxes[:, 2:].repeat(1, 4) + default_boxes boxes = [] labels = [] scores = [] num_classes = cls_preds.size(1) for i in range(num_classes - 1): score = cls_preds[:, i + 1] # class i corresponds to (i+1) column mask = score > score_thresh if not mask.any(): continue box = box_preds[mask.nonzero().squeeze()] score = score[mask] keep = box_nms(box, score, nms_thresh) boxes.append(box[keep]) labels.append(torch.LongTensor(len(box[keep])).fill_(i)) scores.append(score[keep]) boxes = torch.cat(boxes, 0) labels = torch.cat(labels, 0) scores = torch.cat(scores, 0) return boxes, labels, scores