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