(model, criterion, postprocessors, data_loader, base_ds, device, output_dir, tracker=None,
phase='train', det_val=False)
| 82 | |
| 83 | @torch.no_grad() |
| 84 | def evaluate(model, criterion, postprocessors, data_loader, base_ds, device, output_dir, tracker=None, |
| 85 | phase='train', det_val=False): |
| 86 | model.eval() |
| 87 | criterion.eval() |
| 88 | |
| 89 | metric_logger = utils.MetricLogger(delimiter=" ") |
| 90 | metric_logger.add_meter('class_error', utils.SmoothedValue(window_size=1, fmt='{value:.2f}')) |
| 91 | header = 'Test:' |
| 92 | |
| 93 | iou_types = tuple(k for k in ('segm', 'bbox') if k in postprocessors.keys()) |
| 94 | coco_evaluator = CocoEvaluator(base_ds, iou_types) |
| 95 | # coco_evaluator.coco_eval[iou_types[0]].params.iouThrs = [0, 0.1, 0.5, 0.75] |
| 96 | |
| 97 | panoptic_evaluator = None |
| 98 | if 'panoptic' in postprocessors.keys(): |
| 99 | panoptic_evaluator = PanopticEvaluator( |
| 100 | data_loader.dataset.ann_file, |
| 101 | data_loader.dataset.ann_folder, |
| 102 | output_dir=os.path.join(output_dir, "panoptic_eval"), |
| 103 | ) |
| 104 | |
| 105 | res_tracks = dict() |
| 106 | pre_embed = None |
| 107 | for samples, targets in metric_logger.log_every(data_loader, 10, header): |
| 108 | # pre process for track. |
| 109 | if tracker is not None: |
| 110 | if phase != 'train': |
| 111 | assert samples.tensors.shape[0] == 1, "Now only support inference of batchsize 1." |
| 112 | frame_id = targets[0].get("frame_id", None) |
| 113 | assert frame_id is not None |
| 114 | frame_id = frame_id.item() |
| 115 | if frame_id == 1: |
| 116 | tracker.reset_all() |
| 117 | pre_embed = None |
| 118 | |
| 119 | samples = samples.to(device) |
| 120 | targets = [{k: v.to(device) for k, v in t.items()} for t in targets] |
| 121 | |
| 122 | if det_val: |
| 123 | outputs = model(samples) |
| 124 | else: |
| 125 | outputs, pre_embed = model(samples, pre_embed) |
| 126 | loss_dict = criterion(outputs, targets) |
| 127 | weight_dict = criterion.weight_dict |
| 128 | |
| 129 | # reduce losses over all GPUs for logging purposes |
| 130 | loss_dict_reduced = utils.reduce_dict(loss_dict) |
| 131 | loss_dict_reduced_scaled = {k: v * weight_dict[k] |
| 132 | for k, v in loss_dict_reduced.items() if k in weight_dict} |
| 133 | loss_dict_reduced_unscaled = {f'{k}_unscaled': v |
| 134 | for k, v in loss_dict_reduced.items()} |
| 135 | metric_logger.update(loss=sum(loss_dict_reduced_scaled.values()), |
| 136 | **loss_dict_reduced_scaled, |
| 137 | **loss_dict_reduced_unscaled) |
| 138 | metric_logger.update(class_error=loss_dict_reduced['class_error']) |
| 139 | |
| 140 | orig_target_sizes = torch.stack([t["orig_size"] for t in targets], dim=0) |
| 141 | results = postprocessors['bbox'](outputs, orig_target_sizes) |
no test coverage detected