Source code for datumaro.plugins.icdar_format.converter

# Copyright (C) 2020 Intel Corporation
#
# SPDX-License-Identifier: MIT

import os
import os.path as osp

from datumaro.components.annotation import AnnotationType, CompiledMask
from datumaro.components.converter import Converter
from datumaro.components.errors import DatumaroError, MediaTypeError
from datumaro.components.media import Image
from datumaro.util.image import save_image
from datumaro.util.mask_tools import generate_colormap, paint_mask

from .format import IcdarPath


[docs]class IcdarWordRecognitionConverter(Converter): DEFAULT_IMAGE_EXT = IcdarPath.IMAGE_EXT
[docs] def apply(self): if self._extractor.media_type() and not issubclass(self._extractor.media_type(), Image): raise MediaTypeError("Media type is not an image") for subset_name, subset in self._extractor.subsets().items(): annotation = "" for item in subset: image_filename = self._make_image_filename(item) if self._save_media and item.media: self._save_image( item, osp.join(self._save_dir, subset_name, IcdarPath.IMAGES_DIR, image_filename), ) annotation += "%s, " % image_filename for ann in item.annotations: if ann.type != AnnotationType.caption: continue annotation += '"%s"' % ann.caption annotation += "\n" if len(annotation): anno_file = osp.join(self._save_dir, subset_name, "gt.txt") os.makedirs(osp.dirname(anno_file), exist_ok=True) with open(anno_file, "w", encoding="utf-8") as f: f.write(annotation)
[docs]class IcdarTextLocalizationConverter(Converter): DEFAULT_IMAGE_EXT = IcdarPath.IMAGE_EXT
[docs] def apply(self): if self._extractor.media_type() and not issubclass(self._extractor.media_type(), Image): raise MediaTypeError("Media type is not an image") for subset_name, subset in self._extractor.subsets().items(): for item in subset: if self._save_media and item.media: self._save_image(item, subdir=osp.join(subset_name, IcdarPath.IMAGES_DIR)) annotation = "" for ann in item.annotations: if ann.type == AnnotationType.bbox: annotation += " ".join(str(p) for p in ann.points) if ann.attributes and "text" in ann.attributes: annotation += ' "%s"' % ann.attributes["text"] elif ann.type == AnnotationType.polygon: annotation += ",".join(str(p) for p in ann.points) if ann.attributes and "text" in ann.attributes: annotation += ',"%s"' % ann.attributes["text"] annotation += "\n" anno_file = osp.join( self._save_dir, subset_name, osp.dirname(item.id), "gt_" + osp.basename(item.id) + ".txt", ) os.makedirs(osp.dirname(anno_file), exist_ok=True) with open(anno_file, "w", encoding="utf-8") as f: f.write(annotation)
[docs]class IcdarTextSegmentationConverter(Converter): DEFAULT_IMAGE_EXT = IcdarPath.IMAGE_EXT
[docs] def apply(self): if self._extractor.media_type() and not issubclass(self._extractor.media_type(), Image): raise MediaTypeError("Media type is not an image") for subset_name, subset in self._extractor.subsets().items(): for item in subset: self._save_item(subset_name, subset, item)
def _save_item(self, subset_name, subset, item): if self._save_media and item.media: self._save_image(item, subdir=osp.join(subset_name, IcdarPath.IMAGES_DIR)) annotation = "" anns = [a for a in item.annotations if a.type == AnnotationType.mask] color_bank = iter(generate_colormap(len(anns), include_background=False).values()) colormap = [(255, 255, 255)] used_colors = set(colormap) if anns: anns = sorted(anns, key=lambda a: int(a.attributes.get("index", 0))) group = anns[0].group for i, ann in enumerate(anns): # Assign new color if it is not defined color = ann.attributes.get("color", "") if color: color = color.split() if len(color) != 3: raise DatumaroError("Item %s: mask #%s has invalid color" % (item.id, i)) color = tuple(map(int, color)) else: color = next(color_bank) while color in used_colors: color = next(color_bank) colormap.append(color) used_colors.add(color) text = ann.attributes.get("text", "") bbox = ann.get_bbox() if ann.group != group or (not ann.group and anns[0].group != 0): annotation += "\n" if text == " ": annotation += "#" annotation += " ".join(str(p) for p in color) annotation += " %s" % ann.attributes.get("center", "- -") annotation += " %s %s %s %s" % ( bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3], ) annotation += ' "%s"' % text annotation += "\n" group = ann.group mask = CompiledMask.from_instance_masks( anns, instance_labels=[m.attributes["index"] + 1 for m in anns] ) mask = paint_mask(mask.class_mask, {i: colormap[i] for i in range(len(colormap))}) save_image( osp.join(self._save_dir, subset_name, item.id + "_GT" + IcdarPath.GT_EXT), mask, create_dir=True, ) anno_file = osp.join(self._save_dir, subset_name, item.id + "_GT" + ".txt") os.makedirs(osp.dirname(anno_file), exist_ok=True) with open(anno_file, "w", encoding="utf-8") as f: f.write(annotation)