Team Ai
Apppublic

MLVLab/Human_Object_Interaction

sourceHugging Faceapache-2.0updated 3y agoView on Hugging Face
1likes
evaluator_coco.py62 linesDownload Raw Back to engine
1import os2import torch3import hotr.util.misc as utils4import hotr.util.logger as loggers5from hotr.data.evaluators.coco_eval import CocoEvaluator6 7@torch.no_grad()8def coco_evaluate(model, criterion, postprocessors, data_loader, base_ds, device, output_dir):9    model.eval()10    criterion.eval()11 12    metric_logger = loggers.MetricLogger(delimiter="  ")13    metric_logger.add_meter('class_error', utils.SmoothedValue(window_size=1, fmt='{value:.2f}'))14    header = 'Evaluation'15 16    iou_types = tuple(k for k in ('segm', 'bbox') if k in postprocessors.keys())17    coco_evaluator = CocoEvaluator(base_ds, iou_types)18    print_freq = len(data_loader)19    # coco_evaluator.coco_eval[iou_types[0]].params.iouThrs = [0, 0.1, 0.5, 0.75]20 21    print("\n>>> [MS-COCO Evaluation] <<<")22    for samples, targets in metric_logger.log_every(data_loader, print_freq, header):23        samples = samples.to(device)24        targets = [{k: v.to(device) for k, v in t.items()} for t in targets]25 26        outputs = model(samples)27        loss_dict = criterion(outputs, targets)28        weight_dict = criterion.weight_dict29 30        # reduce losses over all GPUs for logging purposes31        loss_dict_reduced = utils.reduce_dict(loss_dict)32        loss_dict_reduced_scaled = {k: v * weight_dict[k]33                                    for k, v in loss_dict_reduced.items() if k in weight_dict}34        loss_dict_reduced_unscaled = {f'{k}_unscaled': v35                                      for k, v in loss_dict_reduced.items()}36        metric_logger.update(loss=sum(loss_dict_reduced_scaled.values()),37                             **loss_dict_reduced_scaled,38                             **loss_dict_reduced_unscaled)39        metric_logger.update(class_error=loss_dict_reduced['class_error'])40 41        orig_target_sizes = torch.stack([t["orig_size"] for t in targets], dim=0)42        results = postprocessors['bbox'](outputs, orig_target_sizes)43        res = {target['image_id'].item(): output for target, output in zip(targets, results)}44        if coco_evaluator is not None:45            coco_evaluator.update(res)46 47    # gather the stats from all processes48    metric_logger.synchronize_between_processes()49    print("\n>>> [Averaged stats] <<<\n", metric_logger)50    if coco_evaluator is not None:51        coco_evaluator.synchronize_between_processes()52 53    # accumulate predictions from all images54    if coco_evaluator is not None:55        coco_evaluator.accumulate()56        coco_evaluator.summarize()57    stats = {k: meter.global_avg for k, meter in metric_logger.meters.items()}58    if coco_evaluator is not None:59        if 'bbox' in postprocessors.keys():60            stats['coco_eval_bbox'] = coco_evaluator.coco_eval['bbox'].stats.tolist()61            62    return stats, coco_evaluator