| import os |
| from typing import Optional |
|
|
| import pandas as pd |
| from mmengine.evaluator import BaseMetric |
|
|
| from opencompass.registry import METRICS |
|
|
|
|
| @METRICS.register_module() |
| class DumpResults(BaseMetric): |
| """Dump model's prediction to a file. |
| |
| Args: |
| save_path (str): the path to save model's prediction. |
| collect_device (str): Device name used for collecting results from |
| different ranks during distributed training. Must be 'cpu' or |
| 'gpu'. Defaults to 'cpu'. |
| prefix (str, optional): The prefix that will be added in the metric |
| names to disambiguate homonymous metrics of different evaluators. |
| If prefix is not provided in the argument, self.default_prefix |
| will be used instead. Default: None. |
| """ |
|
|
| def __init__(self, |
| save_path: str, |
| collect_device: str = 'cpu', |
| prefix: Optional[str] = None) -> None: |
| super().__init__(collect_device, prefix) |
| self.save_path = save_path |
| if not os.path.exists(os.path.dirname(self.save_path)): |
| os.makedirs(os.path.dirname(self.save_path), exist_ok=True) |
|
|
| def process(self, data_batch, data_samples) -> None: |
| for data_sample in data_samples: |
| result = dict() |
|
|
| result['question'] = data_sample.get('question') |
| result.update(data_sample.get('options_dict')) |
| result['prediction'] = data_sample.get('pred_answer') |
| if data_sample.get('category') is not None: |
| result['category'] = data_sample.get('category') |
| if data_sample.get('l2-category') is not None: |
| result['l2-category'] = data_sample.get('l2-category') |
| result['index'] = data_sample.get('index') |
| result['split'] = data_sample.get('split') |
| self.results.append(result) |
|
|
| def compute_metrics(self, results: list) -> dict: |
| df = pd.DataFrame(results) |
| with pd.ExcelWriter(self.save_path, engine='openpyxl') as writer: |
| df.to_excel(writer, index=False) |
| return {} |
|
|