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