Mountchicken's picture
Upload 704 files
9bf4bd7
raw
history blame
4.88 kB
# Copyright (c) OpenMMLab. All rights reserved.
import os.path as osp
from typing import List, Optional, Tuple
from mmocr.registry import DATA_PARSERS
from mmocr.utils import bbox2poly
from .base import BaseParser
@DATA_PARSERS.register_module()
class ICDARTxtTextDetAnnParser(BaseParser):
"""ICDAR Txt Format Text Detection Annotation Parser.
The original annotation format of this dataset is stored in txt files,
which is formed as the following format:
x1, y1, x2, y2, x3, y3, x4, y4, transcription
Args:
separator (str): The separator between each element in a line. Defaults
to ','.
ignore (str): The text to be ignored. Defaults to '###'.
format (str): The format of the annotation. Defaults to
'x1,y1,x2,y2,x3,y3,x4,trans'.
encoding (str): The encoding of the annotation file. Defaults to
'utf-8-sig'.
nproc (int): The number of processes to parse the annotation. Defaults
to 1.
remove_strs (List[str], Optional): Used to remove redundant strings in
the transcription. Defaults to None.
mode (str, optional): The mode of the box converter. Supported modes
are 'xywh' and 'xyxy'. Defaults to None.
"""
def __init__(self,
separator: str = ',',
ignore: str = '###',
format: str = 'x1,y1,x2,y2,x3,y3,x4,y4,trans',
encoding: str = 'utf-8',
remove_strs: Optional[List[str]] = None,
mode: str = None,
**kwargs) -> None:
self.sep = separator
self.format = format
self.encoding = encoding
self.ignore = ignore
self.mode = mode
self.remove_strs = remove_strs
super().__init__(**kwargs)
def parse_file(self, img_path: str, ann_path: str) -> Tuple:
"""Parse single annotation."""
instances = list()
for anno in self.loader(ann_path, self.sep, self.format,
self.encoding):
anno = list(anno.values())
if self.remove_strs is not None:
for strs in self.remove_strs:
for i in range(len(anno)):
if strs in anno[i]:
anno[i] = anno[i].replace(strs, '')
poly = list(map(float, anno[0:-1]))
if self.mode is not None:
poly = bbox2poly(poly, self.mode)
poly = poly.tolist()
text = anno[-1]
instances.append(
dict(poly=poly, text=text, ignore=text == self.ignore))
return img_path, instances
@DATA_PARSERS.register_module()
class ICDARTxtTextRecogAnnParser(BaseParser):
"""ICDAR Txt Format Text Recognition Annotation Parser.
The original annotation format of this dataset is stored in txt files,
which is formed as the following format:
img_path, transcription
Args:
separator (str): The separator between each element in a line. Defaults
to ','.
ignore (str): The text to be ignored. Defaults to '#'.
format (str): The format of the annotation. Defaults to 'img, text'.
encoding (str): The encoding of the annotation file. Defaults to
'utf-8-sig'.
nproc (int): The number of processes to parse the annotation. Defaults
to 1.
base_name (bool): Whether to use the basename of the image path as the
image name. Defaults to False.
remove_strs (List[str], Optional): Used to remove redundant strings in
the transcription. Defaults to ['"'].
"""
def __init__(self,
separator: str = ',',
ignore: str = '#',
format: str = 'img,text',
encoding: str = 'utf-8',
remove_strs: Optional[List[str]] = ['"'],
**kwargs) -> None:
self.sep = separator
self.format = format
self.encoding = encoding
self.ignore = ignore
self.remove_strs = remove_strs
super().__init__(**kwargs)
def parse_files(self, img_dir: str, ann_path: str) -> List:
"""Parse annotations."""
assert isinstance(ann_path, str)
samples = list()
for anno in self.loader(
file_path=ann_path,
format=self.format,
encoding=self.encoding,
separator=self.sep):
text = anno['text'].strip()
if self.remove_strs is not None:
for strs in self.remove_strs:
text = text.replace(strs, '')
if text == self.ignore:
continue
img_name = anno['img']
samples.append((osp.join(img_dir, img_name), text))
return samples