Beispiel #1
0
 def eval(outputs, meta, running_scores):
     distance_map = meta['ori_distance_map']
     seg_label_map = meta['ori_target']
     gt_mask_label = DTOffsetHelper.distance_to_mask_label(
         distance_map, seg_label_map, return_tensor=False)
     mask_pred = MaskTask.get_mask_pred(outputs['mask'])
     running_scores['mask'].update((mask_pred == 1).astype(np.int)[None],
                                   gt_mask_label[None])
Beispiel #2
0
    def forward(self, inputs, targets, **kwargs):

        from lib.utils.helpers.offset_helper import DTOffsetHelper

        pred_mask, pred_direction = inputs

        seg_label_map, distance_map, angle_map = targets[0], targets[
            1], targets[2]
        gt_mask = DTOffsetHelper.distance_to_mask_label(distance_map,
                                                        seg_label_map,
                                                        return_tensor=True)

        gt_size = gt_mask.shape[1:]
        mask_weights = self.calc_weights(gt_mask, 2)

        pred_direction = F.interpolate(pred_direction,
                                       size=gt_size,
                                       mode="bilinear",
                                       align_corners=True)
        pred_mask = F.interpolate(pred_mask,
                                  size=gt_size,
                                  mode="bilinear",
                                  align_corners=True)
        mask_loss = F.cross_entropy(pred_mask,
                                    gt_mask,
                                    weight=mask_weights,
                                    ignore_index=-1)

        mask_threshold = float(os.environ.get('mask_threshold', 0.5))
        binary_pred_mask = torch.softmax(pred_mask,
                                         dim=1)[:, 1, :, :] > mask_threshold

        gt_direction = DTOffsetHelper.angle_to_direction_label(
            angle_map,
            seg_label_map=seg_label_map,
            extra_ignore_mask=(binary_pred_mask == 0),
            return_tensor=True)

        direction_loss_mask = gt_direction != -1
        direction_weights = self.calc_weights(
            gt_direction[direction_loss_mask], pred_direction.size(1))
        direction_loss = F.cross_entropy(pred_direction,
                                         gt_direction,
                                         weight=direction_weights,
                                         ignore_index=-1)

        if self.training \
           and self.configer.get('iters') % self.configer.get('solver', 'display_iter') == 0 \
           and torch.cuda.current_device() == 0:
            Log.info('mask loss: {} direction loss: {}.'.format(
                mask_loss, direction_loss))

        mask_weight = float(os.environ.get('mask_weight', 1))
        direction_weight = float(os.environ.get('direction_weight', 1))

        return mask_weight * mask_loss + direction_weight * direction_loss
Beispiel #3
0
    def eval(outputs, meta, running_scores):
        distance_map = meta['ori_distance_map']
        seg_label_map = meta['ori_target']
        dir_label_map = meta['ori_multi_label_direction_map']
        dir_label_map = DTOffsetHelper.encode_multi_labels(dir_label_map)
        dir_label_map[seg_label_map == -1, :] = -1
        gt_mask_label = DTOffsetHelper.distance_to_mask_label(
            distance_map, seg_label_map, return_tensor=False)

        mask_pred = MaskTask.get_mask_pred(outputs['mask'])
        dir_pred = MLDirectionTask._get_multilabel_prediction(
            outputs['ml_dir'], no_offset_mask=mask_pred == 0, topk=8)

        running_scores['ML dir (mask)'].update(
            dir_pred, dir_label_map, (mask_pred == 1) & (seg_label_map != -1))
        running_scores['ML dir (GT)'].update(dir_pred, dir_label_map,
                                             gt_mask_label == 1)
Beispiel #4
0
    def load_boundary(self, fn):
        if fn.endswith('mat'):
            mat = io.loadmat(fn)
            if 'depth' in mat:
                dist_map, _ = self._load_maps(fn, None)
                boundary_map = DTOffsetHelper.distance_to_mask_label(
                    dist_map, np.zeros_like(dist_map)).astype(np.float32)
            else:
                boundary_map = mat['mat'].transpose(1, 2, 0)
        else:
            boundary_map = ImageHelper.read_image(fn,
                                                  tool=self.configer.get(
                                                      'data', 'image_tool'),
                                                  mode='P')
            boundary_map = boundary_map.astype(np.float32) / 255

        return boundary_map
Beispiel #5
0
    def eval(outputs, meta, running_scores):
        distance_map = meta['ori_distance_map']
        angle_map = meta['ori_angle_map']
        seg_label_map = meta['ori_target']

        mask_pred = MaskTask.get_mask_pred(outputs['mask'])
        dir_pred = np.argmax(outputs['dir'], axis=-1)

        gt_mask_label = DTOffsetHelper.distance_to_mask_label(
            distance_map, seg_label_map, return_tensor=False)
        gt_dir_label = DTOffsetHelper.angle_to_direction_label(
            angle_map,
            seg_label_map=seg_label_map,
            extra_ignore_mask=mask_pred != 1)

        running_scores['dir (mask)'].update(dir_pred[None], gt_dir_label[None])

        dir_pred[mask_pred != 1] = DTOffsetConfig.num_classes
        gt_dir_label = DTOffsetHelper.angle_to_direction_label(
            angle_map,
            seg_label_map=seg_label_map,
            extra_ignore_mask=(gt_mask_label == 0),
        )
        running_scores['dir (GT)'].update(dir_pred[None], gt_dir_label[None])