import os.path as osp from mmengine.fileio import load from tabulate import tabulate class BaseWeightList: """Class for generating model list in markdown format. Args: dataset_list (list[str]): List of dataset names. table_header (list[str]): List of table header. msg (str): Message to be displayed. task_abbr (str): Abbreviation of task name. metric_name (str): Metric name. """ base_url: str = 'https://github.com/open-mmlab/mmocr/blob/1.x/' table_cfg: dict = dict( tablefmt='pipe', floatfmt='.2f', numalign='right', stralign='center') dataset_list: list table_header: list msg: str task_abbr: str metric_name: str def __init__(self): data = (d + f' ({self.metric_name})' for d in self.dataset_list) self.table_header = ['Model', 'README', *data] def _get_model_info(self, task_name: str): meta_indexes = load('../../model-index.yml') for meta_path in meta_indexes['Import']: meta_path = osp.join('../../', meta_path) metainfo = load(meta_path) collection2md = {} for item in metainfo['Collections']: url = self.base_url + item['README'] collection2md[item['Name']] = f'[link]({url})' for item in metainfo['Models']: if task_name not in item['Config']: continue name = f'`{item["Name"]}`' if item.get('Alias', None): if isinstance(item['Alias'], str): item['Alias'] = [item['Alias']] aliases = [f'`{alias}`' for alias in item['Alias']] aliases.append(name) name = ' / '.join(aliases) readme = collection2md[item['In Collection']] eval_res = self._get_eval_res(item) yield (name, readme, *eval_res) def _get_eval_res(self, item): eval_res = {k: '-' for k in self.dataset_list} for res in item['Results']: if res['Dataset'] in self.dataset_list: eval_res[res['Dataset']] = res['Metrics'][self.metric_name] return (eval_res[k] for k in self.dataset_list) def gen_model_list(self): content = f'\n{self.msg}\n' content += '```{table}\n:class: model-summary nowrap field-list ' content += 'table table-hover\n' content += tabulate( self._get_model_info(self.task_abbr), self.table_header, **self.table_cfg) content += '\n```\n' return content class TextDetWeightList(BaseWeightList): dataset_list = ['ICDAR2015', 'CTW1500', 'Totaltext'] msg = '### Text Detection' task_abbr = 'textdet' metric_name = 'hmean-iou' class TextRecWeightList(BaseWeightList): dataset_list = [ 'Avg', 'IIIT5K', 'SVT', 'ICDAR2013', 'ICDAR2015', 'SVTP', 'CT80' ] msg = ('### Text Recognition\n' '```{note}\n' 'Avg is the average on IIIT5K, SVT, ICDAR2013, ICDAR2015, SVTP,' ' CT80.\n```\n') task_abbr = 'textrecog' metric_name = 'word_acc' def _get_eval_res(self, item): eval_res = {k: '-' for k in self.dataset_list} avg = [] for res in item['Results']: if res['Dataset'] in self.dataset_list: eval_res[res['Dataset']] = res['Metrics'][self.metric_name] avg.append(res['Metrics'][self.metric_name]) eval_res['Avg'] = sum(avg) / len(avg) return (eval_res[k] for k in self.dataset_list) class KIEWeightList(BaseWeightList): dataset_list = ['wildreceipt'] msg = '### Key Information Extraction' task_abbr = 'kie' metric_name = 'macro_f1' def gen_weight_list(): content = TextDetWeightList().gen_model_list() content += TextRecWeightList().gen_model_list() content += KIEWeightList().gen_model_list() return content