From 4ba0e43f35ae936cc390f4f05170b1452265645e Mon Sep 17 00:00:00 2001 From: Yoann Schneider <yschneider@teklia.com> Date: Tue, 8 Nov 2022 22:56:47 +0100 Subject: [PATCH] refactoring + packaging --- .../generic_dataset_formatter.py | 35 - .../dataset_formatters/read2016_formatter.py | 509 ------- .../dataset_formatters/rimes_formatter.py | 257 ---- .../dataset_formatters/simara_formatter.py | 35 - Datasets/dataset_formatters/utils_dataset.py | 36 - Fonts/list_fonts_read_2016.txt | 41 - Fonts/list_fonts_rimes.txt | 95 -- LICENSE_CECILL-C.md | 517 ------- OCR/line_OCR/ctc/main_line_ctc.py | 33 - OCR/line_OCR/ctc/main_syn_line.py | 33 - OCR/line_OCR/ctc/models_line_ctc.py | 33 - OCR/line_OCR/ctc/trainer_line_ctc.py | 33 - OCR/ocr_manager.py | 35 - README.md | 79 - basic/generic_dataset_manager.py | 34 - basic/generic_training_manager.py | 34 - basic/metric_manager.py | 35 - basic/scheduler.py | 34 - basic/transforms.py | 33 - basic/utils.py | 33 - dan/cli.py | 32 + dan/datasets/__init__.py | 0 dan/datasets/extract/__init__.py | 0 dan/datasets/extract/arkindex_utils.py | 67 + dan/datasets/extract/extract_from_arkindex.py | 135 ++ dan/datasets/extract/utils.py | 50 + dan/datasets/format/__init__.py | 0 dan/datasets/format/generic.py | 91 ++ dan/datasets/format/simara.py | 108 ++ dan/datasets/utils.py | 10 + dan/decoder.py | 3 - dan/manager/__init__.py | 0 dan/manager/dataset.py | 441 ++++++ dan/manager/metrics.py | 522 +++++++ dan/manager/ocr.py | 640 ++++++++ dan/manager/training.py | 1291 +++++++++++++++++ dan/manager/utils.py | 81 ++ dan/models.py | 35 - dan/ocr/__init__.py | 0 dan/ocr/document/__init__.py | 0 dan/ocr/document/train.py | 234 +++ dan/ocr/line/__init__.py | 0 dan/ocr/line/generate_synthetic.py | 165 +++ dan/ocr/line/model_utils.py | 22 + dan/ocr/line/train.py | 207 +++ dan/ocr/line/utils.py | 96 ++ dan/ocr/train.py | 14 + dan/ocr/utils.py | 17 + dan/ocr_utils.py | 53 - dan/post_processing.py | 232 +-- dan/predict.py | 2 +- dan/schedulers.py | 47 + dan/transforms.py | 510 +++++++ dan/utils.py | 149 ++ images/visual.png | Bin 0 -> 134135 bytes images/visual_slanted_lines.png | Bin 0 -> 213318 bytes 56 files changed, 4931 insertions(+), 2297 deletions(-) delete mode 100644 Datasets/dataset_formatters/read2016_formatter.py delete mode 100644 Datasets/dataset_formatters/rimes_formatter.py delete mode 100644 Fonts/list_fonts_read_2016.txt delete mode 100644 Fonts/list_fonts_rimes.txt delete mode 100644 LICENSE_CECILL-C.md create mode 100644 dan/cli.py create mode 100644 dan/datasets/__init__.py create mode 100644 dan/datasets/extract/__init__.py create mode 100644 dan/datasets/extract/arkindex_utils.py create mode 100644 dan/datasets/extract/extract_from_arkindex.py create mode 100644 dan/datasets/extract/utils.py create mode 100644 dan/datasets/format/__init__.py create mode 100644 dan/datasets/format/generic.py create mode 100644 dan/datasets/format/simara.py create mode 100644 dan/datasets/utils.py create mode 100644 dan/manager/__init__.py create mode 100644 dan/manager/dataset.py create mode 100644 dan/manager/metrics.py create mode 100644 dan/manager/ocr.py create mode 100644 dan/manager/training.py create mode 100644 dan/manager/utils.py create mode 100644 dan/ocr/__init__.py create mode 100644 dan/ocr/document/__init__.py create mode 100644 dan/ocr/document/train.py create mode 100644 dan/ocr/line/__init__.py create mode 100644 dan/ocr/line/generate_synthetic.py create mode 100644 dan/ocr/line/model_utils.py create mode 100644 dan/ocr/line/train.py create mode 100644 dan/ocr/line/utils.py create mode 100644 dan/ocr/train.py create mode 100644 dan/ocr/utils.py delete mode 100644 dan/ocr_utils.py create mode 100644 dan/schedulers.py create mode 100644 dan/transforms.py create mode 100644 dan/utils.py create mode 100644 images/visual.png create mode 100644 images/visual_slanted_lines.png diff --git a/Datasets/dataset_formatters/generic_dataset_formatter.py b/Datasets/dataset_formatters/generic_dataset_formatter.py index e474ed45..ae55af02 100644 --- a/Datasets/dataset_formatters/generic_dataset_formatter.py +++ b/Datasets/dataset_formatters/generic_dataset_formatter.py @@ -1,38 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - import os import shutil import tarfile diff --git a/Datasets/dataset_formatters/read2016_formatter.py b/Datasets/dataset_formatters/read2016_formatter.py deleted file mode 100644 index 5a0b0452..00000000 --- a/Datasets/dataset_formatters/read2016_formatter.py +++ /dev/null @@ -1,509 +0,0 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - -from Datasets.dataset_formatters.generic_dataset_formatter import OCRDatasetFormatter -import os -import numpy as np -from PIL import Image -import xml.etree.ElementTree as ET - - -# Layout begin-token to end-token -SEM_MATCHING_TOKENS = { - "â“‘": "â’·", # paragraph (body) - "â“": "â’¶", # annotation - "ⓟ": "â“…", # page - "â“": "Ⓝ", # page number - "â“¢": "Ⓢ", # section (=linked annotation + body) - } - - -class READ2016DatasetFormatter(OCRDatasetFormatter): - def __init__(self, level, set_names=["train", "valid", "test"], dpi=150, end_token=True, sem_token=True): - super(READ2016DatasetFormatter, self).__init__("READ_2016", level, "_sem" if sem_token else "", set_names) - - self.map_datasets_files.update({ - "READ_2016": { - # (350 for train, 50 for validation and 50 for test) - "page": { - "arx_files": ["Test-ICFHR-2016.tgz", "Train-And-Val-ICFHR-2016.tgz"], - "needed_files": [], - "format_function": self.format_read2016_page, - }, - # (169 for train, 24 for validation and 24 for test) - "double_page": { - "arx_files": ["Test-ICFHR-2016.tgz", "Train-And-Val-ICFHR-2016.tgz"], - "needed_files": [], - "format_function": self.format_read2016_double_page, - } - } - }) - self.dpi = dpi - self.end_token = end_token - self.sem_token = sem_token - self.matching_token = SEM_MATCHING_TOKENS - - def init_format(self): - super().init_format() - os.rename(os.path.join(self.temp_fold, "PublicData", "Training"), os.path.join(self.temp_fold, "train")) - os.rename(os.path.join(self.temp_fold, "PublicData", "Validation"), os.path.join(self.temp_fold, "valid")) - os.rename(os.path.join(self.temp_fold, "Test-ICFHR-2016"), os.path.join(self.temp_fold, "test")) - os.rmdir(os.path.join(self.temp_fold, "PublicData")) - for set_name in ["train", "valid", ]: - for filename in os.listdir(os.path.join(self.temp_fold, set_name, "Images")): - filepath = os.path.join(self.temp_fold, set_name, "Images", filename) - if os.path.isfile(filepath): - os.rename(filepath, os.path.join(self.temp_fold, set_name, filename)) - os.rmdir(os.path.join(self.temp_fold, set_name, "Images")) - - def preformat_read2016(self): - """ - Extract all information from READ 2016 dataset and correct some mistakes - """ - def coord_str_to_points(coord_str): - """ - Extract bounding box from coord string - """ - points = coord_str.split(" ") - x_points, y_points = list(), list() - for p in points: - y_points.append(int(p.split(",")[1])) - x_points.append(int(p.split(",")[0])) - top, bottom, left, right = np.min(y_points), np.max(y_points), np.min(x_points), np.max(x_points) - return { - "left": left, - "bottom": bottom, - "top": top, - "right": right - } - - def baseline_str_to_points(coord_str): - """ - Extract bounding box from baseline string - """ - points = coord_str.split(" ") - x_points, y_points = list(), list() - for p in points: - y_points.append(int(p.split(",")[1])) - x_points.append(int(p.split(",")[0])) - top, bottom, left, right = np.min(y_points), np.max(y_points), np.min(x_points), np.max(x_points) - return { - "left": left, - "bottom": bottom, - "top": top, - "right": right - } - - dataset = { - "train": list(), - "valid": list(), - "test": list(), - } - for set_name in ["train", "valid", "test"]: - img_fold_path = os.path.join(self.temp_fold, set_name) - xml_fold_path = os.path.join(self.temp_fold, set_name, "page") - for xml_file_name in sorted(os.listdir(xml_fold_path)): - if xml_file_name.split(".")[-1] != "xml": - continue - filename = xml_file_name.split(".")[0] - img_path = os.path.join(img_fold_path, filename + ".JPG") - xml_file_path = os.path.join(xml_fold_path, xml_file_name) - xml_root = ET.parse(xml_file_path).getroot() - pages = xml_root.findall("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Page") - for page in pages: - page_dict = { - "label": list(), - "text_regions": list(), - "img_path": img_path, - "width": int(page.attrib["imageWidth"]), - "height": int(page.attrib["imageHeight"]) - } - text_regions = page.findall("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}TextRegion") - for text_region in text_regions: - text_region_dict = { - "label": list(), - "lines": list(), - "coords": coord_str_to_points(text_region.find("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Coords").attrib["points"]) - } - text_lines = text_region.findall("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}TextLine") - for text_line in text_lines: - text_line_label = text_line.find("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}TextEquiv")\ - .find("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Unicode")\ - .text - if text_line_label is None and \ - text_line.attrib["id"] not in ["line_a5f4ab4e-2ea0-4c65-840c-4a89b04bd477", - "line_e1288df8-8a0d-40df-be91-4b4a332027ec", - "line_455330f3-9e27-4340-ae86-9d6c448dc091", - "line_ecbbccee-e8c2-495d-ac47-0aff93f3d9ac", - "line_e918616d-64f8-43d2-869c-f687726212be", - "line_ebd8f850-1da5-45b1-b59c-9349497ecc8e", - "line_816fb2ce-06b0-4e00-bb28-10c8b9c367f2"]: - print("ignored null line{}".format(page_dict["img_path"])) - continue - if text_line.attrib["id"] == "line_816fb2ce-06b0-4e00-bb28-10c8b9c367f2": - label = "16" - elif text_line.attrib["id"] == "line_a5f4ab4e-2ea0-4c65-840c-4a89b04bd477": - label = "108" - elif text_line.attrib["id"] == "line_e1288df8-8a0d-40df-be91-4b4a332027ec": - label = "196" - elif text_line.attrib["id"] == "line_455330f3-9e27-4340-ae86-9d6c448dc091": - label = "199" - elif text_line.attrib["id"] == "line_ecbbccee-e8c2-495d-ac47-0aff93f3d9ac": - label = "202" - elif text_line.attrib["id"] == "line_e918616d-64f8-43d2-869c-f687726212be": - label = "214" - elif text_line.attrib["id"] == "line_ebd8f850-1da5-45b1-b59c-9349497ecc8e": - label = "216" - else: - label = self.format_text_label(text_line_label) - line_baseline = text_line.find("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Baseline") - line_coord = coord_str_to_points(text_line.find("{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Coords").attrib["points"]) - text_line_dict = { - "label": label, - "coords": line_coord, - "baseline_coords": baseline_str_to_points(line_baseline.attrib["points"]) if line_baseline is not None else line_coord - } - text_line_dict["label"] = text_line_dict["label"] - text_region_dict["label"].append(text_line_dict["label"]) - text_region_dict["lines"].append(text_line_dict) - if text_region_dict["label"] == list(): - print("ignored null region {}".format(page_dict["img_path"])) - continue - text_region_dict["label"] = self.format_text_label("\n".join(text_region_dict["label"])) - text_region_dict["baseline_coords"] = { - "left": min([line["baseline_coords"]["left"] for line in text_region_dict["lines"]]), - "right": max([line["baseline_coords"]["right"] for line in text_region_dict["lines"]]), - "bottom": max([line["baseline_coords"]["bottom"] for line in text_region_dict["lines"]]), - "top": min([line["baseline_coords"]["top"] for line in text_region_dict["lines"]]), - } - page_dict["label"].append(text_region_dict["label"]) - page_dict["text_regions"].append(text_region_dict) - page_dict["label"] = self.format_text_label("\n".join(page_dict["label"])) - dataset[set_name].append(page_dict) - - return dataset - - def format_read2016_page(self): - """ - Format the READ 2016 dataset at single-page level - """ - dataset = self.preformat_read2016() - for set_name in ["train", "valid", "test"]: - for i, page in enumerate(dataset[set_name]): - new_img_name = "{}_{}.jpeg".format(set_name, i) - new_img_path = os.path.join(self.target_fold_path, set_name, new_img_name) - self.load_resize_save(page["img_path"], new_img_path, 300, self.dpi) - new_label, sorted_text_regions, nb_cols, side = self.sort_text_regions(page["text_regions"], page["width"]) - paragraphs = list() - for paragraph in page["text_regions"]: - paragraph_label = { - "label": paragraph["label"], - "lines": list(), - "mode": paragraph["mode"] - } - for line in paragraph["lines"]: - paragraph_label["lines"].append({ - "text": line["label"], - "top": line["coords"]["top"], - "bottom": line["coords"]["bottom"], - "left": line["coords"]["left"], - "right": line["coords"]["right"], - }) - paragraph_label["lines"][-1] = self.adjust_coord_ratio(paragraph_label["lines"][-1], self.dpi / 300) - paragraph_label["top"] = min([line["top"] for line in paragraph_label["lines"]]) - paragraph_label["bottom"] = max([line["bottom"] for line in paragraph_label["lines"]]) - paragraph_label["left"] = min([line["left"] for line in paragraph_label["lines"]]) - paragraph_label["right"] = max([line["right"] for line in paragraph_label["lines"]]) - paragraphs.append(paragraph_label) - - if self.sem_token: - if self.end_token: - new_label = "ⓟ" + new_label + "â“…" - else: - new_label = "ⓟ" + new_label - - page_label = { - "text": new_label, - "paragraphs": paragraphs, - "nb_cols": nb_cols, - "side": side, - "top": min([pg["top"] for pg in paragraphs]), - "bottom": max([pg["bottom"] for pg in paragraphs]), - "left": min([pg["left"] for pg in paragraphs]), - "right": max([pg["right"] for pg in paragraphs]), - "page_width": int(np.array(Image.open(page["img_path"])).shape[1] * self.dpi / 300) - } - - self.gt[set_name][new_img_name] = { - "text": new_label, - "nb_cols": nb_cols, - "pages": [page_label, ], - } - self.charset = self.charset.union(set(page["label"])) - self.add_tokens_in_charset() - - def format_read2016_double_page(self): - """ - Format the READ 2016 dataset at double-page level - """ - dataset = self.preformat_read2016() - for set_name in ["train", "valid", "test"]: - for i, page in enumerate(dataset[set_name]): - dataset[set_name][i]["label"], dataset[set_name][i]["text_regions"], dataset[set_name][i]["nb_cols"], dataset[set_name][i]["side"] = \ - self.sort_text_regions(dataset[set_name][i]["text_regions"], dataset[set_name][i]["width"]) - dataset = self.group_by_page_number(dataset) - for set_name in ["train", "valid", "test"]: - i = 0 - for document in dataset[set_name]: - if len(document["pages"]) != 2: - continue - new_img_name = "{}_{}.jpeg".format(set_name, i) - new_img_path = os.path.join(self.target_fold_path, set_name, new_img_name) - img_left = np.array(Image.open(document["pages"][0]["img_path"])) - img_right = np.array(Image.open(document["pages"][1]["img_path"])) - left_page_width = img_left.shape[1] - right_page_width = img_right.shape[1] - img = np.concatenate([img_left, img_right], axis=1) - img = self.resize(img, 300, self.dpi) - img = Image.fromarray(img) - img.save(new_img_path) - pages = list() - for page_id, page in enumerate(document["pages"]): - page_label = { - "text": page["label"], - "paragraphs": list(), - "nb_cols": page["nb_cols"] - } - for paragraph in page["text_regions"]: - paragraph_label = { - "label": paragraph["label"], - "lines": list(), - "mode": paragraph["mode"] - } - for line in paragraph["lines"]: - paragraph_label["lines"].append({ - "text": line["label"], - "top": line["coords"]["top"], - "bottom": line["coords"]["bottom"], - "left": line["coords"]["left"] if page_id == 0 else line["coords"]["left"] + left_page_width, - "right": line["coords"]["right"]if page_id == 0 else line["coords"]["right"] + left_page_width, - }) - paragraph_label["lines"][-1] = self.adjust_coord_ratio(paragraph_label["lines"][-1], self.dpi / 300) - paragraph_label["top"] = min([line["top"] for line in paragraph_label["lines"]]) - paragraph_label["bottom"] = max([line["bottom"] for line in paragraph_label["lines"]]) - paragraph_label["left"] = min([line["left"] for line in paragraph_label["lines"]]) - paragraph_label["right"] = max([line["right"] for line in paragraph_label["lines"]]) - page_label["paragraphs"].append(paragraph_label) - page_label["top"] = min([pg["top"] for pg in page_label["paragraphs"]]) - page_label["bottom"] = max([pg["bottom"] for pg in page_label["paragraphs"]]) - page_label["left"] = min([pg["left"] for pg in page_label["paragraphs"]]) - page_label["right"] = max([pg["right"] for pg in page_label["paragraphs"]]) - page_label["page_width"] = int(left_page_width * self.dpi / 300) if page_id == 0 else int(right_page_width * self.dpi / 300) - page_label["side"] = page["side"] - pages.append(page_label) - - label_left = document["pages"][0]["label"] - label_right = document["pages"][1]["label"] - if self.sem_token: - if self.end_token: - document_label = "ⓟ" + label_left + "â“…" + "ⓟ" + label_right + "â“…" - else: - document_label = "ⓟ" + label_left + "ⓟ" + label_right - else: - document_label = label_left + "\n" + label_right - self.gt[set_name][new_img_name] = { - "text": document_label, - "nb_cols": document["pages"][0]["nb_cols"] + document["pages"][1]["nb_cols"], - "pages": pages, - } - self.charset = self.charset.union(set(document_label)) - i += 1 - self.add_tokens_in_charset() - - def add_tokens_in_charset(self): - """ - Add layout tokens to the charset - """ - if self.sem_token: - if self.end_token: - self.charset = self.charset.union(set("ⓢⓑâ“â“ⓈⒷⒶⓃⓟⓅ")) - else: - self.charset = self.charset.union(set("ⓢⓑâ“â“ⓟ")) - - def group_by_page_number(self, dataset): - """ - Group page data by pairs of successive pages - """ - new_dataset = { - "train": dict(), - "valid": dict(), - "test": dict() - } - for set_name in ["train", "valid", "test"]: - for page in dataset[set_name]: - page_num = int(page["text_regions"][0]["label"].replace(".", "").replace(" ", "").replace("â“", "").replace("Ⓝ", "")) - page["page_num"] = page_num - if page_num in new_dataset[set_name]: - new_dataset[set_name][page_num].append(page) - else: - new_dataset[set_name][page_num] = [page, ] - new_dataset[set_name] = [{"pages": new_dataset[set_name][key], - "page_num": new_dataset[set_name][key][0]["page_num"] - } for key in new_dataset[set_name]] - return new_dataset - - def update_label(self, label, start_token): - """ - Add layout token to text region transcription - """ - if self.sem_token: - if self.end_token: - return start_token + label + self.matching_token[start_token] - else: - return start_token + label - return label - - def merge_group_tr(self, group, text_region): - group["text_regions"].append(text_region) - group["coords"]["top"] = min([tr["coords"]["top"] for tr in group["text_regions"]]) - group["coords"]["bottom"] = max([tr["coords"]["bottom"] for tr in group["text_regions"]]) - group["coords"]["left"] = min([tr["coords"]["left"] for tr in group["text_regions"]]) - group["coords"]["right"] = max([tr["coords"]["right"] for tr in group["text_regions"]]) - group["baseline_coords"]["top"] = min([tr["baseline_coords"]["top"] for tr in group["text_regions"]]) - group["baseline_coords"]["bottom"] = max([tr["baseline_coords"]["bottom"] for tr in group["text_regions"]]) - group["baseline_coords"]["left"] = min([tr["baseline_coords"]["left"] for tr in group["text_regions"]]) - group["baseline_coords"]["right"] = max([tr["baseline_coords"]["right"] for tr in group["text_regions"]]) - - def is_annotation_alone(self, groups, page_width): - for group in groups: - if all([tr["coords"]["right"] < page_width / 2 and not tr["label"].replace(".", "").replace(" ", "").isdigit() for tr in group["text_regions"]]): - return True - return False - - def sort_text_regions(self, text_regions, page_width): - """ - Establish reading order based on paragraph pixel position: - page number then section by section: first all annotations, then associated body - """ - nb_cols = 1 - groups = list() - for text_region in text_regions: - added_in_group = False - temp_label = text_region["label"].replace(".", "").replace(" ", "") - if len(temp_label) <= 4 and temp_label.isdigit(): - groups.append({ - "coords": text_region["coords"].copy(), - "baseline_coords": text_region["baseline_coords"].copy(), - "text_regions": [text_region, ] - }) - groups[-1]["coords"]["top"] = 0 - groups[-1]["coords"]["bottom"] = 0 - groups[-1]["baseline_coords"]["top"] = 0 - groups[-1]["baseline_coords"]["bottom"] = 0 - continue - for group in groups: - if not (group["baseline_coords"]["bottom"] <= text_region["baseline_coords"]["top"] or - group["baseline_coords"]["top"] >= text_region["baseline_coords"]["bottom"] or - (text_region["coords"]["right"]-text_region["coords"]["left"] > 0.4*page_width and - group["coords"]["right"]-group["coords"]["left"] > 0.4*page_width)): - self.merge_group_tr(group, text_region) - added_in_group = True - break - - if not added_in_group: - groups.append({ - "coords": text_region["coords"].copy(), - "baseline_coords": text_region["baseline_coords"].copy(), - "text_regions": [text_region, ] - }) - while self.is_annotation_alone(groups, page_width): - new_groups = list() - annotations_groups = list() - body_groups = list() - for i in range(len(groups)): - group = groups[i] - if all([tr["label"].replace(".", "").replace(" ","").isdigit() for tr in group["text_regions"]]): - new_groups.append(group) - continue - if all([tr["coords"]["right"] < page_width / 2 for tr in group["text_regions"]]): - annotations_groups.append(group) - continue - body_groups.append(group) - for ag in annotations_groups: - dist = [min([abs(ag["coords"]["bottom"]-g["coords"]["top"]), abs(ag["coords"]["top"]-g["coords"]["bottom"])]) for g in body_groups] - index = np.argmin(dist) - for tr in ag["text_regions"]: - self.merge_group_tr(body_groups[index], tr) - new_groups.extend(body_groups) - groups = new_groups - ordered_groups = sorted(groups, key=lambda g: g["coords"]["top"]) - sorted_text_regions = list() - for group in ordered_groups: - text_regions = group["text_regions"] - if len(text_regions) == 1 and text_regions[0]["label"].replace(".", "").replace(" ", "").isdigit(): - side = "right" if text_regions[0]["coords"]["left"] > page_width / 2 else "left" - sorted_text_regions.append(text_regions[0]) - sorted_text_regions[-1]["mode"] = "page_number" - sorted_text_regions[-1]["label"] = self.update_label(sorted_text_regions[-1]["label"], "â“") - else: - left = [tr for tr in group["text_regions"] if tr["coords"]["right"] < page_width / 2] - right = [tr for tr in group["text_regions"] if tr["coords"]["right"] >= page_width / 2] - nb_cols = max(2 if len(left) > 0 else 1, nb_cols) - for i, text_region in enumerate(sorted(left, key=lambda tr: tr["coords"]["top"])): - sorted_text_regions.append(text_region) - sorted_text_regions[-1]["mode"] = "annotation" - sorted_text_regions[-1]["label"] = self.update_label(sorted_text_regions[-1]["label"], "â“") - if i == 0 and self.sem_token: - sorted_text_regions[-1]["label"] = "â“¢" + sorted_text_regions[-1]["label"] - for i, text_region in enumerate(sorted(right, key=lambda tr: tr["coords"]["top"])): - sorted_text_regions.append(text_region) - sorted_text_regions[-1]["mode"] = "body" - sorted_text_regions[-1]["label"] = self.update_label(sorted_text_regions[-1]["label"], "â“‘") - if i == 0 and self.sem_token and len(left) == 0: - sorted_text_regions[-1]["label"] = "â“¢" + sorted_text_regions[-1]["label"] - if i == len(right)-1 and self.sem_token and self.end_token: - sorted_text_regions[-1]["label"] = sorted_text_regions[-1]["label"] + self.matching_token["â“¢"] - - sep = "" if self.sem_token else "\n" - new_label = sep.join(t["label"] for t in sorted_text_regions) - return new_label, sorted_text_regions, nb_cols, side - - -if __name__ == "__main__": - - READ2016DatasetFormatter("page", sem_token=True).format() - READ2016DatasetFormatter("page", sem_token=False).format() - READ2016DatasetFormatter("double_page", sem_token=True).format() - READ2016DatasetFormatter("double_page", sem_token=False).format() \ No newline at end of file diff --git a/Datasets/dataset_formatters/rimes_formatter.py b/Datasets/dataset_formatters/rimes_formatter.py deleted file mode 100644 index 929a42a4..00000000 --- a/Datasets/dataset_formatters/rimes_formatter.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - -from Datasets.dataset_formatters.generic_dataset_formatter import OCRDatasetFormatter -import os -import numpy as np -from Datasets.dataset_formatters.utils_dataset import natural_sort -from PIL import Image -import xml.etree.ElementTree as ET -import re - -# Layout string to token -SEM_MATCHING_TOKENS_STR = { - 'Ouverture': "ⓞ", # opening - 'Corps de texte': "â“‘", # body - 'PS/PJ': "ⓟ", # post scriptum - 'Coordonnées Expéditeur': "â“¢", # sender - 'Reference': "â“¢", # also counted as sender information - 'Objet': "ⓨ", # why - 'Date, Lieu': "ⓦ", # where, when - 'Coordonnées Destinataire': "â“¡", # recipient - } - -# Layout begin-token to end-token -SEM_MATCHING_TOKENS = { - "â“‘": "â’·", - "ⓞ": "â“„", - "â“¡": "Ⓡ", - "â“¢": "Ⓢ", - "ⓦ": "Ⓦ", - "ⓨ": "Ⓨ", - "ⓟ": "â“…" - } - - -class RIMESDatasetFormatter(OCRDatasetFormatter): - def __init__(self, level, set_names=["train", "valid", "test"], dpi=150, sem_token=True): - super(RIMESDatasetFormatter, self).__init__("RIMES", level, "_sem" if sem_token else "", set_names) - - self.source_fold_path = os.path.join("../raw", "RIMES") - self.dpi = dpi - self.sem_token = sem_token - self.map_datasets_files.update({ - "RIMES": { - # (1,050 for train, 100 for validation and 100 for test) - "page": { - "arx_files": ["RIMES_page.tar.gz", ], - "needed_files": [], - "format_function": self.format_rimes_page, - }, - } - }) - - self.matching_tokens_str = SEM_MATCHING_TOKENS_STR - self.matching_tokens = SEM_MATCHING_TOKENS - self.ordering_function = order_text_regions - - def preformat_rimes_page(self): - """ - Extract all information from dataset and correct some annotations - """ - dataset = { - "train": list(), - "valid": list(), - "test": list() - } - img_folder_path = os.path.join(self.temp_fold, "RIMES page", "Images") - xml_folder_path = os.path.join(self.temp_fold, "RIMES page", "XML") - xml_files = natural_sort([os.path.join(xml_folder_path, name) for name in os.listdir(xml_folder_path)]) - train_xml = xml_files[:1050] - valid_xml = xml_files[1050:1150] - test_xml = xml_files[1150:] - for set_name, xml_files in zip(self.set_names, [train_xml, valid_xml, test_xml]): - for i, xml_path in enumerate(xml_files): - text_regions = list() - root = ET.parse(xml_path).getroot() - img_name = root.find("source").text - if img_name == "01160_L.png": - text_regions.append({ - "label": "LETTRE RECOMMANDEE\nAVEC ACCUSE DE RECEPTION", - "type": "", - "coords": { - "left": 88, - "right": 1364, - "top": 1224, - "bottom": 1448, - } - }) - for text_region in root.findall("box"): - type = text_region.find("type").text - label = text_region.find("text").text - if label is None or len(label.strip()) <= 0: - continue - if label == "Ref : QVLCP¨65": - label = label.replace("¨", "") - if img_name == "01094_L.png" and type == "Corps de texte": - label = "Suite à la tempête du 19.11.06, un\narbre est tombé sur mon toît et l'a endommagé.\nJe d'eplore une cinquantaine de tuiles à changer,\nune poutre à réparer et une gouttière à \nremplacer. Veuillez trouver ci-joint le devis\nde réparation. Merci de m'envoyer votre\nexpert le plus rapidement possible.\nEn esperant une réponse rapide de votre\npart, veuillez accepter, madame, monsieur,\nmes salutations distinguées." - elif img_name == "01111_L.png" and type == "Corps de texte": - label = "Je vous ai envoyé un courrier le 20 octobre 2006\nvous signalant un sinistre survenu dans ma\nmaison, un dégât des eaux consécutif aux\nfortes pluis.\nVous deviez envoyer un expert pour constater\nles dégâts. Personne n'est venu à ce jour\nJe vous prie donc de faire le nécessaire\nafin que les réparations nécessaires puissent\nêtre commencés.\nDans l'attente, veuillez agréer, Monsieur,\nmes sincères salutations" - - label = self.convert_label_accent(label) - label = self.convert_label(label) - label = self.format_text_label(label) - coords = { - "left": int(text_region.attrib["top_left_x"]), - "right": int(text_region.attrib["bottom_right_x"]), - "top": int(text_region.attrib["top_left_y"]), - "bottom": int(text_region.attrib["bottom_right_y"]), - } - text_regions.append({ - "label": label, - "type": type, - "coords": coords - }) - text_regions = self.ordering_function(text_regions) - dataset[set_name].append({ - "text_regions": text_regions, - "img_path": os.path.join(img_folder_path, img_name), - "label": "\n".join([tr["label"] for tr in text_regions]), - "sem_label": "".join([self.sem_label(tr["label"], tr["type"]) for tr in text_regions]), - }) - return dataset - - def convert_label_accent(self, label): - """ - Solve encoding issues - """ - return label.replace("\\n", "\n").replace("<euro>", "€").replace(">euro>", "€").replace(">fligne>", " ")\ - .replace("¤", "¤").replace("û", "û").replace("�", "").replace("ï¿©", "é").replace("ç", "ç")\ - .replace("é", "é").replace("ô", "ô").replace(u'\xa0', " ").replace("è", "è").replace("°", "°")\ - .replace("À", "À").replace("ì", "À").replace("ê", "ê").replace("î", "î").replace("â", "â")\ - .replace("²", "²").replace("ù", "ù").replace("Ã", "à ").replace("¬", "€") - - def format_rimes_page(self): - """ - Format RIMES page dataset - """ - dataset = self.preformat_rimes_page() - for set_name in self.set_names: - fold = os.path.join(self.target_fold_path, set_name) - for sample in dataset[set_name]: - new_name = "{}_{}.png".format(set_name, len(os.listdir(fold))) - new_img_path = os.path.join(fold, new_name) - self.load_resize_save(sample["img_path"], new_img_path, 300, self.dpi) - for tr in sample["text_regions"]: - tr["coords"] = self.adjust_coord_ratio(tr["coords"], self.dpi / 300) - page = { - "text": sample["label"] if not self.sem_token else sample["sem_label"], - "paragraphs": sample["text_regions"], - "nb_cols": 1, - } - self.charset = self.charset.union(set(page["text"])) - self.gt[set_name][new_name] = page - - def convert_label(self, label): - """ - Some annotations presents many options for a given text part, always keep the first one only - """ - if "¤" in label: - label = re.sub('¤{([^¤]*)[/|]([^¤]*)}¤', r'\1', label, flags=re.DOTALL) - label = re.sub('¤{([^¤]*)[/|]([^¤]*)[/|]([^¤]*)>', r'\1', label, flags=re.DOTALL) - label = re.sub('¤([^¤]*)[/|]([^¤]*)¤', r'\1', label, flags=re.DOTALL) - label = re.sub('¤{}¤([^¤]*)[/|]([^ ]*)', r'\1', label, flags=re.DOTALL) - label = re.sub('¤{/([^¤]*)/([^ ]*)', r'\1', label, flags=re.DOTALL) - label = re.sub('¤{([^¤]*)[/|]([^ ]*)', r'\1', label, flags=re.DOTALL) - label = re.sub('([^¤]*)/(.*)[¤}{]+', r'\1', label, flags=re.DOTALL) - label = re.sub('[¤}{]+([^¤}{]*)[¤}{]+', r'\1', label, flags=re.DOTALL) - label = re.sub('¤([^¤]*)¤', r'\1', label, flags=re.DOTALL) - label = re.sub('[ ]+', " ", label, flags=re.DOTALL) - label = label.strip() - return label - - def sem_label(self, label, type): - """ - Add layout tokens - """ - if type == "": - return label - begin_token = self.matching_tokens_str[type] - end_token = self.matching_tokens[begin_token] - return begin_token + label + end_token - - -def order_text_regions(text_regions): - """ - Establish reading order based on text region pixel positions - """ - sorted_text_regions = list() - for tr in text_regions: - added = False - if len(sorted_text_regions) == 0: - sorted_text_regions.append(tr) - added = True - else: - for i, sorted_tr in enumerate(sorted_text_regions): - tr_height = tr["coords"]["bottom"] - tr["coords"]["top"] - sorted_tr_height = sorted_tr["coords"]["bottom"] - sorted_tr["coords"]["top"] - tr_is_totally_above = tr["coords"]["bottom"] < sorted_tr["coords"]["top"] - tr_is_top_above = tr["coords"]["top"] < sorted_tr["coords"]["top"] - is_same_level = sorted_tr["coords"]["top"] <= tr["coords"]["bottom"] <= sorted_tr["coords"]["bottom"] or\ - sorted_tr["coords"]["top"] <= tr["coords"]["top"] <= sorted_tr["coords"]["bottom"] or\ - tr["coords"]["top"] <= sorted_tr["coords"]["bottom"] <= tr["coords"]["bottom"] or\ - tr["coords"]["top"] <= sorted_tr["coords"]["top"] <= tr["coords"]["bottom"] - vertical_shared_space = tr["coords"]["bottom"]-sorted_tr["coords"]["top"] if tr_is_top_above else sorted_tr["coords"]["bottom"]-tr["coords"]["top"] - reach_same_level_limit = vertical_shared_space > 0.3*min(tr_height, sorted_tr_height) - is_more_at_left = tr["coords"]["left"] < sorted_tr["coords"]["left"] - equivalent_height = abs(tr_height-sorted_tr_height) < 0.3*min(tr_height, sorted_tr_height) - is_middle_above_top = np.mean([tr["coords"]["top"], tr["coords"]["bottom"]]) < sorted_tr["coords"]["top"] - if tr_is_totally_above or\ - (is_same_level and equivalent_height and is_more_at_left and reach_same_level_limit) or\ - (is_same_level and equivalent_height and tr_is_top_above and not reach_same_level_limit) or\ - (is_same_level and not equivalent_height and is_middle_above_top): - sorted_text_regions.insert(i, tr) - added = True - break - if not added: - sorted_text_regions.append(tr) - - return sorted_text_regions - - -if __name__ == "__main__": - - RIMESDatasetFormatter("page", sem_token=True).format() - RIMESDatasetFormatter("page", sem_token=False).format() diff --git a/Datasets/dataset_formatters/simara_formatter.py b/Datasets/dataset_formatters/simara_formatter.py index c8479ed0..c60eb30f 100644 --- a/Datasets/dataset_formatters/simara_formatter.py +++ b/Datasets/dataset_formatters/simara_formatter.py @@ -1,38 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - from Datasets.dataset_formatters.generic_dataset_formatter import OCRDatasetFormatter import os import numpy as np diff --git a/Datasets/dataset_formatters/utils_dataset.py b/Datasets/dataset_formatters/utils_dataset.py index 2495873e..f4d980da 100644 --- a/Datasets/dataset_formatters/utils_dataset.py +++ b/Datasets/dataset_formatters/utils_dataset.py @@ -1,39 +1,3 @@ - -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - import re import random import cv2 diff --git a/Fonts/list_fonts_read_2016.txt b/Fonts/list_fonts_read_2016.txt deleted file mode 100644 index ab092fa8..00000000 --- a/Fonts/list_fonts_read_2016.txt +++ /dev/null @@ -1,41 +0,0 @@ -"../../../Fonts/lato/Lato-HairlineItalic.ttf", -"../../../Fonts/lato/Lato-HeavyItalic.ttf", -"../../../Fonts/lato/Lato-BoldItalic.ttf", -"../../../Fonts/lato/Lato-Black.ttf", -"../../../Fonts/lato/Lato-Heavy.ttf", -"../../../Fonts/lato/Lato-Regular.ttf", -"../../../Fonts/lato/Lato-LightItalic.ttf", -"../../../Fonts/lato/Lato-Italic.ttf", -"../../../Fonts/lato/Lato-ThinItalic.ttf", -"../../../Fonts/lato/Lato-Bold.ttf", -"../../../Fonts/lato/Lato-Hairline.ttf", -"../../../Fonts/lato/Lato-Medium.ttf", -"../../../Fonts/lato/Lato-SemiboldItalic.ttf", -"../../../Fonts/lato/Lato-BlackItalic.ttf", -"../../../Fonts/lato/Lato-MediumItalic.ttf", -"../../../Fonts/lato/Lato-Semibold.ttf", -"../../../Fonts/lato/Lato-Thin.ttf", -"../../../Fonts/lato/Lato-Light.ttf", -"../../../Fonts/gentiumplus/GentiumPlus-I.ttf", -"../../../Fonts/gentiumplus/GentiumPlus-R.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-BoldOblique.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed.ttf", -"../../../Fonts/dejavu/DejaVuSans-BoldOblique.ttf", -"../../../Fonts/dejavu/DejaVuSans-ExtraLight.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-BoldItalic.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif-Italic.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-Italic.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSansMono.ttf", -"../../../Fonts/dejavu/DejaVuSerif-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSans-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif-BoldItalic.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSans.ttf", -"../../../Fonts/dejavu/DejaVuSans-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-BoldOblique.ttf" \ No newline at end of file diff --git a/Fonts/list_fonts_rimes.txt b/Fonts/list_fonts_rimes.txt deleted file mode 100644 index 4628dbd5..00000000 --- a/Fonts/list_fonts_rimes.txt +++ /dev/null @@ -1,95 +0,0 @@ -"../../../Fonts/handwritten-mix/Parisienne-Regular.ttf", -"../../../Fonts/handwritten-mix/A little sunshine.ttf", -"../../../Fonts/handwritten-mix/Massillo.ttf", -"../../../Fonts/handwritten-mix/Cursive standard Bold.ttf", -"../../../Fonts/handwritten-mix/Merveille-mj8j.ttf", -"../../../Fonts/handwritten-mix/Cursive standard.ttf", -"../../../Fonts/handwritten-mix/Roustel.ttf", -"../../../Fonts/handwritten-mix/Baby Doll.ttf", -"../../../Fonts/handwritten-mix/flashback Demo.ttf", -"../../../Fonts/handwritten-mix/CreamShoes.ttf", -"../../../Fonts/handwritten-mix/Gentle Remind.ttf", -"../../../Fonts/handwritten-mix/Alexandria Rose.ttf", -"../../../Fonts/lato/Lato-HairlineItalic.ttf", -"../../../Fonts/lato/Lato-HeavyItalic.ttf", -"../../../Fonts/lato/Lato-BoldItalic.ttf", -"../../../Fonts/lato/Lato-Black.ttf", -"../../../Fonts/lato/Lato-Heavy.ttf", -"../../../Fonts/lato/Lato-Regular.ttf", -"../../../Fonts/lato/Lato-LightItalic.ttf", -"../../../Fonts/lato/Lato-Italic.ttf", -"../../../Fonts/lato/Lato-ThinItalic.ttf", -"../../../Fonts/lato/Lato-Bold.ttf", -"../../../Fonts/lato/Lato-Hairline.ttf", -"../../../Fonts/lato/Lato-Medium.ttf", -"../../../Fonts/lato/Lato-SemiboldItalic.ttf", -"../../../Fonts/lato/Lato-BlackItalic.ttf", -"../../../Fonts/lato/Lato-MediumItalic.ttf", -"../../../Fonts/lato/Lato-Semibold.ttf", -"../../../Fonts/lato/Lato-Thin.ttf", -"../../../Fonts/lato/Lato-Light.ttf", -"../../../Fonts/gentiumplus/GentiumPlus-I.ttf", -"../../../Fonts/gentiumplus/GentiumPlus-R.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-BoldOblique.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed.ttf", -"../../../Fonts/dejavu/DejaVuSans-BoldOblique.ttf", -"../../../Fonts/dejavu/DejaVuSans-ExtraLight.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-BoldItalic.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif-Italic.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-Italic.ttf", -"../../../Fonts/dejavu/DejaVuSerifCondensed-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSansMono.ttf", -"../../../Fonts/dejavu/DejaVuSerif-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSans-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-Bold.ttf", -"../../../Fonts/dejavu/DejaVuSerif-BoldItalic.ttf", -"../../../Fonts/dejavu/DejaVuSansMono-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSans.ttf", -"../../../Fonts/dejavu/DejaVuSans-Oblique.ttf", -"../../../Fonts/dejavu/DejaVuSansCondensed-BoldOblique.ttf", -"../../../Fonts/open-sans/OpenSans-SemiboldItalic.ttf", -"../../../Fonts/open-sans/OpenSans-CondLight.ttf", -"../../../Fonts/open-sans/OpenSans-Light.ttf", -"../../../Fonts/open-sans/OpenSans-Italic.ttf", -"../../../Fonts/open-sans/OpenSans-CondBold.ttf", -"../../../Fonts/open-sans/OpenSans-Bold.ttf", -"../../../Fonts/open-sans/OpenSans-CondLightItalic.ttf", -"../../../Fonts/open-sans/OpenSans-ExtraBold.ttf", -"../../../Fonts/open-sans/OpenSans-Semibold.ttf", -"../../../Fonts/open-sans/OpenSans-Regular.ttf", -"../../../Fonts/open-sans/OpenSans-BoldItalic.ttf", -"../../../Fonts/open-sans/OpenSans-LightItalic.ttf", -"../../../Fonts/open-sans/OpenSans-ExtraBoldItalic.ttf", -"../../../Fonts/msttcorefonts/Arial.ttf", -"../../../Fonts/msttcorefonts/Verdana_Italic.ttf", -"../../../Fonts/msttcorefonts/Georgia_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Andale_Mono.ttf", -"../../../Fonts/msttcorefonts/Courier_New_Italic.ttf", -"../../../Fonts/msttcorefonts/Georgia_Italic.ttf", -"../../../Fonts/msttcorefonts/Arial_Black.ttf", -"../../../Fonts/msttcorefonts/Trebuchet_MS_Italic.ttf", -"../../../Fonts/msttcorefonts/Verdana.ttf", -"../../../Fonts/msttcorefonts/Courier_New.ttf", -"../../../Fonts/msttcorefonts/Verdana_Bold.ttf", -"../../../Fonts/msttcorefonts/Arial_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Georgia.ttf", -"../../../Fonts/msttcorefonts/Trebuchet_MS_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Impact.ttf", -"../../../Fonts/msttcorefonts/Courier_New_Bold.ttf", -"../../../Fonts/msttcorefonts/Times_New_Roman_Italic.ttf", -"../../../Fonts/msttcorefonts/Georgia_Bold.ttf", -"../../../Fonts/msttcorefonts/Times_New_Roman_Bold.ttf", -"../../../Fonts/msttcorefonts/Times_New_Roman.ttf", -"../../../Fonts/msttcorefonts/Comic_Sans_MS.ttf", -"../../../Fonts/msttcorefonts/Trebuchet_MS_Bold.ttf", -"../../../Fonts/msttcorefonts/Trebuchet_MS.ttf", -"../../../Fonts/msttcorefonts/Arial_Italic.ttf", -"../../../Fonts/msttcorefonts/Courier_New_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Verdana_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Arial_Bold.ttf", -"../../../Fonts/msttcorefonts/Times_New_Roman_Bold_Italic.ttf", -"../../../Fonts/msttcorefonts/Comic_Sans_MS_Bold.ttf" \ No newline at end of file diff --git a/LICENSE_CECILL-C.md b/LICENSE_CECILL-C.md deleted file mode 100644 index 1f0442b5..00000000 --- a/LICENSE_CECILL-C.md +++ /dev/null @@ -1,517 +0,0 @@ - -CeCILL-C FREE SOFTWARE LICENSE AGREEMENT - - - Notice - -This Agreement is a Free Software license agreement that is the result -of discussions between its authors in order to ensure compliance with -the two main principles guiding its drafting: - - * firstly, compliance with the principles governing the distribution - of Free Software: access to source code, broad rights granted to - users, - * secondly, the election of a governing law, French law, with which - it is conformant, both as regards the law of torts and - intellectual property law, and the protection that it offers to - both authors and holders of the economic rights over software. - -The authors of the CeCILL-C (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) -license are: Université de Rouen Normandie (1), INSA Rouen (2), tutelles du laboratoire LITIS (1 et 2) - -Commissariat à l'Energie Atomique - CEA, a public scientific, technical -and industrial research establishment, having its principal place of -business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. - -Centre National de la Recherche Scientifique - CNRS, a public scientific -and technological establishment, having its principal place of business -at 3 rue Michel-Ange, 75794 Paris cedex 16, France. - -Institut National de Recherche en Informatique et en Automatique - -INRIA, a public scientific and technological establishment, having its -principal place of business at Domaine de Voluceau, Rocquencourt, BP -105, 78153 Le Chesnay cedex, France. - - - Preamble - -The purpose of this Free Software license agreement is to grant users -the right to modify and re-use the software governed by this license. - -The exercising of this right is conditional upon the obligation to make -available to the community the modifications made to the source code of -the software so as to contribute to its evolution. - -In consideration of access to the source code and the rights to copy, -modify and redistribute granted by the license, users are provided only -with a limited warranty and the software's author, the holder of the -economic rights, and the successive licensors only have limited liability. - -In this respect, the risks associated with loading, using, modifying -and/or developing or reproducing the software by the user are brought to -the user's attention, given its Free Software status, which may make it -complicated to use, with the result that its use is reserved for -developers and experienced professionals having in-depth computer -knowledge. Users are therefore encouraged to load and test the -suitability of the software as regards their requirements in conditions -enabling the security of their systems and/or data to be ensured and, -more generally, to use and operate it in the same conditions of -security. This Agreement may be freely reproduced and published, -provided it is not altered, and that no provisions are either added or -removed herefrom. - -This Agreement may apply to any or all software for which the holder of -the economic rights decides to submit the use thereof to its provisions. - - - Article 1 - DEFINITIONS - -For the purpose of this Agreement, when the following expressions -commence with a capital letter, they shall have the following meaning: - -Agreement: means this license agreement, and its possible subsequent -versions and annexes. - -Software: means the software in its Object Code and/or Source Code form -and, where applicable, its documentation, "as is" when the Licensee -accepts the Agreement. - -Initial Software: means the Software in its Source Code and possibly its -Object Code form and, where applicable, its documentation, "as is" when -it is first distributed under the terms and conditions of the Agreement. - -Modified Software: means the Software modified by at least one -Integrated Contribution. - -Source Code: means all the Software's instructions and program lines to -which access is required so as to modify the Software. - -Object Code: means the binary files originating from the compilation of -the Source Code. - -Holder: means the holder(s) of the economic rights over the Initial -Software. - -Licensee: means the Software user(s) having accepted the Agreement. - -Contributor: means a Licensee having made at least one Integrated -Contribution. - -Licensor: means the Holder, or any other individual or legal entity, who -distributes the Software under the Agreement. - -Integrated Contribution: means any or all modifications, corrections, -translations, adaptations and/or new functions integrated into the -Source Code by any or all Contributors. - -Related Module: means a set of sources files including their -documentation that, without modification to the Source Code, enables -supplementary functions or services in addition to those offered by the -Software. - -Derivative Software: means any combination of the Software, modified or -not, and of a Related Module. - -Parties: mean both the Licensee and the Licensor. - -These expressions may be used both in singular and plural form. - - - Article 2 - PURPOSE - -The purpose of the Agreement is the grant by the Licensor to the -Licensee of a non-exclusive, transferable and worldwide license for the -Software as set forth in Article 5 hereinafter for the whole term of the -protection granted by the rights over said Software. - - - Article 3 - ACCEPTANCE - -3.1 The Licensee shall be deemed as having accepted the terms and -conditions of this Agreement upon the occurrence of the first of the -following events: - - * (i) loading the Software by any or all means, notably, by - downloading from a remote server, or by loading from a physical - medium; - * (ii) the first time the Licensee exercises any of the rights - granted hereunder. - -3.2 One copy of the Agreement, containing a notice relating to the -characteristics of the Software, to the limited warranty, and to the -fact that its use is restricted to experienced users has been provided -to the Licensee prior to its acceptance as set forth in Article 3.1 -hereinabove, and the Licensee hereby acknowledges that it has read and -understood it. - - - Article 4 - EFFECTIVE DATE AND TERM - - - 4.1 EFFECTIVE DATE - -The Agreement shall become effective on the date when it is accepted by -the Licensee as set forth in Article 3.1. - - - 4.2 TERM - -The Agreement shall remain in force for the entire legal term of -protection of the economic rights over the Software. - - - Article 5 - SCOPE OF RIGHTS GRANTED - -The Licensor hereby grants to the Licensee, who accepts, the following -rights over the Software for any or all use, and for the term of the -Agreement, on the basis of the terms and conditions set forth hereinafter. - -Besides, if the Licensor owns or comes to own one or more patents -protecting all or part of the functions of the Software or of its -components, the Licensor undertakes not to enforce the rights granted by -these patents against successive Licensees using, exploiting or -modifying the Software. If these patents are transferred, the Licensor -undertakes to have the transferees subscribe to the obligations set -forth in this paragraph. - - - 5.1 RIGHT OF USE - -The Licensee is authorized to use the Software, without any limitation -as to its fields of application, with it being hereinafter specified -that this comprises: - - 1. permanent or temporary reproduction of all or part of the Software - by any or all means and in any or all form. - - 2. loading, displaying, running, or storing the Software on any or - all medium. - - 3. entitlement to observe, study or test its operation so as to - determine the ideas and principles behind any or all constituent - elements of said Software. This shall apply when the Licensee - carries out any or all loading, displaying, running, transmission - or storage operation as regards the Software, that it is entitled - to carry out hereunder. - - - 5.2 RIGHT OF MODIFICATION - -The right of modification includes the right to translate, adapt, -arrange, or make any or all modifications to the Software, and the right -to reproduce the resulting software. It includes, in particular, the -right to create a Derivative Software. - -The Licensee is authorized to make any or all modification to the -Software provided that it includes an explicit notice that it is the -author of said modification and indicates the date of the creation thereof. - - - 5.3 RIGHT OF DISTRIBUTION - -In particular, the right of distribution includes the right to publish, -transmit and communicate the Software to the general public on any or -all medium, and by any or all means, and the right to market, either in -consideration of a fee, or free of charge, one or more copies of the -Software by any means. - -The Licensee is further authorized to distribute copies of the modified -or unmodified Software to third parties according to the terms and -conditions set forth hereinafter. - - - 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION - -The Licensee is authorized to distribute true copies of the Software in -Source Code or Object Code form, provided that said distribution -complies with all the provisions of the Agreement and is accompanied by: - - 1. a copy of the Agreement, - - 2. a notice relating to the limitation of both the Licensor's - warranty and liability as set forth in Articles 8 and 9, - -and that, in the event that only the Object Code of the Software is -redistributed, the Licensee allows effective access to the full Source -Code of the Software at a minimum during the entire period of its -distribution of the Software, it being understood that the additional -cost of acquiring the Source Code shall not exceed the cost of -transferring the data. - - - 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE - -When the Licensee makes an Integrated Contribution to the Software, the -terms and conditions for the distribution of the resulting Modified -Software become subject to all the provisions of this Agreement. - -The Licensee is authorized to distribute the Modified Software, in -source code or object code form, provided that said distribution -complies with all the provisions of the Agreement and is accompanied by: - - 1. a copy of the Agreement, - - 2. a notice relating to the limitation of both the Licensor's - warranty and liability as set forth in Articles 8 and 9, - -and that, in the event that only the object code of the Modified -Software is redistributed, the Licensee allows effective access to the -full source code of the Modified Software at a minimum during the entire -period of its distribution of the Modified Software, it being understood -that the additional cost of acquiring the source code shall not exceed -the cost of transferring the data. - - - 5.3.3 DISTRIBUTION OF DERIVATIVE SOFTWARE - -When the Licensee creates Derivative Software, this Derivative Software -may be distributed under a license agreement other than this Agreement, -subject to compliance with the requirement to include a notice -concerning the rights over the Software as defined in Article 6.4. -In the event the creation of the Derivative Software required modification -of the Source Code, the Licensee undertakes that: - - 1. the resulting Modified Software will be governed by this Agreement, - 2. the Integrated Contributions in the resulting Modified Software - will be clearly identified and documented, - 3. the Licensee will allow effective access to the source code of the - Modified Software, at a minimum during the entire period of - distribution of the Derivative Software, such that such - modifications may be carried over in a subsequent version of the - Software; it being understood that the additional cost of - purchasing the source code of the Modified Software shall not - exceed the cost of transferring the data. - - - 5.3.4 COMPATIBILITY WITH THE CeCILL LICENSE - -When a Modified Software contains an Integrated Contribution subject to -the CeCILL license agreement, or when a Derivative Software contains a -Related Module subject to the CeCILL license agreement, the provisions -set forth in the third item of Article 6.4 are optional. - - - Article 6 - INTELLECTUAL PROPERTY - - - 6.1 OVER THE INITIAL SOFTWARE - -The Holder owns the economic rights over the Initial Software. Any or -all use of the Initial Software is subject to compliance with the terms -and conditions under which the Holder has elected to distribute its work -and no one shall be entitled to modify the terms and conditions for the -distribution of said Initial Software. - -The Holder undertakes that the Initial Software will remain ruled at -least by this Agreement, for the duration set forth in Article 4.2. - - - 6.2 OVER THE INTEGRATED CONTRIBUTIONS - -The Licensee who develops an Integrated Contribution is the owner of the -intellectual property rights over this Contribution as defined by -applicable law. - - - 6.3 OVER THE RELATED MODULES - -The Licensee who develops a Related Module is the owner of the -intellectual property rights over this Related Module as defined by -applicable law and is free to choose the type of agreement that shall -govern its distribution under the conditions defined in Article 5.3.3. - - - 6.4 NOTICE OF RIGHTS - -The Licensee expressly undertakes: - - 1. not to remove, or modify, in any manner, the intellectual property - notices attached to the Software; - - 2. to reproduce said notices, in an identical manner, in the copies - of the Software modified or not; - - 3. to ensure that use of the Software, its intellectual property - notices and the fact that it is governed by the Agreement is - indicated in a text that is easily accessible, specifically from - the interface of any Derivative Software. - -The Licensee undertakes not to directly or indirectly infringe the -intellectual property rights of the Holder and/or Contributors on the -Software and to take, where applicable, vis-�-vis its staff, any and all -measures required to ensure respect of said intellectual property rights -of the Holder and/or Contributors. - - - Article 7 - RELATED SERVICES - -7.1 Under no circumstances shall the Agreement oblige the Licensor to -provide technical assistance or maintenance services for the Software. - -However, the Licensor is entitled to offer this type of services. The -terms and conditions of such technical assistance, and/or such -maintenance, shall be set forth in a separate instrument. Only the -Licensor offering said maintenance and/or technical assistance services -shall incur liability therefor. - -7.2 Similarly, any Licensor is entitled to offer to its licensees, under -its sole responsibility, a warranty, that shall only be binding upon -itself, for the redistribution of the Software and/or the Modified -Software, under terms and conditions that it is free to decide. Said -warranty, and the financial terms and conditions of its application, -shall be subject of a separate instrument executed between the Licensor -and the Licensee. - - - Article 8 - LIABILITY - -8.1 Subject to the provisions of Article 8.2, the Licensee shall be -entitled to claim compensation for any direct loss it may have suffered -from the Software as a result of a fault on the part of the relevant -Licensor, subject to providing evidence thereof. - -8.2 The Licensor's liability is limited to the commitments made under -this Agreement and shall not be incurred as a result of in particular: -(i) loss due the Licensee's total or partial failure to fulfill its -obligations, (ii) direct or consequential loss that is suffered by the -Licensee due to the use or performance of the Software, and (iii) more -generally, any consequential loss. In particular the Parties expressly -agree that any or all pecuniary or business loss (i.e. loss of data, -loss of profits, operating loss, loss of customers or orders, -opportunity cost, any disturbance to business activities) or any or all -legal proceedings instituted against the Licensee by a third party, -shall constitute consequential loss and shall not provide entitlement to -any or all compensation from the Licensor. - - - Article 9 - WARRANTY - -9.1 The Licensee acknowledges that the scientific and technical -state-of-the-art when the Software was distributed did not enable all -possible uses to be tested and verified, nor for the presence of -possible defects to be detected. In this respect, the Licensee's -attention has been drawn to the risks associated with loading, using, -modifying and/or developing and reproducing the Software which are -reserved for experienced users. - -The Licensee shall be responsible for verifying, by any or all means, -the suitability of the product for its requirements, its good working -order, and for ensuring that it shall not cause damage to either persons -or properties. - -9.2 The Licensor hereby represents, in good faith, that it is entitled -to grant all the rights over the Software (including in particular the -rights set forth in Article 5). - -9.3 The Licensee acknowledges that the Software is supplied "as is" by -the Licensor without any other express or tacit warranty, other than -that provided for in Article 9.2 and, in particular, without any warranty -as to its commercial value, its secured, safe, innovative or relevant -nature. - -Specifically, the Licensor does not warrant that the Software is free -from any error, that it will operate without interruption, that it will -be compatible with the Licensee's own equipment and software -configuration, nor that it will meet the Licensee's requirements. - -9.4 The Licensor does not either expressly or tacitly warrant that the -Software does not infringe any third party intellectual property right -relating to a patent, software or any other property right. Therefore, -the Licensor disclaims any and all liability towards the Licensee -arising out of any or all proceedings for infringement that may be -instituted in respect of the use, modification and redistribution of the -Software. Nevertheless, should such proceedings be instituted against -the Licensee, the Licensor shall provide it with technical and legal -assistance for its defense. Such technical and legal assistance shall be -decided on a case-by-case basis between the relevant Licensor and the -Licensee pursuant to a memorandum of understanding. The Licensor -disclaims any and all liability as regards the Licensee's use of the -name of the Software. No warranty is given as regards the existence of -prior rights over the name of the Software or as regards the existence -of a trademark. - - - Article 10 - TERMINATION - -10.1 In the event of a breach by the Licensee of its obligations -hereunder, the Licensor may automatically terminate this Agreement -thirty (30) days after notice has been sent to the Licensee and has -remained ineffective. - -10.2 A Licensee whose Agreement is terminated shall no longer be -authorized to use, modify or distribute the Software. However, any -licenses that it may have granted prior to termination of the Agreement -shall remain valid subject to their having been granted in compliance -with the terms and conditions hereof. - - - Article 11 - MISCELLANEOUS - - - 11.1 EXCUSABLE EVENTS - -Neither Party shall be liable for any or all delay, or failure to -perform the Agreement, that may be attributable to an event of force -majeure, an act of God or an outside cause, such as defective -functioning or interruptions of the electricity or telecommunications -networks, network paralysis following a virus attack, intervention by -government authorities, natural disasters, water damage, earthquakes, -fire, explosions, strikes and labor unrest, war, etc. - -11.2 Any failure by either Party, on one or more occasions, to invoke -one or more of the provisions hereof, shall under no circumstances be -interpreted as being a waiver by the interested Party of its right to -invoke said provision(s) subsequently. - -11.3 The Agreement cancels and replaces any or all previous agreements, -whether written or oral, between the Parties and having the same -purpose, and constitutes the entirety of the agreement between said -Parties concerning said purpose. No supplement or modification to the -terms and conditions hereof shall be effective as between the Parties -unless it is made in writing and signed by their duly authorized -representatives. - -11.4 In the event that one or more of the provisions hereof were to -conflict with a current or future applicable act or legislative text, -said act or legislative text shall prevail, and the Parties shall make -the necessary amendments so as to comply with said act or legislative -text. All other provisions shall remain effective. Similarly, invalidity -of a provision of the Agreement, for any reason whatsoever, shall not -cause the Agreement as a whole to be invalid. - - - 11.5 LANGUAGE - -The Agreement is drafted in both French and English and both versions -are deemed authentic. - - - Article 12 - NEW VERSIONS OF THE AGREEMENT - -12.1 Any person is authorized to duplicate and distribute copies of this -Agreement. - -12.2 So as to ensure coherence, the wording of this Agreement is -protected and may only be modified by the authors of the License, who -reserve the right to periodically publish updates or new versions of the -Agreement, each with a separate number. These subsequent versions may -address new issues encountered by Free Software. - -12.3 Any Software distributed under a given version of the Agreement may -only be subsequently distributed under the same version of the Agreement -or a subsequent version. - - - Article 13 - GOVERNING LAW AND JURISDICTION - -13.1 The Agreement is governed by French law. The Parties agree to -endeavor to seek an amicable solution to any disagreements or disputes -that may arise during the performance of the Agreement. - -13.2 Failing an amicable solution within two (2) months as from their -occurrence, and unless emergency proceedings are necessary, the -disagreements or disputes shall be referred to the Paris Courts having -jurisdiction, by the more diligent Party. - - -Version 1.0 dated 2006-09-05. diff --git a/OCR/line_OCR/ctc/main_line_ctc.py b/OCR/line_OCR/ctc/main_line_ctc.py index ee517031..bb8fa1d6 100644 --- a/OCR/line_OCR/ctc/main_line_ctc.py +++ b/OCR/line_OCR/ctc/main_line_ctc.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. import os import sys diff --git a/OCR/line_OCR/ctc/main_syn_line.py b/OCR/line_OCR/ctc/main_syn_line.py index de297464..c16f9de5 100644 --- a/OCR/line_OCR/ctc/main_syn_line.py +++ b/OCR/line_OCR/ctc/main_syn_line.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. import os import sys diff --git a/OCR/line_OCR/ctc/models_line_ctc.py b/OCR/line_OCR/ctc/models_line_ctc.py index cda34ebc..c13c072e 100644 --- a/OCR/line_OCR/ctc/models_line_ctc.py +++ b/OCR/line_OCR/ctc/models_line_ctc.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. from torch.nn.functional import log_softmax from torch.nn import AdaptiveMaxPool2d, Conv1d diff --git a/OCR/line_OCR/ctc/trainer_line_ctc.py b/OCR/line_OCR/ctc/trainer_line_ctc.py index cd229206..eba12d81 100644 --- a/OCR/line_OCR/ctc/trainer_line_ctc.py +++ b/OCR/line_OCR/ctc/trainer_line_ctc.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. from basic.metric_manager import MetricManager from OCR.ocr_manager import OCRManager diff --git a/OCR/ocr_manager.py b/OCR/ocr_manager.py index dd920890..e34b36c0 100644 --- a/OCR/ocr_manager.py +++ b/OCR/ocr_manager.py @@ -1,38 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - from basic.generic_training_manager import GenericTrainingManager import os from PIL import Image diff --git a/README.md b/README.md index 45bb7eea..28d0dc92 100644 --- a/README.md +++ b/README.md @@ -49,68 +49,6 @@ Install the dependencies: pip install -r requirements.txt ``` - -## Datasets -This section is dedicated to the datasets used in the paper: download and formatting instructions are provided -for experiment replication purposes. - -RIMES dataset at page level was distributed during the [evaluation compaign of 2009](https://ieeexplore.ieee.org/document/5277557). - -READ 2016 dataset corresponds to the one used in the [ICFHR 2016 competition on handwritten text recognition](https://ieeexplore.ieee.org/document/7814136). -It can be found [here](https://zenodo.org/record/1164045#.YiINkBvjKEA) - -Raw dataset files must be placed in Datasets/raw/{dataset_name} \ -where dataset name is "READ 2016" or "RIMES" - -## Training And Evaluation -### Step 1: Download the dataset - -### Step 2: Format the dataset -``` -python3 Datasets/dataset_formatters/read2016_formatter.py -python3 Datasets/dataset_formatters/rimes_formatter.py -``` - -### Step 3: Add any font you want as .ttf file in the folder Fonts - -### Step 4 : Generate synthetic line dataset for pre-training -``` -python3 OCR/line_OCR/ctc/main_syn_line.py -``` -There are two lines in this script to adapt to the used dataset: -``` -model.generate_syn_line_dataset("READ_2016_syn_line") -dataset_name = "READ_2016" -``` - -### Step 5 : Pre-training on synthetic lines -``` -python3 OCR/line_OCR/ctc/main_line_ctc.py -``` -There are two lines in this script to adapt to the used dataset: -``` -dataset_name = "READ_2016" -"output_folder": "FCN_read_line_syn" -``` -Weights and evaluation results are stored in OCR/line_OCR/ctc/outputs - -### Step 6 : Training the DAN -``` -python3 OCR/document_OCR/dan/main_dan.py -``` -The following lines must be adapted to the dataset used and pre-training folder names: -``` -dataset_name = "READ_2016" -"transfer_learning": { - # model_name: [state_dict_name, checkpoint_path, learnable, strict] - "encoder": ["encoder", "../../line_OCR/ctc/outputs/FCN_read_2016_line_syn/checkpoints/best.pt", True, True], - "decoder": ["decoder", "../../line_OCR/ctc/outputs/FCN_read_2016_line_syn/best.pt", True, False], -}, -``` - -Weights and evaluation results are stored in OCR/document_OCR/dan/outputs - - ### Remarks (for pre-training and training) All hyperparameters are specified and editable in the training scripts (meaning are in comments).\ Evaluation is performed just after training ending (training is stopped when the maximum elapsed time is reached or after a maximum number of epoch as specified in the training script).\ @@ -154,20 +92,3 @@ To run the inference on a GPU, one can replace `cpu` by the name of the GPU. In ```python text, confidence_scores = model.predict(image, confidences=True) ``` - -## Citation - -```bibtex -@misc{Coquenet2022b, - author = {Coquenet, Denis and Chatelain, Clément and Paquet, Thierry}, - title = {DAN: a Segmentation-free Document Attention Network for Handwritten Document Recognition}, - doi = {10.48550/ARXIV.2203.12273}, - url = {https://arxiv.org/abs/2203.12273}, - publisher = {arXiv}, - year = {2022}, -} -``` - -## License - -This whole project is under Cecill-C license. diff --git a/basic/generic_dataset_manager.py b/basic/generic_dataset_manager.py index 7e9c7c7f..dd272d15 100644 --- a/basic/generic_dataset_manager.py +++ b/basic/generic_dataset_manager.py @@ -1,37 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - import torch import random from torch.utils.data import Dataset, DataLoader diff --git a/basic/generic_training_manager.py b/basic/generic_training_manager.py index 2e2a7c95..a8f41b28 100644 --- a/basic/generic_training_manager.py +++ b/basic/generic_training_manager.py @@ -1,37 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - import torch import os import sys diff --git a/basic/metric_manager.py b/basic/metric_manager.py index f537c911..6c857686 100644 --- a/basic/metric_manager.py +++ b/basic/metric_manager.py @@ -1,38 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - from Datasets.dataset_formatters.rimes_formatter import SEM_MATCHING_TOKENS as RIMES_MATCHING_TOKENS from Datasets.dataset_formatters.read2016_formatter import SEM_MATCHING_TOKENS as READ_MATCHING_TOKENS diff --git a/basic/scheduler.py b/basic/scheduler.py index 2781e49a..6c875c1d 100644 --- a/basic/scheduler.py +++ b/basic/scheduler.py @@ -1,37 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. from torch.nn import Dropout, Dropout2d import numpy as np diff --git a/basic/transforms.py b/basic/transforms.py index 3c73ada3..18c8084d 100644 --- a/basic/transforms.py +++ b/basic/transforms.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. import numpy as np from numpy import random diff --git a/basic/utils.py b/basic/utils.py index 8578279a..ac50e57a 100644 --- a/basic/utils.py +++ b/basic/utils.py @@ -1,36 +1,3 @@ -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. import numpy as np diff --git a/dan/cli.py b/dan/cli.py new file mode 100644 index 00000000..b0ed2199 --- /dev/null +++ b/dan/cli.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +import argparse +import errno +from dan.datasets.extract.extract_from_arkindex import add_extract_parser +from dan.ocr.line.generate_synthetic import add_generate_parser + +from dan.ocr.train import add_train_parser + + + +def get_parser(): + parser = argparse.ArgumentParser(prog="TEKLIA DAN training") + subcommands = parser.add_subparsers(metavar="subcommand") + + add_train_parser(subcommands) + add_extract_parser(subcommands) + add_generate_parser(subcommands) + return parser + +def main(): + parser = get_parser() + args = vars(parser.parse_args()) + if "func" in args: + # Run the subcommand's function + try: + status = args.pop("func")(**args) + parser.exit(status=status) + except KeyboardInterrupt: + # Just quit silently on ^C instead of displaying a long traceback + parser.exit(status=errno.EOWNERDEAD) + else: + parser.error("A subcommand is required.") diff --git a/dan/datasets/__init__.py b/dan/datasets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/datasets/extract/__init__.py b/dan/datasets/extract/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/datasets/extract/arkindex_utils.py b/dan/datasets/extract/arkindex_utils.py new file mode 100644 index 00000000..5216a7e0 --- /dev/null +++ b/dan/datasets/extract/arkindex_utils.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + The arkindex_utils module + ====================== +""" + +import errno +import logging +import sys + +from apistar.exceptions import ErrorResponse + + +def retrieve_corpus(client, corpus_name: str) -> str: + """ + Retrieve the corpus id from the corpus name. + :param client: The arkindex client. + :param corpus_name: The name of the corpus to retrieve. + :return target_corpus: The id of the retrieved corpus. + """ + for corpus in client.request("ListCorpus"): + if corpus["name"] == corpus_name: + target_corpus = corpus["id"] + try: + logging.info(f"Corpus id retrieved: {target_corpus}") + except NameError: + logging.error(f"Corpus {corpus_name} not found") + sys.exit(errno.EINVAL) + + return target_corpus + + +def retrieve_subsets( + client, corpus: str, parents_types: list, parents_names: list +) -> list: + """ + Retrieve the requested subsets. + :param client: The arkindex client. + :param corpus: The id of the retrieved corpus. + :param parents_types: The types of parents of the elements to retrieve. + :param parents_names: The names of parents of the elements to retrieve. + :return subsets: The retrieved subsets. + """ + subsets = [] + for parent_type in parents_types: + try: + subsets.extend( + client.request("ListElements", corpus=corpus, type=parent_type)[ + "results" + ] + ) + except ErrorResponse as e: + logging.error(f"{e.content}: {parent_type}") + sys.exit(errno.EINVAL) + # Retrieve subsets with name in parents-names. If no parents-names given, keep all subsets. + if parents_names is not None: + logging.info(f"Retrieving {parents_names} subset(s)") + subsets = [subset for subset in subsets if subset["name"] in parents_names] + else: + logging.info("Retrieving all subsets") + + if len(subsets) == 0: + logging.info("No subset found") + + return subsets diff --git a/dan/datasets/extract/extract_from_arkindex.py b/dan/datasets/extract/extract_from_arkindex.py new file mode 100644 index 00000000..1a6e207d --- /dev/null +++ b/dan/datasets/extract/extract_from_arkindex.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Example of minimal usage: +# python extract_from_arkindex.py +# --corpus "AN-Simara annotations E (2022-06-20)" +# --parents-types folder +# --parents-names FRAN_IR_032031_4538.pdf +# --output-dir ../ + +""" + The extraction module + ====================== +""" + +import logging +import os + +import cv2 +import imageio.v2 as iio +from arkindex import ArkindexClient, options_from_env +from tqdm import tqdm + +from dan.datasets.extract.arkindex_utils import retrieve_corpus, retrieve_subsets +from dan.datasets.extract.utils import get_cli_args + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" +) + + +IMAGES_DIR = "./images/" # Path to the images directory. +LABELS_DIR = "./labels/" # Path to the labels directory. + +# Layout string to token +SEM_MATCHING_TOKENS_STR = { + "INTITULE": "ⓘ", + "DATE": "â““", + "COTE_SERIE": "â“¢", + "ANALYSE_COMPL.": "â“’", + "PRECISIONS_SUR_COTE": "ⓟ", + "COTE_ARTICLE": "â“", +} + +# Layout begin-token to end-token +SEM_MATCHING_TOKENS = {"ⓘ": "â’¾", "â““": "â’¹", "â“¢": "Ⓢ", "â“’": "â’¸", "ⓟ": "â“…", "â“": "â’¶"} + + +def add_extract_parser(subcommands) -> None: + parser = subcommands.add_parser( + "extract", + description=__doc__, + ) + parser.set_defaults(func=run) + + +def run(): + args = get_cli_args() + + # Get and initialize the parameters. + os.makedirs(IMAGES_DIR, exist_ok=True) + os.makedirs(LABELS_DIR, exist_ok=True) + + # Login to arkindex. + client = ArkindexClient(**options_from_env()) + + corpus = retrieve_corpus(client, args.corpus) + subsets = retrieve_subsets(client, corpus, args.parents_types, args.parents_names) + + # Iterate over the subsets to find the page images and labels. + for subset in subsets: + + os.makedirs( + os.path.join(args.output_dir, IMAGES_DIR, subset["name"]), exist_ok=True + ) + os.makedirs( + os.path.join(args.output_dir, LABELS_DIR, subset["name"]), exist_ok=True + ) + + for page in tqdm( + client.paginate( + "ListElementChildren", id=subset["id"], type="page", recursive=True + ), + desc="Set " + subset["name"], + ): + + image = iio.imread(page["zone"]["url"]) + cv2.imwrite( + os.path.join( + args.output_dir, IMAGES_DIR, subset["name"], f"{page['id']}.jpg" + ), + cv2.cvtColor(image, cv2.COLOR_BGR2RGB), + ) + + tr = client.request( + "ListTranscriptions", id=page["id"], worker_version=None + )["results"] + tr = [one for one in tr if one["worker_version_id"] is None] + assert len(tr) == 1, page["id"] + + for one_tr in tr: + ent = client.request("ListTranscriptionEntities", id=one_tr["id"])[ + "results" + ] + ent = [one for one in ent if one["worker_version_id"] is None] + if len(ent) == 0: + continue + else: + text = one_tr["text"] + + new_text = text + count = 0 + for e in ent: + start_token = SEM_MATCHING_TOKENS_STR[e["entity"]["metas"]["subtype"]] + end_token = SEM_MATCHING_TOKENS[start_token] + new_text = ( + new_text[: count + e["offset"]] + + start_token + + new_text[count + e["offset"] :] + ) + count += 1 + new_text = ( + new_text[: count + e["offset"] + e["length"]] + + end_token + + new_text[count + e["offset"] + e["length"] :] + ) + count += 1 + + with open( + os.path.join( + args.output_dir, LABELS_DIR, subset["name"], f"{page['id']}.txt" + ), + "w", + ) as f: + f.write(new_text) diff --git a/dan/datasets/extract/utils.py b/dan/datasets/extract/utils.py new file mode 100644 index 00000000..72ab461b --- /dev/null +++ b/dan/datasets/extract/utils.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + The utils module + ====================== +""" + +import argparse + + +def get_cli_args(): + """ + Get the command-line arguments. + :return: The command-line arguments. + """ + parser = argparse.ArgumentParser( + description="Arkindex DAN Training Label Generation" + ) + + # Required arguments. + parser.add_argument( + "--corpus", + type=str, + help="Name of the corpus from which the data will be retrieved.", + required=True, + ) + parser.add_argument( + "--parents-types", + nargs="+", + type=str, + help="Type of parents of the elements.", + required=True, + ) + parser.add_argument( + "--output-dir", + type=str, + help="Path to the output directory.", + required=True, + ) + + # Optional arguments. + parser.add_argument( + "--parents-names", + nargs="+", + type=str, + help="Names of parents of the elements.", + default=None, + ) + return parser.parse_args() diff --git a/dan/datasets/format/__init__.py b/dan/datasets/format/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/datasets/format/generic.py b/dan/datasets/format/generic.py new file mode 100644 index 00000000..8bdc7951 --- /dev/null +++ b/dan/datasets/format/generic.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +import os +import pickle +import shutil + +import numpy as np +from PIL import Image + + +class DatasetFormatter: + """ + Global pipeline/functions for dataset formatting + """ + + def __init__( + self, dataset_name, level, extra_name="", set_names=["train", "valid", "test"] + ): + self.dataset_name = dataset_name + self.level = level + self.set_names = set_names + self.target_fold_path = os.path.join( + "Datasets", "formatted", "{}_{}{}".format(dataset_name, level, extra_name) + ) + self.map_datasets_files = dict() + + def format(self): + self.init_format() + self.map_datasets_files[self.dataset_name][self.level]["format_function"]() + self.end_format() + + def init_format(self): + """ + Load and extracts needed files + """ + os.makedirs(self.target_fold_path, exist_ok=True) + + for set_name in self.set_names: + os.makedirs(os.path.join(self.target_fold_path, set_name), exist_ok=True) + + +class OCRDatasetFormatter(DatasetFormatter): + """ + Specific pipeline/functions for OCR/HTR dataset formatting + """ + + def __init__( + self, source_dataset, level, extra_name="", set_names=["train", "valid", "test"] + ): + super(OCRDatasetFormatter, self).__init__( + source_dataset, level, extra_name, set_names + ) + self.charset = set() + self.gt = dict() + for set_name in set_names: + self.gt[set_name] = dict() + + def load_resize_save(self, source_path, target_path): + """ + Load image, apply resolution modification and save it + """ + shutil.copyfile(source_path, target_path) + + def resize(self, img, source_dpi, target_dpi): + """ + Apply resolution modification to image + """ + if source_dpi == target_dpi: + return img + if isinstance(img, np.ndarray): + h, w = img.shape[:2] + img = Image.fromarray(img) + else: + w, h = img.size + ratio = target_dpi / source_dpi + img = img.resize((int(w * ratio), int(h * ratio)), Image.BILINEAR) + return np.array(img) + + def end_format(self): + """ + Save label and charset files + """ + with open(os.path.join(self.target_fold_path, "labels.pkl"), "wb") as f: + pickle.dump( + { + "ground_truth": self.gt, + "charset": sorted(list(self.charset)), + }, + f, + ) + with open(os.path.join(self.target_fold_path, "charset.pkl"), "wb") as f: + pickle.dump(sorted(list(self.charset)), f) diff --git a/dan/datasets/format/simara.py b/dan/datasets/format/simara.py new file mode 100644 index 00000000..2d81c31a --- /dev/null +++ b/dan/datasets/format/simara.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +import os +from collections import defaultdict + +from tqdm import tqdm + +from dan.datasets.format.generic import OCRDatasetFormatter + +# Layout string to token +SEM_MATCHING_TOKENS_STR = { + "INTITULE": "ⓘ", + "DATE": "â““", + "COTE_SERIE": "â“¢", + "ANALYSE_COMPL": "â“’", + "PRECISIONS_SUR_COTE": "ⓟ", + "COTE_ARTICLE": "â“", +} + +# Layout begin-token to end-token +SEM_MATCHING_TOKENS = {"ⓘ": "â’¾", "â““": "â’¹", "â“¢": "Ⓢ", "â“’": "â’¸", "ⓟ": "â“…", "â“": "â’¶"} + + +class SimaraDatasetFormatter(OCRDatasetFormatter): + def __init__( + self, level, set_names=["train", "valid", "test"], dpi=150, sem_token=True + ): + super(SimaraDatasetFormatter, self).__init__( + "simara", level, "_sem" if sem_token else "", set_names + ) + + self.dpi = dpi + self.sem_token = sem_token + self.map_datasets_files.update( + { + "simara": { + # (1,050 for train, 100 for validation and 100 for test) + "page": { + "format_function": self.format_simara_page, + }, + } + } + ) + self.matching_tokens_str = SEM_MATCHING_TOKENS_STR + self.matching_tokens = SEM_MATCHING_TOKENS + + def preformat_simara_page(self): + """ + Extract all information from dataset and correct some annotations + """ + dataset = defaultdict(list) + img_folder_path = os.path.join("Datasets", "raw", "simara", "images") + labels_folder_path = os.path.join("Datasets", "raw", "simara", "labels") + sem_labels_folder_path = os.path.join("Datasets", "raw", "simara", "labels_sem") + train_files = [ + os.path.join(labels_folder_path, "train", name) + for name in os.listdir(os.path.join(sem_labels_folder_path, "train")) + ] + valid_files = [ + os.path.join(labels_folder_path, "valid", name) + for name in os.listdir(os.path.join(sem_labels_folder_path, "valid")) + ] + test_files = [ + os.path.join(labels_folder_path, "test", name) + for name in os.listdir(os.path.join(sem_labels_folder_path, "test")) + ] + for set_name, files in zip( + self.set_names, [train_files, valid_files, test_files] + ): + for i, label_file in enumerate( + tqdm(files, desc="Pre-formatting " + set_name) + ): + with open(label_file, "r") as f: + text = f.read() + with open(label_file.replace("labels", "labels_sem"), "r") as f: + sem_text = f.read() + dataset[set_name].append( + { + "img_path": os.path.join( + img_folder_path, + set_name, + label_file.split("/")[-1].replace("txt", "jpg"), + ), + "label": text, + "sem_label": sem_text, + } + ) + return dataset + + def format_simara_page(self): + """ + Format simara page dataset + """ + dataset = self.preformat_simara_page() + for set_name in self.set_names: + fold = os.path.join(self.target_fold_path, set_name) + for sample in tqdm(dataset[set_name], desc="Formatting " + set_name): + new_name = sample["img_path"].split("/")[-1] + new_img_path = os.path.join(fold, new_name) + self.load_resize_save( + sample["img_path"], new_img_path + ) # , 300, self.dpi) + page = { + "text": sample["label"] + if not self.sem_token + else sample["sem_label"], + } + self.charset = self.charset.union(set(page["text"])) + self.gt[set_name][new_name] = page diff --git a/dan/datasets/utils.py b/dan/datasets/utils.py new file mode 100644 index 00000000..c911cc9b --- /dev/null +++ b/dan/datasets/utils.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +import re + + +def convert(text): + return int(text) if text.isdigit() else text.lower() + + +def natural_sort(data): + return sorted(data, key=lambda key: [convert(c) for c in re.split("([0-9]+)", key)]) diff --git a/dan/decoder.py b/dan/decoder.py index aa811235..d2070fc6 100644 --- a/dan/decoder.py +++ b/dan/decoder.py @@ -79,9 +79,6 @@ class PositionalEncoding2D(Module): """ return x + self.pe[:, :, : x.size(2), : x.size(3)] - def get_pe_by_size(self, h, w, device): - return self.pe[:, :, :h, :w].to(device) - class CustomMultiHeadAttention(Module): """ diff --git a/dan/manager/__init__.py b/dan/manager/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/manager/dataset.py b/dan/manager/dataset.py new file mode 100644 index 00000000..64633ebe --- /dev/null +++ b/dan/manager/dataset.py @@ -0,0 +1,441 @@ +# -*- coding: utf-8 -*- +import os +import pickle +import random + +import cv2 +import numpy as np +import torch +from PIL import Image +from torch.utils.data import DataLoader, Dataset +from torch.utils.data.distributed import DistributedSampler + +from dan.datasets.utils import natural_sort +from dan.transforms import apply_data_augmentation + + +class DatasetManager: + def __init__(self, params): + self.params = params + self.dataset_class = params["dataset_class"] + self.img_padding_value = params["config"]["padding_value"] + + self.my_collate_function = None + + self.train_dataset = None + self.valid_datasets = dict() + self.test_datasets = dict() + + self.train_loader = None + self.valid_loaders = dict() + self.test_loaders = dict() + + self.train_sampler = None + self.valid_samplers = dict() + self.test_samplers = dict() + + self.generator = torch.Generator() + self.generator.manual_seed(0) + + self.batch_size = { + "train": self.params["batch_size"], + "valid": self.params["valid_batch_size"] + if "valid_batch_size" in self.params + else self.params["batch_size"], + "test": self.params["test_batch_size"] + if "test_batch_size" in self.params + else 1, + } + + def apply_specific_treatment_after_dataset_loading(self, dataset): + raise NotImplementedError + + def load_datasets(self): + """ + Load training and validation datasets + """ + self.train_dataset = self.dataset_class( + self.params, + "train", + self.params["train"]["name"], + self.get_paths_and_sets(self.params["train"]["datasets"]), + ) + ( + self.params["config"]["mean"], + self.params["config"]["std"], + ) = self.train_dataset.compute_std_mean() + + self.my_collate_function = self.train_dataset.collate_function( + self.params["config"] + ) + self.apply_specific_treatment_after_dataset_loading(self.train_dataset) + + for custom_name in self.params["valid"].keys(): + self.valid_datasets[custom_name] = self.dataset_class( + self.params, + "valid", + custom_name, + self.get_paths_and_sets(self.params["valid"][custom_name]), + ) + self.apply_specific_treatment_after_dataset_loading( + self.valid_datasets[custom_name] + ) + + def load_ddp_samplers(self): + """ + Load training and validation data samplers + """ + if self.params["use_ddp"]: + self.train_sampler = DistributedSampler( + self.train_dataset, + num_replicas=self.params["num_gpu"], + rank=self.params["ddp_rank"], + shuffle=True, + ) + for custom_name in self.valid_datasets.keys(): + self.valid_samplers[custom_name] = DistributedSampler( + self.valid_datasets[custom_name], + num_replicas=self.params["num_gpu"], + rank=self.params["ddp_rank"], + shuffle=False, + ) + else: + for custom_name in self.valid_datasets.keys(): + self.valid_samplers[custom_name] = None + + def load_dataloaders(self): + """ + Load training and validation data loaders + """ + self.train_loader = DataLoader( + self.train_dataset, + batch_size=self.batch_size["train"], + shuffle=True if self.train_sampler is None else False, + drop_last=False, + batch_sampler=self.train_sampler, + sampler=self.train_sampler, + num_workers=self.params["num_gpu"] * self.params["worker_per_gpu"], + pin_memory=True, + collate_fn=self.my_collate_function, + worker_init_fn=self.seed_worker, + generator=self.generator, + ) + + for key in self.valid_datasets.keys(): + self.valid_loaders[key] = DataLoader( + self.valid_datasets[key], + batch_size=self.batch_size["valid"], + sampler=self.valid_samplers[key], + batch_sampler=self.valid_samplers[key], + shuffle=False, + num_workers=self.params["num_gpu"] * self.params["worker_per_gpu"], + pin_memory=True, + drop_last=False, + collate_fn=self.my_collate_function, + worker_init_fn=self.seed_worker, + generator=self.generator, + ) + + @staticmethod + def seed_worker(worker_id): + worker_seed = torch.initial_seed() % 2**32 + np.random.seed(worker_seed) + random.seed(worker_seed) + + def generate_test_loader(self, custom_name, sets_list): + """ + Load test dataset, data sampler and data loader + """ + if custom_name in self.test_loaders.keys(): + return + paths_and_sets = list() + for set_info in sets_list: + paths_and_sets.append( + {"path": self.params["datasets"][set_info[0]], "set_name": set_info[1]} + ) + self.test_datasets[custom_name] = self.dataset_class( + self.params, "test", custom_name, paths_and_sets + ) + self.apply_specific_treatment_after_dataset_loading( + self.test_datasets[custom_name] + ) + if self.params["use_ddp"]: + self.test_samplers[custom_name] = DistributedSampler( + self.test_datasets[custom_name], + num_replicas=self.params["num_gpu"], + rank=self.params["ddp_rank"], + shuffle=False, + ) + else: + self.test_samplers[custom_name] = None + self.test_loaders[custom_name] = DataLoader( + self.test_datasets[custom_name], + batch_size=self.batch_size["test"], + sampler=self.test_samplers[custom_name], + shuffle=False, + num_workers=self.params["num_gpu"] * self.params["worker_per_gpu"], + pin_memory=True, + drop_last=False, + collate_fn=self.my_collate_function, + worker_init_fn=self.seed_worker, + generator=self.generator, + ) + + def get_paths_and_sets(self, dataset_names_folds): + paths_and_sets = list() + for dataset_name, fold in dataset_names_folds: + path = self.params["datasets"][dataset_name] + paths_and_sets.append({"path": path, "set_name": fold}) + return paths_and_sets + + +class GenericDataset(Dataset): + """ + Main class to handle dataset loading + """ + + def __init__(self, params, set_name, custom_name, paths_and_sets): + self.params = params + self.name = custom_name + self.set_name = set_name + self.mean = ( + np.array(params["config"]["mean"]) + if "mean" in params["config"].keys() + else None + ) + self.std = ( + np.array(params["config"]["std"]) + if "std" in params["config"].keys() + else None + ) + + self.load_in_memory = ( + self.params["config"]["load_in_memory"] + if "load_in_memory" in self.params["config"] + else True + ) + + self.samples = self.load_samples( + paths_and_sets, load_in_memory=self.load_in_memory + ) + + if self.load_in_memory: + self.apply_preprocessing(params["config"]["preprocessings"]) + + self.padding_value = params["config"]["padding_value"] + if self.padding_value == "mean": + if self.mean is None: + _, _ = self.compute_std_mean() + self.padding_value = self.mean + self.params["config"]["padding_value"] = self.padding_value + + self.curriculum_config = None + self.training_info = None + + def __len__(self): + return len(self.samples) + + @staticmethod + def load_image(path): + with Image.open(path) as pil_img: + img = np.array(pil_img) + # grayscale images + if len(img.shape) == 2: + img = np.expand_dims(img, axis=2) + return img + + @staticmethod + def load_samples(paths_and_sets, load_in_memory=True): + """ + Load images and labels + """ + samples = list() + for path_and_set in paths_and_sets: + path = path_and_set["path"] + set_name = path_and_set["set_name"] + with open(os.path.join(path, "labels.pkl"), "rb") as f: + info = pickle.load(f) + gt = info["ground_truth"][set_name] + for filename in natural_sort(gt.keys()): + name = os.path.join(os.path.basename(path), set_name, filename) + full_path = os.path.join(path, set_name, filename) + if isinstance(gt[filename], dict) and "text" in gt[filename]: + label = gt[filename]["text"] + else: + label = gt[filename] + samples.append( + { + "name": name, + "label": label, + "unchanged_label": label, + "path": full_path, + "nb_cols": 1 + if "nb_cols" not in gt[filename] + else gt[filename]["nb_cols"], + } + ) + if load_in_memory: + samples[-1]["img"] = GenericDataset.load_image(full_path) + if type(gt[filename]) is dict: + if "lines" in gt[filename].keys(): + samples[-1]["raw_line_seg_label"] = gt[filename]["lines"] + if "paragraphs" in gt[filename].keys(): + samples[-1]["paragraphs_label"] = gt[filename]["paragraphs"] + if "pages" in gt[filename].keys(): + samples[-1]["pages_label"] = gt[filename]["pages"] + return samples + + def apply_preprocessing(self, preprocessings): + for i in range(len(self.samples)): + self.samples[i] = apply_preprocessing(self.samples[i], preprocessings) + + def compute_std_mean(self): + """ + Compute cumulated variance and mean of whole dataset + """ + if self.mean is not None and self.std is not None: + return self.mean, self.std + if not self.load_in_memory: + sample = self.samples[0].copy() + sample["img"] = self.get_sample_img(0) + img = apply_preprocessing(sample, self.params["config"]["preprocessings"])[ + "img" + ] + else: + img = self.get_sample_img(0) + _, _, c = img.shape + sum = np.zeros((c,)) + nb_pixels = 0 + + for i in range(len(self.samples)): + if not self.load_in_memory: + sample = self.samples[i].copy() + sample["img"] = self.get_sample_img(i) + img = apply_preprocessing( + sample, self.params["config"]["preprocessings"] + )["img"] + else: + img = self.get_sample_img(i) + sum += np.sum(img, axis=(0, 1)) + nb_pixels += np.prod(img.shape[:2]) + mean = sum / nb_pixels + diff = np.zeros((c,)) + for i in range(len(self.samples)): + if not self.load_in_memory: + sample = self.samples[i].copy() + sample["img"] = self.get_sample_img(i) + img = apply_preprocessing( + sample, self.params["config"]["preprocessings"] + )["img"] + else: + img = self.get_sample_img(i) + diff += [np.sum((img[:, :, k] - mean[k]) ** 2) for k in range(c)] + std = np.sqrt(diff / nb_pixels) + + self.mean = mean + self.std = std + return mean, std + + def apply_data_augmentation(self, img): + """ + Apply data augmentation strategy on the input image + """ + augs = [ + self.params["config"][key] if key in self.params["config"].keys() else None + for key in ["augmentation", "valid_augmentation", "test_augmentation"] + ] + for aug, set_name in zip(augs, ["train", "valid", "test"]): + if aug and self.set_name == set_name: + return apply_data_augmentation(img, aug) + return img, list() + + def get_sample_img(self, i): + """ + Get image by index + """ + if self.load_in_memory: + return self.samples[i]["img"] + else: + return GenericDataset.load_image(self.samples[i]["path"]) + + +def apply_preprocessing(sample, preprocessings): + """ + Apply preprocessings on each sample + """ + resize_ratio = [1, 1] + img = sample["img"] + for preprocessing in preprocessings: + + if preprocessing["type"] == "dpi": + ratio = preprocessing["target"] / preprocessing["source"] + temp_img = img + h, w, c = temp_img.shape + temp_img = cv2.resize( + temp_img, (int(np.ceil(w * ratio)), int(np.ceil(h * ratio))) + ) + if len(temp_img.shape) == 2: + temp_img = np.expand_dims(temp_img, axis=2) + img = temp_img + + resize_ratio = [ratio, ratio] + + if preprocessing["type"] == "to_grayscaled": + temp_img = img + h, w, c = temp_img.shape + if c == 3: + img = np.expand_dims( + 0.2125 * temp_img[:, :, 0] + + 0.7154 * temp_img[:, :, 1] + + 0.0721 * temp_img[:, :, 2], + axis=2, + ).astype(np.uint8) + + if preprocessing["type"] == "to_RGB": + temp_img = img + h, w, c = temp_img.shape + if c == 1: + img = np.concatenate([temp_img, temp_img, temp_img], axis=2) + + if preprocessing["type"] == "resize": + keep_ratio = preprocessing["keep_ratio"] + max_h, max_w = preprocessing["max_height"], preprocessing["max_width"] + temp_img = img + h, w, c = temp_img.shape + + ratio_h = max_h / h if max_h else 1 + ratio_w = max_w / w if max_w else 1 + if keep_ratio: + ratio_h = ratio_w = min(ratio_w, ratio_h) + new_h = min(max_h, int(h * ratio_h)) + new_w = min(max_w, int(w * ratio_w)) + temp_img = cv2.resize(temp_img, (new_w, new_h)) + if len(temp_img.shape) == 2: + temp_img = np.expand_dims(temp_img, axis=2) + + img = temp_img + resize_ratio = [ratio_h, ratio_w] + + if preprocessing["type"] == "fixed_height": + new_h = preprocessing["height"] + temp_img = img + h, w, c = temp_img.shape + ratio = new_h / h + temp_img = cv2.resize(temp_img, (int(w * ratio), new_h)) + if len(temp_img.shape) == 2: + temp_img = np.expand_dims(temp_img, axis=2) + img = temp_img + resize_ratio = [ratio, ratio] + if resize_ratio != [1, 1] and "raw_line_seg_label" in sample: + for li in range(len(sample["raw_line_seg_label"])): + for side, ratio in zip( + (["bottom", "top"], ["right", "left"]), resize_ratio + ): + for s in side: + sample["raw_line_seg_label"][li][s] = ( + sample["raw_line_seg_label"][li][s] * ratio + ) + + sample["img"] = img + sample["resize_ratio"] = resize_ratio + return sample diff --git a/dan/manager/metrics.py b/dan/manager/metrics.py new file mode 100644 index 00000000..3bb572b2 --- /dev/null +++ b/dan/manager/metrics.py @@ -0,0 +1,522 @@ +# -*- coding: utf-8 -*- +import re + +import editdistance +import networkx as nx +import numpy as np + +from dan.datasets.format.simara import SEM_MATCHING_TOKENS as SIMARA_MATCHING_TOKENS +from dan.post_processing import PostProcessingModuleSIMARA + + +class MetricManager: + def __init__(self, metric_names, dataset_name): + self.dataset_name = dataset_name + + if "simara" in dataset_name and "page" in dataset_name: + self.post_processing_module = PostProcessingModuleSIMARA + self.matching_tokens = SIMARA_MATCHING_TOKENS + self.edit_and_num_edge_nodes = edit_and_num_items_for_ged_from_str_simara + else: + self.matching_tokens = dict() + + self.layout_tokens = "".join( + list(self.matching_tokens.keys()) + list(self.matching_tokens.values()) + ) + if len(self.layout_tokens) == 0: + self.layout_tokens = None + self.metric_names = metric_names + self.epoch_metrics = None + + self.linked_metrics = { + "cer": ["edit_chars", "nb_chars"], + "wer": ["edit_words", "nb_words"], + "loer": [ + "edit_graph", + "nb_nodes_and_edges", + "nb_pp_op_layout", + "nb_gt_layout_token", + ], + "precision": ["precision", "weights"], + "map_cer_per_class": [ + "map_cer", + ], + "layout_precision_per_class_per_threshold": [ + "map_cer", + ], + } + + self.init_metrics() + + def init_metrics(self): + """ + Initialization of the metrics specified in metrics_name + """ + self.epoch_metrics = { + "nb_samples": list(), + "names": list(), + "ids": list(), + } + + for metric_name in self.metric_names: + if metric_name in self.linked_metrics: + for linked_metric_name in self.linked_metrics[metric_name]: + if linked_metric_name not in self.epoch_metrics.keys(): + self.epoch_metrics[linked_metric_name] = list() + else: + self.epoch_metrics[metric_name] = list() + + def update_metrics(self, batch_metrics): + """ + Add batch metrics to the metrics + """ + for key in batch_metrics.keys(): + if key in self.epoch_metrics: + self.epoch_metrics[key] += batch_metrics[key] + + def get_display_values(self, output=False): + """ + format metrics values for shell display purposes + """ + metric_names = self.metric_names.copy() + if output: + metric_names.extend(["nb_samples"]) + display_values = dict() + for metric_name in metric_names: + value = None + if output: + if metric_name in ["nb_samples", "weights"]: + value = np.sum(self.epoch_metrics[metric_name]) + elif metric_name in [ + "time", + ]: + total_time = np.sum(self.epoch_metrics[metric_name]) + sample_time = total_time / np.sum(self.epoch_metrics["nb_samples"]) + display_values["sample_time"] = round(sample_time, 4) + value = total_time + elif metric_name == "loer": + display_values["pper"] = round( + np.sum(self.epoch_metrics["nb_pp_op_layout"]) + / np.sum(self.epoch_metrics["nb_gt_layout_token"]), + 4, + ) + elif metric_name == "map_cer_per_class": + value = compute_global_mAP_per_class(self.epoch_metrics["map_cer"]) + for key in value.keys(): + display_values["map_cer_" + key] = round(value[key], 4) + continue + elif metric_name == "layout_precision_per_class_per_threshold": + value = compute_global_precision_per_class_per_threshold( + self.epoch_metrics["map_cer"] + ) + for key_class in value.keys(): + for threshold in value[key_class].keys(): + display_values[ + "map_cer_{}_{}".format(key_class, threshold) + ] = round(value[key_class][threshold], 4) + continue + if metric_name == "cer": + value = np.sum(self.epoch_metrics["edit_chars"]) / np.sum( + self.epoch_metrics["nb_chars"] + ) + if output: + display_values["nb_chars"] = np.sum(self.epoch_metrics["nb_chars"]) + elif metric_name == "wer": + value = np.sum(self.epoch_metrics["edit_words"]) / np.sum( + self.epoch_metrics["nb_words"] + ) + if output: + display_values["nb_words"] = np.sum(self.epoch_metrics["nb_words"]) + elif metric_name in ["loss", "loss_ctc", "loss_ce", "syn_max_lines"]: + value = np.average( + self.epoch_metrics[metric_name], + weights=np.array(self.epoch_metrics["nb_samples"]), + ) + elif metric_name == "map_cer": + value = compute_global_mAP(self.epoch_metrics[metric_name]) + elif metric_name == "loer": + value = np.sum(self.epoch_metrics["edit_graph"]) / np.sum( + self.epoch_metrics["nb_nodes_and_edges"] + ) + elif value is None: + continue + + display_values[metric_name] = round(value, 4) + return display_values + + def compute_metrics(self, values, metric_names): + metrics = { + "nb_samples": [ + values["nb_samples"], + ], + } + for v in ["weights", "time"]: + if v in values: + metrics[v] = [values[v]] + for metric_name in metric_names: + if metric_name == "cer": + metrics["edit_chars"] = [ + edit_cer_from_string(u, v, self.layout_tokens) + for u, v in zip(values["str_y"], values["str_x"]) + ] + metrics["nb_chars"] = [ + nb_chars_cer_from_string(gt, self.layout_tokens) + for gt in values["str_y"] + ] + elif metric_name == "wer": + split_gt = [ + format_string_for_wer(gt, self.layout_tokens) + for gt in values["str_y"] + ] + split_pred = [ + format_string_for_wer(pred, self.layout_tokens) + for pred in values["str_x"] + ] + metrics["edit_words"] = [ + edit_wer_from_formatted_split_text(gt, pred) + for (gt, pred) in zip(split_gt, split_pred) + ] + metrics["nb_words"] = [len(gt) for gt in split_gt] + elif metric_name in [ + "loss_ctc", + "loss_ce", + "loss", + "syn_max_lines", + ]: + metrics[metric_name] = [ + values[metric_name], + ] + elif metric_name == "map_cer": + pp_pred = list() + pp_score = list() + for pred, score in zip(values["str_x"], values["confidence_score"]): + pred_score = self.post_processing_module().post_process(pred, score) + pp_pred.append(pred_score[0]) + pp_score.append(pred_score[1]) + metrics[metric_name] = [ + compute_layout_mAP_per_class(y, x, conf, self.matching_tokens) + for x, conf, y in zip(pp_pred, pp_score, values["str_y"]) + ] + elif metric_name == "loer": + pp_pred = list() + metrics["nb_pp_op_layout"] = list() + for pred in values["str_x"]: + pp_module = self.post_processing_module() + pp_pred.append(pp_module.post_process(pred)) + metrics["nb_pp_op_layout"].append(pp_module.num_op) + metrics["nb_gt_layout_token"] = [ + len(keep_only_tokens(str_x, self.layout_tokens)) + for str_x in values["str_x"] + ] + edit_and_num_items = [ + self.edit_and_num_edge_nodes(y, x) + for x, y in zip(pp_pred, values["str_y"]) + ] + metrics["edit_graph"], metrics["nb_nodes_and_edges"] = [ + ei[0] for ei in edit_and_num_items + ], [ei[1] for ei in edit_and_num_items] + return metrics + + def get(self, name): + return self.epoch_metrics[name] + + +def keep_only_tokens(str, tokens): + """ + Remove all but layout tokens from string + """ + return re.sub("([^" + tokens + "])", "", str) + + +def keep_all_but_tokens(str, tokens): + """ + Remove all layout tokens from string + """ + return re.sub("([" + tokens + "])", "", str) + + +def edit_cer_from_string(gt, pred, layout_tokens=None): + """ + Format and compute edit distance between two strings at character level + """ + gt = format_string_for_cer(gt, layout_tokens) + pred = format_string_for_cer(pred, layout_tokens) + return editdistance.eval(gt, pred) + + +def nb_chars_cer_from_string(gt, layout_tokens=None): + """ + Compute length after formatting of ground truth string + """ + return len(format_string_for_cer(gt, layout_tokens)) + + +def edit_wer_from_string(gt, pred, layout_tokens=None): + """ + Format and compute edit distance between two strings at word level + """ + split_gt = format_string_for_wer(gt, layout_tokens) + split_pred = format_string_for_wer(pred, layout_tokens) + return edit_wer_from_formatted_split_text(split_gt, split_pred) + + +def format_string_for_wer(str, layout_tokens): + """ + Format string for WER computation: remove layout tokens, treat punctuation as word, replace line break by space + """ + str = re.sub( + r"([\[\]{}/\\()\"'&+*=<>?.;:,!\-—_€#%°])", r" \1 ", str + ) # punctuation processed as word + if layout_tokens is not None: + str = keep_all_but_tokens( + str, layout_tokens + ) # remove layout tokens from metric + str = re.sub("([ \n])+", " ", str).strip() # keep only one space character + return str.split(" ") + + +def format_string_for_cer(str, layout_tokens): + """ + Format string for CER computation: remove layout tokens and extra spaces + """ + if layout_tokens is not None: + str = keep_all_but_tokens( + str, layout_tokens + ) # remove layout tokens from metric + str = re.sub("([\n])+", "\n", str) # remove consecutive line breaks + str = re.sub("([ ])+", " ", str).strip() # remove consecutive spaces + return str + + +def edit_wer_from_formatted_split_text(gt, pred): + """ + Compute edit distance at word level from formatted string as list + """ + return editdistance.eval(gt, pred) + + +def extract_by_tokens( + input_str, begin_token, end_token, associated_score=None, order_by_score=False +): + """ + Extract list of text regions by begin and end tokens + Order the list by confidence score + """ + if order_by_score: + assert associated_score is not None + res = list() + for match in re.finditer( + "{}[^{}]*{}".format(begin_token, end_token, end_token), input_str + ): + begin, end = match.regs[0] + if order_by_score: + res.append( + { + "confidence": np.mean( + [associated_score[begin], associated_score[end - 1]] + ), + "content": input_str[begin + 1 : end - 1], + } + ) + else: + res.append(input_str[begin + 1 : end - 1]) + if order_by_score: + res = sorted(res, key=lambda x: x["confidence"], reverse=True) + res = [r["content"] for r in res] + return res + + +def compute_layout_precision_per_threshold( + gt, pred, score, begin_token, end_token, layout_tokens, return_weight=True +): + """ + Compute average precision of a given class for CER threshold from 5% to 50% with a step of 5% + """ + pred_list = extract_by_tokens( + pred, begin_token, end_token, associated_score=score, order_by_score=True + ) + gt_list = extract_by_tokens(gt, begin_token, end_token) + pred_list = [keep_all_but_tokens(p, layout_tokens) for p in pred_list] + gt_list = [keep_all_but_tokens(gt, layout_tokens) for gt in gt_list] + precision_per_threshold = [ + compute_layout_AP_for_given_threshold(gt_list, pred_list, threshold / 100) + for threshold in range(5, 51, 5) + ] + if return_weight: + return precision_per_threshold, len(gt_list) + return precision_per_threshold + + +def compute_layout_AP_for_given_threshold(gt_list, pred_list, threshold): + """ + Compute average precision of a given class for a given CER threshold + """ + remaining_gt_list = gt_list.copy() + num_true = len(gt_list) + correct = np.zeros((len(pred_list)), dtype=np.bool) + for i, pred in enumerate(pred_list): + if len(remaining_gt_list) == 0: + break + cer_with_gt = [ + edit_cer_from_string(gt, pred) / nb_chars_cer_from_string(gt) + for gt in remaining_gt_list + ] + cer, ind = np.min(cer_with_gt), np.argmin(cer_with_gt) + if cer <= threshold: + correct[i] = True + del remaining_gt_list[ind] + precision = np.cumsum(correct, dtype=np.int) / np.arange(1, len(pred_list) + 1) + recall = np.cumsum(correct, dtype=np.int) / num_true + max_precision_from_recall = np.maximum.accumulate(precision[::-1])[::-1] + recall_diff = recall - np.concatenate( + [ + np.array( + [ + 0, + ] + ), + recall[:-1], + ] + ) + P = np.sum(recall_diff * max_precision_from_recall) + return P + + +def compute_layout_mAP_per_class(gt, pred, score, tokens): + """ + Compute the mAP_cer for each class for a given sample + """ + layout_tokens = "".join(list(tokens.keys())) + AP_per_class = dict() + for token in tokens.keys(): + if token in gt: + AP_per_class[token] = compute_layout_precision_per_threshold( + gt, pred, score, token, tokens[token], layout_tokens=layout_tokens + ) + return AP_per_class + + +def compute_global_mAP(list_AP_per_class): + """ + Compute the global mAP_cer for several samples + """ + weights_per_doc = list() + mAP_per_doc = list() + for doc_AP_per_class in list_AP_per_class: + APs = np.array( + [np.mean(doc_AP_per_class[key][0]) for key in doc_AP_per_class.keys()] + ) + weights = np.array( + [doc_AP_per_class[key][1] for key in doc_AP_per_class.keys()] + ) + if np.sum(weights) == 0: + mAP_per_doc.append(0) + else: + mAP_per_doc.append(np.average(APs, weights=weights)) + weights_per_doc.append(np.sum(weights)) + if np.sum(weights_per_doc) == 0: + return 0 + return np.average(mAP_per_doc, weights=weights_per_doc) + + +def compute_global_mAP_per_class(list_AP_per_class): + """ + Compute the mAP_cer per class for several samples + """ + mAP_per_class = dict() + for doc_AP_per_class in list_AP_per_class: + for key in doc_AP_per_class.keys(): + if key not in mAP_per_class: + mAP_per_class[key] = {"AP": list(), "weights": list()} + mAP_per_class[key]["AP"].append(np.mean(doc_AP_per_class[key][0])) + mAP_per_class[key]["weights"].append(doc_AP_per_class[key][1]) + for key in mAP_per_class.keys(): + mAP_per_class[key] = np.average( + mAP_per_class[key]["AP"], weights=mAP_per_class[key]["weights"] + ) + return mAP_per_class + + +def compute_global_precision_per_class_per_threshold(list_AP_per_class): + """ + Compute the mAP_cer per class and per threshold for several samples + """ + mAP_per_class = dict() + for doc_AP_per_class in list_AP_per_class: + for key in doc_AP_per_class.keys(): + if key not in mAP_per_class: + mAP_per_class[key] = dict() + for threshold in range(5, 51, 5): + mAP_per_class[key][threshold] = { + "precision": list(), + "weights": list(), + } + for i, threshold in enumerate(range(5, 51, 5)): + mAP_per_class[key][threshold]["precision"].append( + np.mean(doc_AP_per_class[key][0][i]) + ) + mAP_per_class[key][threshold]["weights"].append( + doc_AP_per_class[key][1] + ) + for key_class in mAP_per_class.keys(): + for threshold in mAP_per_class[key_class]: + mAP_per_class[key_class][threshold] = np.average( + mAP_per_class[key_class][threshold]["precision"], + weights=mAP_per_class[key_class][threshold]["weights"], + ) + return mAP_per_class + + +def str_to_graph_simara(str): + """ + Compute graph from string of layout tokens for the SIMARA dataset at page level + """ + begin_layout_tokens = "".join(list(SIMARA_MATCHING_TOKENS.keys())) + layout_token_sequence = keep_only_tokens(str, begin_layout_tokens) + g = nx.DiGraph() + g.add_node("D", type="document", level=2, page=0) + token_name_dict = {"ⓘ": "I", "â““": "D", "â“¢": "S", "â“’": "C", "ⓟ": "P", "â“": "A"} + num = dict() + previous_node = None + for token in begin_layout_tokens: + num[token] = 0 + for ind, c in enumerate(layout_token_sequence): + num[c] += 1 + node_name = "{}_{}".format(token_name_dict[c], num[c]) + g.add_node(node_name, type=token_name_dict[c], level=1, page=0) + g.add_edge("D", node_name) + if previous_node: + g.add_edge(previous_node, node_name) + previous_node = node_name + return g + + +def graph_edit_distance(g1, g2): + """ + Compute graph edit distance between two graphs + """ + for v in nx.optimize_graph_edit_distance( + g1, + g2, + node_ins_cost=lambda node: 1, + node_del_cost=lambda node: 1, + node_subst_cost=lambda node1, node2: 0 if node1["type"] == node2["type"] else 1, + edge_ins_cost=lambda edge: 1, + edge_del_cost=lambda edge: 1, + edge_subst_cost=lambda edge1, edge2: 0 if edge1 == edge2 else 1, + ): + new_edit = v + return new_edit + + +def edit_and_num_items_for_ged_from_str_simara(str_gt, str_pred): + """ + Compute graph edit distance and num nodes/edges for normalized graph edit distance + For the SIMARA dataset + """ + g_gt = str_to_graph_simara(str_gt) + g_pred = str_to_graph_simara(str_pred) + return ( + graph_edit_distance(g_gt, g_pred), + g_gt.number_of_nodes() + g_gt.number_of_edges(), + ) diff --git a/dan/manager/ocr.py b/dan/manager/ocr.py new file mode 100644 index 00000000..71463042 --- /dev/null +++ b/dan/manager/ocr.py @@ -0,0 +1,640 @@ +# -*- coding: utf-8 -*- +import copy +import os +import pickle + +import cv2 +import numpy as np +import torch +from fontTools.ttLib import TTFont +from PIL import Image, ImageDraw, ImageFont + +from dan.manager.dataset import DatasetManager, GenericDataset, apply_preprocessing +from dan.ocr.utils import LM_str_to_ind +from dan.utils import ( + pad_image, + pad_image_width_right, + pad_images, + pad_sequences_1D, + rand, + rand_uniform, + randint, +) + + +class OCRDatasetManager(DatasetManager): + """ + Specific class to handle OCR/HTR tasks + """ + + def __init__(self, params): + super(OCRDatasetManager, self).__init__(params) + + self.charset = ( + params["charset"] if "charset" in params else self.get_merged_charsets() + ) + + if ( + "synthetic_data" in self.params["config"] + and self.params["config"]["synthetic_data"] + and "config" in self.params["config"]["synthetic_data"] + ): + self.char_only_set = self.charset.copy() + for token in [ + "\n", + ]: + if token in self.char_only_set: + self.char_only_set.remove(token) + self.params["config"]["synthetic_data"]["config"][ + "valid_fonts" + ] = get_valid_fonts(self.char_only_set) + + if "new_tokens" in params: + self.charset = sorted( + list(set(self.charset).union(set(params["new_tokens"]))) + ) + + self.tokens = { + "pad": params["config"]["padding_token"], + } + if self.params["config"]["charset_mode"].lower() == "ctc": + self.tokens["blank"] = len(self.charset) + self.tokens["pad"] = ( + self.tokens["pad"] if self.tokens["pad"] else len(self.charset) + 1 + ) + self.params["config"]["padding_token"] = self.tokens["pad"] + elif self.params["config"]["charset_mode"] == "seq2seq": + self.tokens["end"] = len(self.charset) + self.tokens["start"] = len(self.charset) + 1 + self.tokens["pad"] = ( + self.tokens["pad"] if self.tokens["pad"] else len(self.charset) + 2 + ) + self.params["config"]["padding_token"] = self.tokens["pad"] + + def get_merged_charsets(self): + """ + Merge the charset of the different datasets used + """ + datasets = self.params["datasets"] + charset = set() + for key in datasets.keys(): + with open(os.path.join(datasets[key], "labels.pkl"), "rb") as f: + info = pickle.load(f) + charset = charset.union(set(info["charset"])) + if ( + "\n" in charset + and "remove_linebreaks" in self.params["config"]["constraints"] + ): + charset.remove("\n") + if "" in charset: + charset.remove("") + return sorted(list(charset)) + + def apply_specific_treatment_after_dataset_loading(self, dataset): + dataset.charset = self.charset + dataset.tokens = self.tokens + dataset.convert_labels() + if ( + "padding" in dataset.params["config"] + and dataset.params["config"]["padding"]["min_height"] == "max" + ): + dataset.params["config"]["padding"]["min_height"] = max( + [s["img"].shape[0] for s in self.train_dataset.samples] + ) + if ( + "padding" in dataset.params["config"] + and dataset.params["config"]["padding"]["min_width"] == "max" + ): + dataset.params["config"]["padding"]["min_width"] = max( + [s["img"].shape[1] for s in self.train_dataset.samples] + ) + + +class OCRDataset(GenericDataset): + """ + Specific class to handle OCR/HTR datasets + """ + + def __init__(self, params, set_name, custom_name, paths_and_sets): + super(OCRDataset, self).__init__(params, set_name, custom_name, paths_and_sets) + self.charset = None + self.tokens = None + self.reduce_dims_factor = np.array( + [params["config"]["height_divisor"], params["config"]["width_divisor"], 1] + ) + self.collate_function = OCRCollateFunction + self.synthetic_id = 0 + + def __getitem__(self, idx): + sample = copy.deepcopy(self.samples[idx]) + + if not self.load_in_memory: + sample["img"] = self.get_sample_img(idx) + sample = apply_preprocessing( + sample, self.params["config"]["preprocessings"] + ) + + if ( + "synthetic_data" in self.params["config"] + and self.params["config"]["synthetic_data"] + and self.set_name == "train" + ): + sample = self.generate_synthetic_data(sample) + + # Data augmentation + sample["img"], sample["applied_da"] = self.apply_data_augmentation( + sample["img"] + ) + + if "max_size" in self.params["config"] and self.params["config"]["max_size"]: + max_ratio = max( + sample["img"].shape[0] + / self.params["config"]["max_size"]["max_height"], + sample["img"].shape[1] / self.params["config"]["max_size"]["max_width"], + ) + if max_ratio > 1: + new_h, new_w = int(np.ceil(sample["img"].shape[0] / max_ratio)), int( + np.ceil(sample["img"].shape[1] / max_ratio) + ) + sample["img"] = cv2.resize(sample["img"], (new_w, new_h)) + + # Normalization if requested + if "normalize" in self.params["config"] and self.params["config"]["normalize"]: + sample["img"] = (sample["img"] - self.mean) / self.std + + sample["img_shape"] = sample["img"].shape + sample["img_reduced_shape"] = np.ceil( + sample["img_shape"] / self.reduce_dims_factor + ).astype(int) + + # Padding to handle CTC requirements + if self.set_name == "train": + max_label_len = 0 + height = 1 + ctc_padding = False + if "CTC_line" in self.params["config"]["constraints"]: + max_label_len = sample["label_len"] + ctc_padding = True + if "CTC_va" in self.params["config"]["constraints"]: + max_label_len = max(sample["line_label_len"]) + ctc_padding = True + if "CTC_pg" in self.params["config"]["constraints"]: + max_label_len = sample["label_len"] + height = max(sample["img_reduced_shape"][0], 1) + ctc_padding = True + if ( + ctc_padding + and 2 * max_label_len + 1 > sample["img_reduced_shape"][1] * height + ): + sample["img"] = pad_image_width_right( + sample["img"], + int( + np.ceil((2 * max_label_len + 1) / height) + * self.reduce_dims_factor[1] + ), + self.padding_value, + ) + sample["img_shape"] = sample["img"].shape + sample["img_reduced_shape"] = np.ceil( + sample["img_shape"] / self.reduce_dims_factor + ).astype(int) + sample["img_reduced_shape"] = [ + max(1, t) for t in sample["img_reduced_shape"] + ] + + sample["img_position"] = [ + [0, sample["img_shape"][0]], + [0, sample["img_shape"][1]], + ] + # Padding constraints to handle model needs + if "padding" in self.params["config"] and self.params["config"]["padding"]: + if ( + self.set_name == "train" + or not self.params["config"]["padding"]["train_only"] + ): + min_pad = self.params["config"]["padding"]["min_pad"] + max_pad = self.params["config"]["padding"]["max_pad"] + pad_width = ( + randint(min_pad, max_pad) + if min_pad is not None and max_pad is not None + else None + ) + pad_height = ( + randint(min_pad, max_pad) + if min_pad is not None and max_pad is not None + else None + ) + + sample["img"], sample["img_position"] = pad_image( + sample["img"], + padding_value=self.padding_value, + new_width=self.params["config"]["padding"]["min_width"], + new_height=self.params["config"]["padding"]["min_height"], + pad_width=pad_width, + pad_height=pad_height, + padding_mode=self.params["config"]["padding"]["mode"], + return_position=True, + ) + sample["img_reduced_position"] = [ + np.ceil(p / factor).astype(int) + for p, factor in zip(sample["img_position"], self.reduce_dims_factor[:2]) + ] + return sample + + def convert_labels(self): + """ + Label str to token at character level + """ + for i in range(len(self.samples)): + self.samples[i] = self.convert_sample_labels(self.samples[i]) + + def convert_sample_labels(self, sample): + label = sample["label"] + line_labels = label.split("\n") + if "remove_linebreaks" in self.params["config"]["constraints"]: + full_label = label.replace("\n", " ").replace(" ", " ") + word_labels = full_label.split(" ") + else: + full_label = label + word_labels = label.replace("\n", " ").replace(" ", " ").split(" ") + + sample["label"] = full_label + sample["token_label"] = LM_str_to_ind(self.charset, full_label) + if "add_eot" in self.params["config"]["constraints"]: + sample["token_label"].append(self.tokens["end"]) + sample["label_len"] = len(sample["token_label"]) + if "add_sot" in self.params["config"]["constraints"]: + sample["token_label"].insert(0, self.tokens["start"]) + + sample["line_label"] = line_labels + sample["token_line_label"] = [ + LM_str_to_ind(self.charset, label) for label in line_labels + ] + sample["line_label_len"] = [len(label) for label in line_labels] + sample["nb_lines"] = len(line_labels) + + sample["word_label"] = word_labels + sample["token_word_label"] = [ + LM_str_to_ind(self.charset, label) for label in word_labels + ] + sample["word_label_len"] = [len(label) for label in word_labels] + sample["nb_words"] = len(word_labels) + return sample + + def generate_synthetic_data(self, sample): + config = self.params["config"]["synthetic_data"] + + if not (config["init_proba"] == config["end_proba"] == 1): + nb_samples = self.training_info["step"] * self.params["batch_size"] + if config["start_scheduler_at_max_line"]: + max_step = config["num_steps_proba"] + current_step = max( + 0, + min( + nb_samples + - config["curr_step"] + * (config["max_nb_lines"] - config["min_nb_lines"]), + max_step, + ), + ) + proba = ( + config["init_proba"] + if self.get_syn_max_lines() < config["max_nb_lines"] + else config["proba_scheduler_function"]( + config["init_proba"], + config["end_proba"], + current_step, + max_step, + ) + ) + else: + proba = config["proba_scheduler_function"]( + config["init_proba"], + config["end_proba"], + min(nb_samples, config["num_steps_proba"]), + config["num_steps_proba"], + ) + if rand() > proba: + return sample + + if "mode" in config and config["mode"] == "line_hw_to_printed": + sample["img"] = self.generate_typed_text_line_image(sample["label"]) + return sample + + return self.generate_synthetic_page_sample() + + def get_syn_max_lines(self): + config = self.params["config"]["synthetic_data"] + if config["curriculum"]: + nb_samples = self.training_info["step"] * self.params["batch_size"] + max_nb_lines = min( + config["max_nb_lines"], + (nb_samples - config["curr_start"]) // config["curr_step"] + 1, + ) + return max(config["min_nb_lines"], max_nb_lines) + return config["max_nb_lines"] + + def generate_synthetic_page_sample(self): + config = self.params["config"]["synthetic_data"] + max_nb_lines_per_page = self.get_syn_max_lines() + crop = ( + config["crop_curriculum"] and max_nb_lines_per_page < config["max_nb_lines"] + ) + sample = {"name": "synthetic_data_{}".format(self.synthetic_id), "path": None} + self.synthetic_id += 1 + nb_pages = 2 if "double" in config["dataset_level"] else 1 + background_sample = copy.deepcopy(self.samples[randint(0, len(self))]) + pages = list() + backgrounds = list() + + h, w, c = background_sample["img"].shape + page_width = w // 2 if nb_pages == 2 else w + for i in range(nb_pages): + nb_lines_per_page = randint( + config["min_nb_lines"], max_nb_lines_per_page + 1 + ) + background = ( + np.ones((h, page_width, c), dtype=background_sample["img"].dtype) * 255 + ) + if i == 0 and nb_pages == 2: + background[:, -2:, :] = 0 + backgrounds.append(background) + if "READ_2016" in self.params["datasets"].keys(): + side = background_sample["pages_label"][i]["side"] + coords = { + "left": int(0.15 * page_width) + if side == "left" + else int(0.05 * page_width), + "right": int(0.95 * page_width) + if side == "left" + else int(0.85 * page_width), + "top": int(0.05 * h), + "bottom": int(0.85 * h), + } + pages.append( + self.generate_synthetic_read2016_page( + background, + coords, + side=side, + crop=crop, + nb_lines=nb_lines_per_page, + ) + ) + elif "RIMES" in self.params["datasets"].keys(): + pages.append( + self.generate_synthetic_rimes_page( + background, nb_lines=nb_lines_per_page, crop=crop + ) + ) + else: + raise NotImplementedError + + if nb_pages == 1: + sample["img"] = pages[0][0] + sample["label_raw"] = pages[0][1]["raw"] + sample["label_begin"] = pages[0][1]["begin"] + sample["label_sem"] = pages[0][1]["sem"] + sample["label"] = pages[0][1] + sample["nb_cols"] = pages[0][2] + else: + if pages[0][0].shape[0] != pages[1][0].shape[0]: + max_height = max(pages[0][0].shape[0], pages[1][0].shape[0]) + backgrounds[0] = backgrounds[0][:max_height] + backgrounds[0][: pages[0][0].shape[0]] = pages[0][0] + backgrounds[1] = backgrounds[1][:max_height] + backgrounds[1][: pages[1][0].shape[0]] = pages[1][0] + pages[0][0] = backgrounds[0] + pages[1][0] = backgrounds[1] + sample["label_raw"] = pages[0][1]["raw"] + "\n" + pages[1][1]["raw"] + sample["label_begin"] = pages[0][1]["begin"] + pages[1][1]["begin"] + sample["label_sem"] = pages[0][1]["sem"] + pages[1][1]["sem"] + sample["img"] = np.concatenate([pages[0][0], pages[1][0]], axis=1) + sample["nb_cols"] = pages[0][2] + pages[1][2] + sample["label"] = sample["label_raw"] + if "â“‘" in self.charset: + sample["label"] = sample["label_begin"] + if "â’·" in self.charset: + sample["label"] = sample["label_sem"] + sample["unchanged_label"] = sample["label"] + sample = self.convert_sample_labels(sample) + return sample + + def generate_typed_text_line_image(self, text): + return generate_typed_text_line_image( + text, self.params["config"]["synthetic_data"]["config"] + ) + + +class OCRCollateFunction: + """ + Merge samples data to mini-batch data for OCR task + """ + + def __init__(self, config): + self.img_padding_value = float(config["padding_value"]) + self.label_padding_value = config["padding_token"] + self.config = config + + def __call__(self, batch_data): + names = [batch_data[i]["name"] for i in range(len(batch_data))] + ids = [ + batch_data[i]["name"].split("/")[-1].split(".")[0] + for i in range(len(batch_data)) + ] + applied_da = [batch_data[i]["applied_da"] for i in range(len(batch_data))] + + labels = [batch_data[i]["token_label"] for i in range(len(batch_data))] + labels = pad_sequences_1D(labels, padding_value=self.label_padding_value) + labels = torch.tensor(labels).long() + reverse_labels = [ + [ + batch_data[i]["token_label"][0], + ] + + batch_data[i]["token_label"][-2:0:-1] + + [ + batch_data[i]["token_label"][-1], + ] + for i in range(len(batch_data)) + ] + reverse_labels = pad_sequences_1D( + reverse_labels, padding_value=self.label_padding_value + ) + reverse_labels = torch.tensor(reverse_labels).long() + labels_len = [batch_data[i]["label_len"] for i in range(len(batch_data))] + + raw_labels = [batch_data[i]["label"] for i in range(len(batch_data))] + unchanged_labels = [ + batch_data[i]["unchanged_label"] for i in range(len(batch_data)) + ] + + nb_cols = [batch_data[i]["nb_cols"] for i in range(len(batch_data))] + nb_lines = [batch_data[i]["nb_lines"] for i in range(len(batch_data))] + line_raw = [batch_data[i]["line_label"] for i in range(len(batch_data))] + line_token = [batch_data[i]["token_line_label"] for i in range(len(batch_data))] + pad_line_token = list() + line_len = [batch_data[i]["line_label_len"] for i in range(len(batch_data))] + for i in range(max(nb_lines)): + current_lines = [ + line_token[j][i] if i < nb_lines[j] else [self.label_padding_value] + for j in range(len(batch_data)) + ] + pad_line_token.append( + torch.tensor( + pad_sequences_1D( + current_lines, padding_value=self.label_padding_value + ) + ).long() + ) + for j in range(len(batch_data)): + if i >= nb_lines[j]: + line_len[j].append(0) + line_len = [i for i in zip(*line_len)] + + nb_words = [batch_data[i]["nb_words"] for i in range(len(batch_data))] + word_raw = [batch_data[i]["word_label"] for i in range(len(batch_data))] + word_token = [batch_data[i]["token_word_label"] for i in range(len(batch_data))] + pad_word_token = list() + word_len = [batch_data[i]["word_label_len"] for i in range(len(batch_data))] + for i in range(max(nb_words)): + current_words = [ + word_token[j][i] if i < nb_words[j] else [self.label_padding_value] + for j in range(len(batch_data)) + ] + pad_word_token.append( + torch.tensor( + pad_sequences_1D( + current_words, padding_value=self.label_padding_value + ) + ).long() + ) + for j in range(len(batch_data)): + if i >= nb_words[j]: + word_len[j].append(0) + word_len = [i for i in zip(*word_len)] + + padding_mode = ( + self.config["padding_mode"] if "padding_mode" in self.config else "br" + ) + imgs = [batch_data[i]["img"] for i in range(len(batch_data))] + imgs_shape = [batch_data[i]["img_shape"] for i in range(len(batch_data))] + imgs_reduced_shape = [ + batch_data[i]["img_reduced_shape"] for i in range(len(batch_data)) + ] + imgs_position = [batch_data[i]["img_position"] for i in range(len(batch_data))] + imgs_reduced_position = [ + batch_data[i]["img_reduced_position"] for i in range(len(batch_data)) + ] + imgs = pad_images( + imgs, padding_value=self.img_padding_value, padding_mode=padding_mode + ) + imgs = torch.tensor(imgs).float().permute(0, 3, 1, 2) + formatted_batch_data = { + "names": names, + "ids": ids, + "nb_lines": nb_lines, + "nb_cols": nb_cols, + "labels": labels, + "reverse_labels": reverse_labels, + "raw_labels": raw_labels, + "unchanged_labels": unchanged_labels, + "labels_len": labels_len, + "imgs": imgs, + "imgs_shape": imgs_shape, + "imgs_reduced_shape": imgs_reduced_shape, + "imgs_position": imgs_position, + "imgs_reduced_position": imgs_reduced_position, + "line_raw": line_raw, + "line_labels": pad_line_token, + "line_labels_len": line_len, + "nb_words": nb_words, + "word_raw": word_raw, + "word_labels": pad_word_token, + "word_labels_len": word_len, + "applied_da": applied_da, + } + + return formatted_batch_data + + +def generate_typed_text_line_image( + text, config, bg_color=(255, 255, 255), txt_color=(0, 0, 0) +): + if text == "": + text = " " + if "text_color_default" in config: + txt_color = config["text_color_default"] + if "background_color_default" in config: + bg_color = config["background_color_default"] + + font_path = config["valid_fonts"][randint(0, len(config["valid_fonts"]))] + font_size = randint(config["font_size_min"], config["font_size_max"] + 1) + fnt = ImageFont.truetype(font_path, font_size) + + text_width, text_height = fnt.getsize(text) + padding_top = int( + rand_uniform(config["padding_top_ratio_min"], config["padding_top_ratio_max"]) + * text_height + ) + padding_bottom = int( + rand_uniform( + config["padding_bottom_ratio_min"], config["padding_bottom_ratio_max"] + ) + * text_height + ) + padding_left = int( + rand_uniform(config["padding_left_ratio_min"], config["padding_left_ratio_max"]) + * text_width + ) + padding_right = int( + rand_uniform( + config["padding_right_ratio_min"], config["padding_right_ratio_max"] + ) + * text_width + ) + padding = [padding_top, padding_bottom, padding_left, padding_right] + return generate_typed_text_line_image_from_params( + text, fnt, bg_color, txt_color, config["color_mode"], padding + ) + + +def generate_typed_text_line_image_from_params( + text, font, bg_color, txt_color, color_mode, padding +): + padding_top, padding_bottom, padding_left, padding_right = padding + text_width, text_height = font.getsize(text) + img_height = padding_top + padding_bottom + text_height + img_width = padding_left + padding_right + text_width + img = Image.new(color_mode, (img_width, img_height), color=bg_color) + d = ImageDraw.Draw(img) + d.text((padding_left, padding_bottom), text, font=font, fill=txt_color, spacing=0) + return np.array(img) + + +def char_in_font(unicode_char, font_path): + with TTFont(font_path) as font: + for cmap in font["cmap"].tables: + if cmap.isUnicode(): + if ord(unicode_char) in cmap.cmap: + return True + return False + + +def get_valid_fonts(alphabet=None): + valid_fonts = list() + for fold_detail in os.walk("../../../Fonts"): + if fold_detail[2]: + for font_name in fold_detail[2]: + if ".ttf" not in font_name: + continue + font_path = os.path.join(fold_detail[0], font_name) + to_add = True + if alphabet is not None: + for char in alphabet: + if not char_in_font(char, font_path): + to_add = False + break + if to_add: + valid_fonts.append(font_path) + else: + valid_fonts.append(font_path) + return valid_fonts diff --git a/dan/manager/training.py b/dan/manager/training.py new file mode 100644 index 00000000..90f13626 --- /dev/null +++ b/dan/manager/training.py @@ -0,0 +1,1291 @@ +# -*- coding: utf-8 -*- +import copy +import json +import os +import pickle +import random +import sys +from datetime import date +from time import time + +import numpy as np +import torch +import torch.distributed as dist +import torch.multiprocessing as mp +from PIL import Image +from torch.cuda.amp import GradScaler, autocast +from torch.nn import CrossEntropyLoss +from torch.nn.init import kaiming_uniform_ +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.utils.tensorboard import SummaryWriter +from tqdm import tqdm + +from dan.manager.metrics import MetricManager +from dan.ocr.utils import LM_ind_to_str +from dan.schedulers import DropoutScheduler + + +class GenericTrainingManager: + def __init__(self, params): + self.type = None + self.is_master = False + self.params = params + self.dropout_scheduler = None + self.models = {} + self.begin_time = None + self.dataset = None + self.dataset_name = list(self.params["dataset_params"]["datasets"].values())[0] + self.paths = None + self.latest_step = 0 + self.latest_epoch = -1 + self.latest_batch = 0 + self.total_batch = 0 + self.grad_acc_step = 0 + self.latest_train_metrics = dict() + self.latest_valid_metrics = dict() + self.curriculum_info = dict() + self.curriculum_info["latest_valid_metrics"] = dict() + self.phase = None + self.max_mem_usage_by_epoch = list() + self.losses = list() + self.lr_values = list() + + self.scaler = None + + self.optimizers = dict() + self.optimizers_named_params_by_group = dict() + self.lr_schedulers = dict() + self.best = None + self.writer = None + self.metric_manager = dict() + + self.init_hardware_config() + self.init_paths() + self.load_dataset() + self.params["model_params"]["use_amp"] = self.params["training_params"][ + "use_amp" + ] + + def init_paths(self): + """ + Create output folders for results and checkpoints + """ + output_path = os.path.join( + "outputs", self.params["training_params"]["output_folder"] + ) + os.makedirs(output_path, exist_ok=True) + checkpoints_path = os.path.join(output_path, "checkpoints") + os.makedirs(checkpoints_path, exist_ok=True) + results_path = os.path.join(output_path, "results") + os.makedirs(results_path, exist_ok=True) + + self.paths = { + "results": results_path, + "checkpoints": checkpoints_path, + "output_folder": output_path, + } + + def load_dataset(self): + """ + Load datasets, data samplers and data loaders + """ + self.params["dataset_params"]["use_ddp"] = self.params["training_params"][ + "use_ddp" + ] + self.params["dataset_params"]["batch_size"] = self.params["training_params"][ + "batch_size" + ] + if "valid_batch_size" in self.params["training_params"]: + self.params["dataset_params"]["valid_batch_size"] = self.params[ + "training_params" + ]["valid_batch_size"] + if "test_batch_size" in self.params["training_params"]: + self.params["dataset_params"]["test_batch_size"] = self.params[ + "training_params" + ]["test_batch_size"] + self.params["dataset_params"]["num_gpu"] = self.params["training_params"][ + "nb_gpu" + ] + self.params["dataset_params"]["worker_per_gpu"] = ( + 4 + if "worker_per_gpu" not in self.params["dataset_params"] + else self.params["dataset_params"]["worker_per_gpu"] + ) + self.dataset = self.params["dataset_params"]["dataset_manager"]( + self.params["dataset_params"] + ) + self.dataset.load_datasets() + self.dataset.load_ddp_samplers() + self.dataset.load_dataloaders() + + def init_hardware_config(self): + # Debug mode + if self.params["training_params"]["force_cpu"]: + self.params["training_params"]["use_ddp"] = False + self.params["training_params"]["use_amp"] = False + # Manage Distributed Data Parallel & GPU usage + self.manual_seed = ( + 1111 + if "manual_seed" not in self.params["training_params"].keys() + else self.params["training_params"]["manual_seed"] + ) + self.ddp_config = { + "master": self.params["training_params"]["use_ddp"] + and self.params["training_params"]["ddp_rank"] == 0, + "address": "localhost" + if "ddp_addr" not in self.params["training_params"].keys() + else self.params["training_params"]["ddp_addr"], + "port": "11111" + if "ddp_port" not in self.params["training_params"].keys() + else self.params["training_params"]["ddp_port"], + "backend": "nccl" + if "ddp_backend" not in self.params["training_params"].keys() + else self.params["training_params"]["ddp_backend"], + "rank": self.params["training_params"]["ddp_rank"], + } + self.is_master = ( + self.ddp_config["master"] or not self.params["training_params"]["use_ddp"] + ) + if self.params["training_params"]["force_cpu"]: + self.device = "cpu" + else: + if self.params["training_params"]["use_ddp"]: + self.device = torch.device(self.ddp_config["rank"]) + self.params["dataset_params"]["ddp_rank"] = self.ddp_config["rank"] + self.launch_ddp() + else: + self.device = torch.device( + "cuda:0" if torch.cuda.is_available() else "cpu" + ) + self.params["model_params"]["device"] = self.device.type + # Print GPU info + # global + if ( + self.params["training_params"]["use_ddp"] and self.ddp_config["master"] + ) or not self.params["training_params"]["use_ddp"]: + print("##################") + print("Available GPUS: {}".format(self.params["training_params"]["nb_gpu"])) + for i in range(self.params["training_params"]["nb_gpu"]): + print( + "Rank {}: {} {}".format( + i, + torch.cuda.get_device_name(i), + torch.cuda.get_device_properties(i), + ) + ) + print("##################") + # local + print("Local GPU:") + if self.device != "cpu": + print( + "Rank {}: {} {}".format( + self.params["training_params"]["ddp_rank"], + torch.cuda.get_device_name(), + torch.cuda.get_device_properties(self.device), + ) + ) + else: + print("WORKING ON CPU !\n") + print("##################") + + def load_model(self, reset_optimizer=False, strict=True): + """ + Load model weights from scratch or from checkpoints + """ + # Instantiate Model + for model_name in self.params["model_params"]["models"].keys(): + self.models[model_name] = self.params["model_params"]["models"][model_name]( + self.params["model_params"] + ) + self.models[model_name].to(self.device) # To GPU or CPU + # make the model compatible with Distributed Data Parallel if used + if self.params["training_params"]["use_ddp"]: + self.models[model_name] = DDP( + self.models[model_name], [self.ddp_config["rank"]] + ) + + # Handle curriculum dropout + if "dropout_scheduler" in self.params["model_params"]: + func = self.params["model_params"]["dropout_scheduler"]["function"] + T = self.params["model_params"]["dropout_scheduler"]["T"] + self.dropout_scheduler = DropoutScheduler(self.models, func, T) + + self.scaler = GradScaler(enabled=self.params["training_params"]["use_amp"]) + + # Check if checkpoint exists + checkpoint = self.get_checkpoint() + if checkpoint is not None: + self.load_existing_model(checkpoint, strict=strict) + else: + self.init_new_model() + + self.load_optimizers(checkpoint, reset_optimizer=reset_optimizer) + + if self.is_master: + print("LOADED EPOCH: {}\n".format(self.latest_epoch), flush=True) + + def get_checkpoint(self): + """ + Seek if checkpoint exist, return None otherwise + """ + if self.params["training_params"]["load_epoch"] in ("best", "last"): + for filename in os.listdir(self.paths["checkpoints"]): + if self.params["training_params"]["load_epoch"] in filename: + return torch.load(os.path.join(self.paths["checkpoints"], filename)) + return None + + def load_existing_model(self, checkpoint, strict=True): + """ + Load information and weights from previous training + """ + self.load_save_info(checkpoint) + self.latest_epoch = checkpoint["epoch"] + if "step" in checkpoint: + self.latest_step = checkpoint["step"] + self.best = checkpoint["best"] + if "scaler_state_dict" in checkpoint: + self.scaler.load_state_dict(checkpoint["scaler_state_dict"]) + # Load model weights from past training + for model_name in self.models.keys(): + self.models[model_name].load_state_dict( + checkpoint["{}_state_dict".format(model_name)], strict=strict + ) + + def init_new_model(self): + """ + Initialize model + """ + # Specific weights initialization if exists + for model_name in self.models.keys(): + try: + self.models[model_name].init_weights() + except Exception: + pass + + # Handle transfer learning instructions + if self.params["model_params"]["transfer_learning"]: + # Iterates over models + for model_name in self.params["model_params"]["transfer_learning"].keys(): + state_dict_name, path, learnable, strict = self.params["model_params"][ + "transfer_learning" + ][model_name] + # Loading pretrained weights file + checkpoint = torch.load(path) + try: + # Load pretrained weights for model + self.models[model_name].load_state_dict( + checkpoint["{}_state_dict".format(state_dict_name)], + strict=strict, + ) + print( + "transferred weights for {}".format(state_dict_name), flush=True + ) + except RuntimeError as e: + print(e, flush=True) + # if error, try to load each parts of the model (useful if only few layers are different) + for key in checkpoint[ + "{}_state_dict".format(state_dict_name) + ].keys(): + try: + # for pre-training of decision layer + if ( + "end_conv" in key + and "transfered_charset" in self.params["model_params"] + ): + self.adapt_decision_layer_to_old_charset( + model_name, key, checkpoint, state_dict_name + ) + else: + self.models[model_name].load_state_dict( + { + key: checkpoint[ + "{}_state_dict".format(state_dict_name) + ][key] + }, + strict=False, + ) + except RuntimeError as e: + # exception when adding linebreak token from pretraining + print(e, flush=True) + # Set parameters no trainable + if not learnable: + self.set_model_learnable(self.models[model_name], False) + + def adapt_decision_layer_to_old_charset( + self, model_name, key, checkpoint, state_dict_name + ): + """ + Transfer learning of the decision learning in case of close charsets between pre-training and training + """ + pretrained_chars = list() + weights = checkpoint["{}_state_dict".format(state_dict_name)][key] + new_size = list(weights.size()) + new_size[0] = ( + len(self.dataset.charset) + self.params["model_params"]["additional_tokens"] + ) + new_weights = torch.zeros(new_size, device=weights.device, dtype=weights.dtype) + old_charset = ( + checkpoint["charset"] + if "charset" in checkpoint + else self.params["model_params"]["old_charset"] + ) + if "bias" not in key: + kaiming_uniform_(new_weights, nonlinearity="relu") + for i, c in enumerate(self.dataset.charset): + if c in old_charset: + new_weights[i] = weights[old_charset.index(c)] + pretrained_chars.append(c) + if ( + "transfered_charset_last_is_ctc_blank" in self.params["model_params"] + and self.params["model_params"]["transfered_charset_last_is_ctc_blank"] + ): + new_weights[-1] = weights[-1] + pretrained_chars.append("<blank>") + checkpoint["{}_state_dict".format(state_dict_name)][key] = new_weights + self.models[model_name].load_state_dict( + {key: checkpoint["{}_state_dict".format(state_dict_name)][key]}, + strict=False, + ) + print( + "Pretrained chars for {} ({}): {}".format( + key, len(pretrained_chars), pretrained_chars + ) + ) + + def load_optimizers(self, checkpoint, reset_optimizer=False): + """ + Load the optimizer of each model + """ + for model_name in self.models.keys(): + new_params = dict() + if ( + checkpoint + and "optimizer_named_params_{}".format(model_name) in checkpoint + ): + self.optimizers_named_params_by_group[model_name] = checkpoint[ + "optimizer_named_params_{}".format(model_name) + ] + # for progressively growing models + for name, param in self.models[model_name].named_parameters(): + existing = False + for gr in self.optimizers_named_params_by_group[model_name]: + if name in gr: + gr[name] = param + existing = True + break + if not existing: + new_params.update({name: param}) + else: + self.optimizers_named_params_by_group[model_name] = [ + dict(), + ] + self.optimizers_named_params_by_group[model_name][0].update( + self.models[model_name].named_parameters() + ) + + # Instantiate optimizer + self.reset_optimizer(model_name) + + # Handle learning rate schedulers + if ( + "lr_schedulers" in self.params["training_params"] + and self.params["training_params"]["lr_schedulers"] + ): + key = ( + "all" + if "all" in self.params["training_params"]["lr_schedulers"] + else model_name + ) + if key in self.params["training_params"]["lr_schedulers"]: + self.lr_schedulers[model_name] = self.params["training_params"][ + "lr_schedulers" + ][key]["class"]( + self.optimizers[model_name], + **self.params["training_params"]["lr_schedulers"][key]["args"] + ) + + # Load optimizer state from past training + if checkpoint and not reset_optimizer: + self.optimizers[model_name].load_state_dict( + checkpoint["optimizer_{}_state_dict".format(model_name)] + ) + # Load optimizer scheduler config from past training if used + if ( + "lr_schedulers" in self.params["training_params"] + and self.params["training_params"]["lr_schedulers"] + and "lr_scheduler_{}_state_dict".format(model_name) + in checkpoint.keys() + ): + self.lr_schedulers[model_name].load_state_dict( + checkpoint["lr_scheduler_{}_state_dict".format(model_name)] + ) + + # for progressively growing models, keeping learning rate + if checkpoint and new_params: + self.optimizers_named_params_by_group[model_name].append(new_params) + self.optimizers[model_name].add_param_group( + {"params": list(new_params.values())} + ) + + @staticmethod + def set_model_learnable(model, learnable=True): + for p in list(model.parameters()): + p.requires_grad = learnable + + def save_model(self, epoch, name, keep_weights=False): + """ + Save model weights and training info for curriculum learning or learning rate for instance + """ + if not self.is_master: + return + to_del = [] + for filename in os.listdir(self.paths["checkpoints"]): + if name in filename: + to_del.append(os.path.join(self.paths["checkpoints"], filename)) + path = os.path.join(self.paths["checkpoints"], "{}_{}.pt".format(name, epoch)) + content = { + "optimizers_named_params": self.optimizers_named_params_by_group, + "epoch": epoch, + "step": self.latest_step, + "scaler_state_dict": self.scaler.state_dict(), + "best": self.best, + "charset": self.dataset.charset, + } + for model_name in self.optimizers: + content["optimizer_{}_state_dict".format(model_name)] = self.optimizers[ + model_name + ].state_dict() + for model_name in self.lr_schedulers: + content[ + "lr_scheduler_{}_state_dict".format(model_name) + ] = self.lr_schedulers[model_name].state_dict() + content = self.add_save_info(content) + for model_name in self.models.keys(): + content["{}_state_dict".format(model_name)] = self.models[ + model_name + ].state_dict() + torch.save(content, path) + if not keep_weights: + for path_to_del in to_del: + if path_to_del != path: + os.remove(path_to_del) + + def reset_optimizer(self, model_name): + """ + Reset optimizer learning rate for given model + """ + params = list(self.optimizers_named_params_by_group[model_name][0].values()) + key = ( + "all" + if "all" in self.params["training_params"]["optimizers"] + else model_name + ) + self.optimizers[model_name] = self.params["training_params"]["optimizers"][key][ + "class" + ](params, **self.params["training_params"]["optimizers"][key]["args"]) + for i in range(1, len(self.optimizers_named_params_by_group[model_name])): + self.optimizers[model_name].add_param_group( + { + "params": list( + self.optimizers_named_params_by_group[model_name][i].values() + ) + } + ) + + def save_params(self): + """ + Output text file containing a summary of all hyperparameters chosen for the training + """ + + def compute_nb_params(module): + return sum([np.prod(p.size()) for p in list(module.parameters())]) + + def class_to_str_dict(my_dict): + for key in my_dict.keys(): + if callable(my_dict[key]): + my_dict[key] = my_dict[key].__name__ + elif isinstance(my_dict[key], np.ndarray): + my_dict[key] = my_dict[key].tolist() + elif isinstance(my_dict[key], dict): + my_dict[key] = class_to_str_dict(my_dict[key]) + return my_dict + + path = os.path.join(self.paths["results"], "params") + if os.path.isfile(path): + return + params = copy.deepcopy(self.params) + params = class_to_str_dict(params) + params["date"] = date.today().strftime("%d/%m/%Y") + total_params = 0 + for model_name in self.models.keys(): + current_params = compute_nb_params(self.models[model_name]) + params["model_params"]["models"][model_name] = [ + params["model_params"]["models"][model_name], + "{:,}".format(current_params), + ] + total_params += current_params + params["model_params"]["total_params"] = "{:,}".format(total_params) + + params["hardware"] = dict() + if self.device != "cpu": + for i in range(self.params["training_params"]["nb_gpu"]): + params["hardware"][str(i)] = "{} {}".format( + torch.cuda.get_device_name(i), torch.cuda.get_device_properties(i) + ) + else: + params["hardware"]["0"] = "CPU" + params["software"] = { + "python_version": sys.version, + "pytorch_version": torch.__version__, + "cuda_version": torch.version.cuda, + "cudnn_version": torch.backends.cudnn.version(), + } + with open(path, "w") as f: + json.dump(params, f, indent=4) + + def backward_loss(self, loss, retain_graph=False): + self.scaler.scale(loss).backward(retain_graph=retain_graph) + + def step_optimizers(self, increment_step=True, names=None): + for model_name in self.optimizers: + if names and model_name not in names: + continue + if ( + "gradient_clipping" in self.params["training_params"] + and model_name + in self.params["training_params"]["gradient_clipping"]["models"] + ): + self.scaler.unscale_(self.optimizers[model_name]) + torch.nn.utils.clip_grad_norm_( + self.models[model_name].parameters(), + self.params["training_params"]["gradient_clipping"]["max"], + ) + self.scaler.step(self.optimizers[model_name]) + self.scaler.update() + self.latest_step += 1 + + def zero_optimizers(self, set_to_none=True): + for model_name in self.optimizers: + self.zero_optimizer(model_name, set_to_none) + + def zero_optimizer(self, model_name, set_to_none=True): + self.optimizers[model_name].zero_grad(set_to_none=set_to_none) + + def train(self): + """ + Main training loop + """ + # init tensorboard file and output param summary file + if self.is_master: + self.writer = SummaryWriter(self.paths["results"]) + self.save_params() + # init variables + self.begin_time = time() + focus_metric_name = self.params["training_params"]["focus_metric"] + nb_epochs = self.params["training_params"]["max_nb_epochs"] + interval_save_weights = self.params["training_params"]["interval_save_weights"] + metric_names = self.params["training_params"]["train_metrics"] + + display_values = None + # init curriculum learning + if ( + "curriculum_learning" in self.params["training_params"].keys() + and self.params["training_params"]["curriculum_learning"] + ): + self.init_curriculum() + # perform epochs + for num_epoch in range(self.latest_epoch + 1, nb_epochs): + self.dataset.train_dataset.training_info = { + "epoch": self.latest_epoch, + "step": self.latest_step, + } + self.phase = "train" + # Check maximum training time stop condition + if ( + self.params["training_params"]["max_training_time"] + and time() - self.begin_time + > self.params["training_params"]["max_training_time"] + ): + break + # set models trainable + for model_name in self.models.keys(): + self.models[model_name].train() + self.latest_epoch = num_epoch + if self.dataset.train_dataset.curriculum_config: + self.dataset.train_dataset.curriculum_config[ + "epoch" + ] = self.latest_epoch + # init epoch metrics values + self.metric_manager["train"] = MetricManager( + metric_names=metric_names, dataset_name=self.dataset_name + ) + + with tqdm(total=len(self.dataset.train_loader.dataset)) as pbar: + pbar.set_description("EPOCH {}/{}".format(num_epoch, nb_epochs)) + # iterates over mini-batch data + for ind_batch, batch_data in enumerate(self.dataset.train_loader): + self.latest_batch = ind_batch + 1 + self.total_batch += 1 + # train on batch data and compute metrics + batch_values = self.train_batch(batch_data, metric_names) + batch_metrics = self.metric_manager["train"].compute_metrics( + batch_values, metric_names + ) + batch_metrics["names"] = batch_data["names"] + batch_metrics["ids"] = batch_data["ids"] + # Merge metrics if Distributed Data Parallel is used + if self.params["training_params"]["use_ddp"]: + batch_metrics = self.merge_ddp_metrics(batch_metrics) + # Update learning rate via scheduler if one is used + if self.params["training_params"]["lr_schedulers"]: + for model_name in self.models: + key = ( + "all" + if "all" + in self.params["training_params"]["lr_schedulers"] + else model_name + ) + if ( + model_name in self.lr_schedulers + and ind_batch + % self.params["training_params"]["lr_schedulers"][key][ + "step_interval" + ] + == 0 + ): + self.lr_schedulers[model_name].step( + len(batch_metrics["names"]) + ) + if "lr" in metric_names: + self.writer.add_scalar( + "lr_{}".format(model_name), + self.lr_schedulers[model_name].lr, + self.lr_schedulers[model_name].step_num, + ) + # Update dropout scheduler if used + if self.dropout_scheduler: + self.dropout_scheduler.step(len(batch_metrics["names"])) + self.dropout_scheduler.update_dropout_rate() + + # Add batch metrics values to epoch metrics values + self.metric_manager["train"].update_metrics(batch_metrics) + display_values = self.metric_manager["train"].get_display_values() + pbar.set_postfix(values=str(display_values)) + pbar.update(len(batch_data["names"])) + + # log metrics in tensorboard file + if self.is_master: + for key in display_values.keys(): + self.writer.add_scalar( + "{}_{}".format( + self.params["dataset_params"]["train"]["name"], key + ), + display_values[key], + num_epoch, + ) + self.latest_train_metrics = display_values + + # evaluate and compute metrics for valid sets + if ( + self.params["training_params"]["eval_on_valid"] + and num_epoch % self.params["training_params"]["eval_on_valid_interval"] + == 0 + ): + for valid_set_name in self.dataset.valid_loaders.keys(): + # evaluate set and compute metrics + eval_values = self.evaluate(valid_set_name) + self.latest_valid_metrics = eval_values + # log valid metrics in tensorboard file + if self.is_master: + for key in eval_values.keys(): + self.writer.add_scalar( + "{}_{}".format(valid_set_name, key), + eval_values[key], + num_epoch, + ) + if valid_set_name == self.params["training_params"][ + "set_name_focus_metric" + ] and ( + self.best is None + or ( + eval_values[focus_metric_name] <= self.best + and self.params["training_params"][ + "expected_metric_value" + ] + == "low" + ) + or ( + eval_values[focus_metric_name] >= self.best + and self.params["training_params"][ + "expected_metric_value" + ] + == "high" + ) + ): + self.save_model(epoch=num_epoch, name="best") + self.best = eval_values[focus_metric_name] + + # Handle curriculum learning update + if self.dataset.train_dataset.curriculum_config: + self.check_and_update_curriculum() + + if ( + "curriculum_model" in self.params["model_params"] + and self.params["model_params"]["curriculum_model"] + ): + self.update_curriculum_model() + + # save model weights + if self.is_master: + self.save_model(epoch=num_epoch, name="last") + if interval_save_weights and num_epoch % interval_save_weights == 0: + self.save_model(epoch=num_epoch, name="weights", keep_weights=True) + self.writer.flush() + + def evaluate(self, set_name, **kwargs): + """ + Main loop for validation + """ + self.phase = "eval" + loader = self.dataset.valid_loaders[set_name] + # Set models in eval mode + for model_name in self.models.keys(): + self.models[model_name].eval() + metric_names = self.params["training_params"]["eval_metrics"] + display_values = None + + # initialize epoch metrics + self.metric_manager[set_name] = MetricManager( + metric_names, dataset_name=self.dataset_name + ) + with tqdm(total=len(loader.dataset)) as pbar: + pbar.set_description("Evaluation E{}".format(self.latest_epoch)) + with torch.no_grad(): + # iterate over batch data + for ind_batch, batch_data in enumerate(loader): + self.latest_batch = ind_batch + 1 + # eval batch data and compute metrics + batch_values = self.evaluate_batch(batch_data, metric_names) + batch_metrics = self.metric_manager[set_name].compute_metrics( + batch_values, metric_names + ) + batch_metrics["names"] = batch_data["names"] + batch_metrics["ids"] = batch_data["ids"] + # merge metrics values if Distributed Data Parallel is used + if self.params["training_params"]["use_ddp"]: + batch_metrics = self.merge_ddp_metrics(batch_metrics) + + # add batch metrics to epoch metrics + self.metric_manager[set_name].update_metrics(batch_metrics) + display_values = self.metric_manager[set_name].get_display_values() + + pbar.set_postfix(values=str(display_values)) + pbar.update(len(batch_data["names"])) + if "cer_by_nb_cols" in metric_names: + self.log_cer_by_nb_cols(set_name) + return display_values + + def predict(self, custom_name, sets_list, metric_names, output=False): + """ + Main loop for evaluation + """ + self.phase = "predict" + metric_names = metric_names.copy() + self.dataset.generate_test_loader(custom_name, sets_list) + loader = self.dataset.test_loaders[custom_name] + # Set models in eval mode + for model_name in self.models.keys(): + self.models[model_name].eval() + + # initialize epoch metrics + self.metric_manager[custom_name] = MetricManager( + metric_names, self.dataset_name + ) + + with tqdm(total=len(loader.dataset)) as pbar: + pbar.set_description("Prediction") + with torch.no_grad(): + for ind_batch, batch_data in enumerate(loader): + # iterates over batch data + self.latest_batch = ind_batch + 1 + # eval batch data and compute metrics + batch_values = self.evaluate_batch(batch_data, metric_names) + batch_metrics = self.metric_manager[custom_name].compute_metrics( + batch_values, metric_names + ) + batch_metrics["names"] = batch_data["names"] + batch_metrics["ids"] = batch_data["ids"] + # merge batch metrics if Distributed Data Parallel is used + if self.params["training_params"]["use_ddp"]: + batch_metrics = self.merge_ddp_metrics(batch_metrics) + + # add batch metrics to epoch metrics + self.metric_manager[custom_name].update_metrics(batch_metrics) + display_values = self.metric_manager[ + custom_name + ].get_display_values() + + pbar.set_postfix(values=str(display_values)) + pbar.update(len(batch_data["names"])) + + self.dataset.remove_test_dataset(custom_name) + # output metrics values if requested + if output: + if "pred" in metric_names: + self.output_pred(custom_name) + metrics = self.metric_manager[custom_name].get_display_values(output=True) + path = os.path.join( + self.paths["results"], + "predict_{}_{}.txt".format(custom_name, self.latest_epoch), + ) + with open(path, "w") as f: + for metric_name in metrics.keys(): + f.write("{}: {}\n".format(metric_name, metrics[metric_name])) + + def output_pred(self, name): + path = os.path.join( + self.paths["results"], "pred_{}_{}.txt".format(name, self.latest_epoch) + ) + pred = "\n".join(self.metric_manager[name].get("pred")) + with open(path, "w") as f: + f.write(pred) + + def launch_ddp(self): + """ + Initialize Distributed Data Parallel system + """ + mp.set_start_method("fork", force=True) + os.environ["MASTER_ADDR"] = self.ddp_config["address"] + os.environ["MASTER_PORT"] = str(self.ddp_config["port"]) + dist.init_process_group( + self.ddp_config["backend"], + rank=self.ddp_config["rank"], + world_size=self.params["training_params"]["nb_gpu"], + ) + torch.cuda.set_device(self.ddp_config["rank"]) + random.seed(self.manual_seed) + np.random.seed(self.manual_seed) + torch.manual_seed(self.manual_seed) + torch.cuda.manual_seed(self.manual_seed) + + def merge_ddp_metrics(self, metrics): + """ + Merge metrics when Distributed Data Parallel is used + """ + for metric_name in metrics.keys(): + if metric_name in [ + "edit_words", + "nb_words", + "edit_chars", + "nb_chars", + "edit_chars_force_len", + "edit_chars_curr", + "nb_chars_curr", + "ids", + ]: + metrics[metric_name] = self.cat_ddp_metric(metrics[metric_name]) + elif metric_name in [ + "nb_samples", + "loss", + "loss_ce", + "loss_ctc", + "loss_ce_end", + ]: + metrics[metric_name] = self.sum_ddp_metric( + metrics[metric_name], average=False + ) + return metrics + + def sum_ddp_metric(self, metric, average=False): + """ + Sum metrics for Distributed Data Parallel + """ + sum = torch.tensor(metric[0]).to(self.device) + dist.all_reduce(sum, op=dist.ReduceOp.SUM) + if average: + sum.true_divide(dist.get_world_size()) + return [ + sum.item(), + ] + + def cat_ddp_metric(self, metric): + """ + Concatenate metrics for Distributed Data Parallel + """ + tensor = torch.tensor(metric).unsqueeze(0).to(self.device) + res = [ + torch.zeros(tensor.size()).long().to(self.device) + for _ in range(dist.get_world_size()) + ] + dist.all_gather(res, tensor) + return list(torch.cat(res, dim=0).flatten().cpu().numpy()) + + @staticmethod + def cleanup(): + dist.destroy_process_group() + + def train_batch(self, batch_data, metric_names): + raise NotImplementedError + + def evaluate_batch(self, batch_data, metric_names): + raise NotImplementedError + + def init_curriculum(self): + raise NotImplementedError + + def update_curriculum(self): + raise NotImplementedError + + def add_checkpoint_info(self, load_mode="last", **kwargs): + for filename in os.listdir(self.paths["checkpoints"]): + if load_mode in filename: + checkpoint_path = os.path.join(self.paths["checkpoints"], filename) + checkpoint = torch.load(checkpoint_path) + for key in kwargs.keys(): + checkpoint[key] = kwargs[key] + torch.save(checkpoint, checkpoint_path) + return + self.save_model(self.latest_epoch, "last") + + def load_save_info(self, info_dict): + """ + Load curriculum info from saved model info + """ + if "curriculum_config" in info_dict.keys(): + self.dataset.train_dataset.curriculum_config = info_dict[ + "curriculum_config" + ] + + def add_save_info(self, info_dict): + """ + Add curriculum info to model info to be saved + """ + info_dict["curriculum_config"] = self.dataset.train_dataset.curriculum_config + return info_dict + + +class OCRManager(GenericTrainingManager): + def __init__(self, params): + super(OCRManager, self).__init__(params) + self.params["model_params"]["vocab_size"] = len(self.dataset.charset) + + def generate_syn_line_dataset(self, name): + """ + Generate synthetic line dataset from currently loaded dataset + """ + dataset_name = list(self.params["dataset_params"]["datasets"].keys())[0] + path = os.path.join( + os.path.dirname(self.params["dataset_params"]["datasets"][dataset_name]), + name, + ) + os.makedirs(path, exist_ok=True) + charset = set() + dataset = None + gt = {"train": dict(), "valid": dict(), "test": dict()} + for set_name in ["train", "valid", "test"]: + set_path = os.path.join(path, set_name) + os.makedirs(set_path, exist_ok=True) + if set_name == "train": + dataset = self.dataset.train_dataset + elif set_name == "valid": + dataset = self.dataset.valid_datasets["{}-valid".format(dataset_name)] + elif set_name == "test": + self.dataset.generate_test_loader( + "{}-test".format(dataset_name), + [ + (dataset_name, "test"), + ], + ) + dataset = self.dataset.test_datasets["{}-test".format(dataset_name)] + + samples = list() + for sample in dataset.samples: + for line_label in sample["label"].split("\n"): + for chunk in [ + line_label[i : i + 100] for i in range(0, len(line_label), 100) + ]: + charset = charset.union(set(chunk)) + if len(chunk) > 0: + samples.append( + { + "path": sample["path"], + "label": chunk, + "nb_cols": 1, + } + ) + + for i, sample in enumerate(samples): + ext = sample["path"].split(".")[-1] + img_name = "{}_{}.{}".format(set_name, i, ext) + img_path = os.path.join(set_path, img_name) + + img = dataset.generate_typed_text_line_image(sample["label"]) + Image.fromarray(img).save(img_path) + gt[set_name][img_name] = { + "text": sample["label"], + "nb_cols": sample["nb_cols"] if "nb_cols" in sample else 1, + } + if "line_label" in sample: + gt[set_name][img_name]["lines"] = sample["line_label"] + + with open(os.path.join(path, "labels.pkl"), "wb") as f: + pickle.dump( + { + "ground_truth": gt, + "charset": sorted(list(charset)), + }, + f, + ) + + +class Manager(OCRManager): + def __init__(self, params): + super(Manager, self).__init__(params) + + def load_save_info(self, info_dict): + if "curriculum_config" in info_dict.keys(): + if self.dataset.train_dataset is not None: + self.dataset.train_dataset.curriculum_config = info_dict[ + "curriculum_config" + ] + + def add_save_info(self, info_dict): + info_dict["curriculum_config"] = self.dataset.train_dataset.curriculum_config + return info_dict + + def apply_teacher_forcing(self, y, y_len, error_rate): + y_error = y.clone() + for b in range(len(y_len)): + for i in range(1, y_len[b]): + if ( + np.random.rand() < error_rate + and y[b][i] != self.dataset.tokens["pad"] + ): + y_error[b][i] = np.random.randint(0, len(self.dataset.charset) + 2) + return y_error, y_len + + def train_batch(self, batch_data, metric_names): + loss_func = CrossEntropyLoss(ignore_index=self.dataset.tokens["pad"]) + + sum_loss = 0 + x = batch_data["imgs"].to(self.device) + y = batch_data["labels"].to(self.device) + reduced_size = [s[:2] for s in batch_data["imgs_reduced_shape"]] + y_len = batch_data["labels_len"] + + # add errors in teacher forcing + if ( + "teacher_forcing_error_rate" in self.params["training_params"] + and self.params["training_params"]["teacher_forcing_error_rate"] is not None + ): + error_rate = self.params["training_params"]["teacher_forcing_error_rate"] + simulated_y_pred, y_len = self.apply_teacher_forcing(y, y_len, error_rate) + elif "teacher_forcing_scheduler" in self.params["training_params"]: + error_rate = ( + self.params["training_params"]["teacher_forcing_scheduler"][ + "min_error_rate" + ] + + min( + self.latest_step, + self.params["training_params"]["teacher_forcing_scheduler"][ + "total_num_steps" + ], + ) + * ( + self.params["training_params"]["teacher_forcing_scheduler"][ + "max_error_rate" + ] + - self.params["training_params"]["teacher_forcing_scheduler"][ + "min_error_rate" + ] + ) + / self.params["training_params"]["teacher_forcing_scheduler"][ + "total_num_steps" + ] + ) + simulated_y_pred, y_len = self.apply_teacher_forcing(y, y_len, error_rate) + else: + simulated_y_pred = y + + with autocast(enabled=self.params["training_params"]["use_amp"]): + hidden_predict = None + cache = None + + raw_features = self.models["encoder"](x) + features_size = raw_features.size() + b, c, h, w = features_size + + pos_features = self.models["decoder"].features_updater.get_pos_features( + raw_features + ) + features = torch.flatten(pos_features, start_dim=2, end_dim=3).permute( + 2, 0, 1 + ) + enhanced_features = pos_features + enhanced_features = torch.flatten( + enhanced_features, start_dim=2, end_dim=3 + ).permute(2, 0, 1) + output, pred, hidden_predict, cache, weights = self.models["decoder"]( + features, + enhanced_features, + simulated_y_pred[:, :-1], + reduced_size, + [max(y_len) for _ in range(b)], + features_size, + start=0, + hidden_predict=hidden_predict, + cache=cache, + keep_all_weights=True, + ) + + loss_ce = loss_func(pred, y[:, 1:]) + sum_loss += loss_ce + with autocast(enabled=False): + self.backward_loss(sum_loss) + self.step_optimizers() + self.zero_optimizers() + predicted_tokens = torch.argmax(pred, dim=1).detach().cpu().numpy() + predicted_tokens = [predicted_tokens[i, : y_len[i]] for i in range(b)] + str_x = [ + LM_ind_to_str(self.dataset.charset, t, oov_symbol="") + for t in predicted_tokens + ] + + values = { + "nb_samples": b, + "str_y": batch_data["raw_labels"], + "str_x": str_x, + "loss": sum_loss.item(), + "loss_ce": loss_ce.item(), + "syn_max_lines": self.dataset.train_dataset.get_syn_max_lines() + if self.params["dataset_params"]["config"]["synthetic_data"] + else 0, + } + + return values + + def evaluate_batch(self, batch_data, metric_names): + x = batch_data["imgs"].to(self.device) + reduced_size = [s[:2] for s in batch_data["imgs_reduced_shape"]] + + max_chars = self.params["training_params"]["max_char_prediction"] + + start_time = time() + with autocast(enabled=self.params["training_params"]["use_amp"]): + b = x.size(0) + reached_end = torch.zeros((b,), dtype=torch.bool, device=self.device) + prediction_len = torch.zeros((b,), dtype=torch.int, device=self.device) + predicted_tokens = ( + torch.ones((b, 1), dtype=torch.long, device=self.device) + * self.dataset.tokens["start"] + ) + predicted_tokens_len = torch.ones((b,), dtype=torch.int, device=self.device) + + whole_output = list() + confidence_scores = list() + cache = None + hidden_predict = None + if b > 1: + features_list = list() + for i in range(b): + pos = batch_data["imgs_position"] + features_list.append( + self.models["encoder"]( + x[ + i : i + 1, + :, + pos[i][0][0] : pos[i][0][1], + pos[i][1][0] : pos[i][1][1], + ] + ) + ) + max_height = max([f.size(2) for f in features_list]) + max_width = max([f.size(3) for f in features_list]) + features = torch.zeros( + (b, features_list[0].size(1), max_height, max_width), + device=self.device, + dtype=features_list[0].dtype, + ) + for i in range(b): + features[ + i, :, : features_list[i].size(2), : features_list[i].size(3) + ] = features_list[i] + else: + features = self.models["encoder"](x) + features_size = features.size() + coverage_vector = torch.zeros( + (features.size(0), 1, features.size(2), features.size(3)), + device=self.device, + ) + pos_features = self.models["decoder"].features_updater.get_pos_features( + features + ) + features = torch.flatten(pos_features, start_dim=2, end_dim=3).permute( + 2, 0, 1 + ) + enhanced_features = pos_features + enhanced_features = torch.flatten( + enhanced_features, start_dim=2, end_dim=3 + ).permute(2, 0, 1) + + for i in range(0, max_chars): + output, pred, hidden_predict, cache, weights = self.models["decoder"]( + features, + enhanced_features, + predicted_tokens, + reduced_size, + predicted_tokens_len, + features_size, + start=0, + hidden_predict=hidden_predict, + cache=cache, + num_pred=1, + ) + whole_output.append(output) + confidence_scores.append( + torch.max(torch.softmax(pred[:, :], dim=1), dim=1).values + ) + coverage_vector = torch.clamp(coverage_vector + weights, 0, 1) + predicted_tokens = torch.cat( + [ + predicted_tokens, + torch.argmax(pred[:, :, -1], dim=1, keepdim=True), + ], + dim=1, + ) + reached_end = torch.logical_or( + reached_end, + torch.eq(predicted_tokens[:, -1], self.dataset.tokens["end"]), + ) + predicted_tokens_len += 1 + + prediction_len[reached_end is False] = i + 1 + if torch.all(reached_end): + break + + confidence_scores = ( + torch.cat(confidence_scores, dim=1).cpu().detach().numpy() + ) + predicted_tokens = predicted_tokens[:, 1:] + prediction_len[torch.eq(reached_end, False)] = max_chars - 1 + predicted_tokens = [ + predicted_tokens[i, : prediction_len[i]] for i in range(b) + ] + confidence_scores = [ + confidence_scores[i, : prediction_len[i]].tolist() for i in range(b) + ] + str_x = [ + LM_ind_to_str(self.dataset.charset, t, oov_symbol="") + for t in predicted_tokens + ] + + process_time = time() - start_time + + values = { + "nb_samples": b, + "str_y": batch_data["raw_labels"], + "str_x": str_x, + "confidence_score": confidence_scores, + "time": process_time, + } + return values diff --git a/dan/manager/utils.py b/dan/manager/utils.py new file mode 100644 index 00000000..c95ca7ca --- /dev/null +++ b/dan/manager/utils.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +import os +import pickle + +from PIL import Image + +from dan.manager.training import GenericTrainingManager + + +class OCRManager(GenericTrainingManager): + def __init__(self, params): + super(OCRManager, self).__init__(params) + self.params["model_params"]["vocab_size"] = len(self.dataset.charset) + + def generate_syn_line_dataset(self, name): + """ + Generate synthetic line dataset from currently loaded dataset + """ + dataset_name = list(self.params["dataset_params"]["datasets"].keys())[0] + path = os.path.join( + os.path.dirname(self.params["dataset_params"]["datasets"][dataset_name]), + name, + ) + os.makedirs(path, exist_ok=True) + charset = set() + dataset = None + gt = {"train": dict(), "valid": dict(), "test": dict()} + for set_name in ["train", "valid", "test"]: + set_path = os.path.join(path, set_name) + os.makedirs(set_path, exist_ok=True) + if set_name == "train": + dataset = self.dataset.train_dataset + elif set_name == "valid": + dataset = self.dataset.valid_datasets["{}-valid".format(dataset_name)] + elif set_name == "test": + self.dataset.generate_test_loader( + "{}-test".format(dataset_name), + [ + (dataset_name, "test"), + ], + ) + dataset = self.dataset.test_datasets["{}-test".format(dataset_name)] + + samples = list() + for sample in dataset.samples: + for line_label in sample["label"].split("\n"): + for chunk in [ + line_label[i : i + 100] for i in range(0, len(line_label), 100) + ]: + charset = charset.union(set(chunk)) + if len(chunk) > 0: + samples.append( + { + "path": sample["path"], + "label": chunk, + "nb_cols": 1, + } + ) + + for i, sample in enumerate(samples): + ext = sample["path"].split(".")[-1] + img_name = "{}_{}.{}".format(set_name, i, ext) + img_path = os.path.join(set_path, img_name) + + img = dataset.generate_typed_text_line_image(sample["label"]) + Image.fromarray(img).save(img_path) + gt[set_name][img_name] = { + "text": sample["label"], + "nb_cols": sample["nb_cols"] if "nb_cols" in sample else 1, + } + if "line_label" in sample: + gt[set_name][img_name]["lines"] = sample["line_label"] + + with open(os.path.join(path, "labels.pkl"), "wb") as f: + pickle.dump( + { + "ground_truth": gt, + "charset": sorted(list(charset)), + }, + f, + ) diff --git a/dan/models.py b/dan/models.py index 225d004c..6057cadd 100644 --- a/dan/models.py +++ b/dan/models.py @@ -1,39 +1,4 @@ # -*- coding: utf-8 -*- -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in XXX whose purpose is XXX. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - - import random from torch.nn import ( diff --git a/dan/ocr/__init__.py b/dan/ocr/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/ocr/document/__init__.py b/dan/ocr/document/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/ocr/document/train.py b/dan/ocr/document/train.py new file mode 100644 index 00000000..1f8216a9 --- /dev/null +++ b/dan/ocr/document/train.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +import random + +import numpy as np +import torch +import torch.multiprocessing as mp +from torch.optim import Adam + +from dan.decoder import GlobalHTADecoder +from dan.manager.ocr import OCRDataset, OCRDatasetManager +from dan.manager.training import Manager +from dan.models import FCN_Encoder +from dan.schedulers import exponential_dropout_scheduler +from dan.transforms import aug_config + + +def add_document_parser(subcommands) -> None: + parser = subcommands.add_parser( + "document", + description=__doc__, + ) + parser.set_defaults(func=run) + + +def train_and_test(rank, params): + torch.manual_seed(0) + torch.cuda.manual_seed(0) + np.random.seed(0) + random.seed(0) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + params["training_params"]["ddp_rank"] = rank + model = Manager(params) + model.load_model() + + model.train() + + # load weights giving best CER on valid set + model.params["training_params"]["load_epoch"] = "best" + model.load_model() + + metrics = ["cer", "wer", "time", "map_cer", "loer"] + for dataset_name in params["dataset_params"]["datasets"].keys(): + for set_name in ["test", "valid", "train"]: + model.predict( + "{}-{}".format(dataset_name, set_name), + [ + (dataset_name, set_name), + ], + metrics, + output=True, + ) + + +def run(): + dataset_name = "simara" + dataset_level = "page" + dataset_variant = "_sem" + + params = { + "dataset_params": { + "dataset_manager": OCRDatasetManager, + "dataset_class": OCRDataset, + "datasets": { + dataset_name: "../../../Datasets/formatted/{}_{}{}".format( + dataset_name, dataset_level, dataset_variant + ), + }, + "train": { + "name": "{}-train".format(dataset_name), + "datasets": [ + (dataset_name, "train"), + ], + }, + "valid": { + "{}-valid".format(dataset_name): [ + (dataset_name, "valid"), + ], + }, + "config": { + "load_in_memory": True, # Load all images in CPU memory + "worker_per_gpu": 4, # Num of parallel processes per gpu for data loading + "width_divisor": 8, # Image width will be divided by 8 + "height_divisor": 32, # Image height will be divided by 32 + "padding_value": 0, # Image padding value + "padding_token": None, # Label padding value + "charset_mode": "seq2seq", # add end-of-transcription and start-of-transcription tokens to charset + "constraints": [ + "add_eot", + "add_sot", + ], # add end-of-transcription and start-of-transcription tokens in labels + "normalize": True, # Normalize with mean and variance of training dataset + "preprocessings": [ + { + "type": "to_RGB", + # if grayscaled image, produce RGB one (3 channels with same value) otherwise do nothing + }, + ], + "augmentation": aug_config(0.9, 0.1), + "synthetic_data": None, + # "synthetic_data": { + # "init_proba": 0.9, # begin proba to generate synthetic document + # "end_proba": 0.2, # end proba to generate synthetic document + # "num_steps_proba": 200000, # linearly decrease the percent of synthetic document from 90% to 20% through 200000 samples + # "proba_scheduler_function": linear_scheduler, # decrease proba rate linearly + # "start_scheduler_at_max_line": True, # start decreasing proba only after curriculum reach max number of lines + # "dataset_level": dataset_level, + # "curriculum": True, # use curriculum learning (slowly increase number of lines per synthetic samples) + # "crop_curriculum": True, # during curriculum learning, crop images under the last text line + # "curr_start": 0, # start curriculum at iteration + # "curr_step": 10000, # interval to increase the number of lines for curriculum learning + # "min_nb_lines": 1, # initial number of lines for curriculum learning + # "max_nb_lines": max_nb_lines[dataset_name], # maximum number of lines for curriculum learning + # "padding_value": 255, + # # config for synthetic line generation + # "config": { + # "background_color_default": (255, 255, 255), + # "background_color_eps": 15, + # "text_color_default": (0, 0, 0), + # "text_color_eps": 15, + # "font_size_min": 35, + # "font_size_max": 45, + # "color_mode": "RGB", + # "padding_left_ratio_min": 0.00, + # "padding_left_ratio_max": 0.05, + # "padding_right_ratio_min": 0.02, + # "padding_right_ratio_max": 0.2, + # "padding_top_ratio_min": 0.02, + # "padding_top_ratio_max": 0.1, + # "padding_bottom_ratio_min": 0.02, + # "padding_bottom_ratio_max": 0.1, + # }, + # } + }, + }, + "model_params": { + "models": { + "encoder": FCN_Encoder, + "decoder": GlobalHTADecoder, + }, + # "transfer_learning": None, + "transfer_learning": { + # model_name: [state_dict_name, checkpoint_path, learnable, strict] + "encoder": ["encoder", "dan_rimes_page.pt", True, True], + "decoder": ["decoder", "dan_rimes_page.pt", True, False], + }, + "transfered_charset": True, # Transfer learning of the decision layer based on charset of the line HTR model + "additional_tokens": 1, # for decision layer = [<eot>, ], only for transferred charset + "input_channels": 3, # number of channels of input image + "dropout": 0.5, # dropout rate for encoder + "enc_dim": 256, # dimension of extracted features + "nb_layers": 5, # encoder + "h_max": 500, # maximum height for encoder output (for 2D positional embedding) + "w_max": 1000, # maximum width for encoder output (for 2D positional embedding) + "l_max": 15000, # max predicted sequence (for 1D positional embedding) + "dec_num_layers": 8, # number of transformer decoder layers + "dec_num_heads": 4, # number of heads in transformer decoder layers + "dec_res_dropout": 0.1, # dropout in transformer decoder layers + "dec_pred_dropout": 0.1, # dropout rate before decision layer + "dec_att_dropout": 0.1, # dropout rate in multi head attention + "dec_dim_feedforward": 256, # number of dimension for feedforward layer in transformer decoder layers + "use_2d_pe": True, # use 2D positional embedding + "use_1d_pe": True, # use 1D positional embedding + "use_lstm": False, + "attention_win": 100, # length of attention window + # Curriculum dropout + "dropout_scheduler": { + "function": exponential_dropout_scheduler, + "T": 5e4, + }, + }, + "training_params": { + "output_folder": "dan_simara_page", # folder name for checkpoint and results + "max_nb_epochs": 50000, # maximum number of epochs before to stop + "max_training_time": 3600 + * 24 + * 1.9, # maximum time before to stop (in seconds) + "load_epoch": "last", # ["best", "last"]: last to continue training, best to evaluate + "interval_save_weights": None, # None: keep best and last only + "batch_size": 2, # mini-batch size for training + "valid_batch_size": 4, # mini-batch size for valdiation + "use_ddp": False, # Use DistributedDataParallel + "ddp_port": "20027", + "use_amp": True, # Enable automatic mix-precision + "nb_gpu": torch.cuda.device_count(), + "optimizers": { + "all": { + "class": Adam, + "args": { + "lr": 0.0001, + "amsgrad": False, + }, + }, + }, + "lr_schedulers": None, # Learning rate schedulers + "eval_on_valid": True, # Whether to eval and logs metrics on validation set during training or not + "eval_on_valid_interval": 5, # Interval (in epochs) to evaluate during training + "focus_metric": "cer", # Metrics to focus on to determine best epoch + "expected_metric_value": "low", # ["high", "low"] What is best for the focus metric value + "set_name_focus_metric": "{}-valid".format( + dataset_name + ), # Which dataset to focus on to select best weights + "train_metrics": [ + "loss_ce", + "cer", + "wer", + "syn_max_lines", + ], # Metrics name for training + "eval_metrics": [ + "cer", + "wer", + "map_cer", + ], # Metrics name for evaluation on validation set during training + "force_cpu": False, # True for debug purposes + "max_char_prediction": 1000, # max number of token prediction + # Keep teacher forcing rate to 20% during whole training + "teacher_forcing_scheduler": { + "min_error_rate": 0.2, + "max_error_rate": 0.2, + "total_num_steps": 5e4, + }, + }, + } + + if ( + params["training_params"]["use_ddp"] + and not params["training_params"]["force_cpu"] + ): + mp.spawn( + train_and_test, args=(params,), nprocs=params["training_params"]["nb_gpu"] + ) + else: + train_and_test(0, params) diff --git a/dan/ocr/line/__init__.py b/dan/ocr/line/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dan/ocr/line/generate_synthetic.py b/dan/ocr/line/generate_synthetic.py new file mode 100644 index 00000000..435e19ed --- /dev/null +++ b/dan/ocr/line/generate_synthetic.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +import random + +import numpy as np +import torch +import torch.multiprocessing as mp +from torch.optim import Adam + +from dan.manager.ocr import OCRDataset, OCRDatasetManager +from dan.models import FCN_Encoder +from dan.ocr.line.model_utils import Decoder +from dan.ocr.line.utils import TrainerLineCTC +from dan.schedulers import exponential_dropout_scheduler, exponential_scheduler +from dan.transforms import line_aug_config + + +def add_generate_parser(subcommands) -> None: + parser = subcommands.add_parser( + "generate", + description=__doc__, + ) + parser.set_defaults(func=run) + + +def train_and_test(rank, params): + torch.manual_seed(0) + torch.cuda.manual_seed(0) + np.random.seed(0) + random.seed(0) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + params["training_params"]["ddp_rank"] = rank + model = TrainerLineCTC(params) + + model.generate_syn_line_dataset( + "READ_2016_syn_line" + ) # ["RIMES_syn_line", "READ_2016_syn_line"] + + +def run(): + dataset_name = "READ_2016" + dataset_level = "page" + params = { + "dataset_params": { + "dataset_manager": OCRDatasetManager, + "dataset_class": OCRDataset, + "datasets": { + dataset_name: "../../../Datasets/formatted/{}_{}".format( + dataset_name, dataset_level + ), + }, + "train": { + "name": "{}-train".format(dataset_name), + "datasets": [ + (dataset_name, "train"), + ], + }, + "valid": { + "{}-valid".format(dataset_name): [ + (dataset_name, "valid"), + ], + }, + "config": { + "load_in_memory": False, # Load all images in CPU memory + "worker_per_gpu": 4, + "width_divisor": 8, # Image width will be divided by 8 + "height_divisor": 32, # Image height will be divided by 32 + "padding_value": 0, # Image padding value + "padding_token": 1000, # Label padding value (None: default value is chosen) + "padding_mode": "br", # Padding at bottom and right + "charset_mode": "CTC", # add blank token + "constraints": [], # Padding for CTC requirements if necessary + "normalize": True, # Normalize with mean and variance of training dataset + "preprocessings": [], + # Augmentation techniques to use at training time + "augmentation": line_aug_config(0.9, 0.1), + # + "synthetic_data": { + "mode": "line_hw_to_printed", + "init_proba": 1, + "end_proba": 1, + "num_steps_proba": 1e5, + "proba_scheduler_function": exponential_scheduler, + "config": { + "background_color_default": (255, 255, 255), + "background_color_eps": 15, + "text_color_default": (0, 0, 0), + "text_color_eps": 15, + "font_size_min": 30, + "font_size_max": 50, + "color_mode": "RGB", + "padding_left_ratio_min": 0.02, + "padding_left_ratio_max": 0.1, + "padding_right_ratio_min": 0.02, + "padding_right_ratio_max": 0.1, + "padding_top_ratio_min": 0.02, + "padding_top_ratio_max": 0.2, + "padding_bottom_ratio_min": 0.02, + "padding_bottom_ratio_max": 0.2, + }, + }, + }, + }, + "model_params": { + # Model classes to use for each module + "models": { + "encoder": FCN_Encoder, + "decoder": Decoder, + }, + "transfer_learning": None, + "input_channels": 3, # 1 for grayscale images, 3 for RGB ones (or grayscale as RGB) + "enc_size": 256, + "dropout_scheduler": { + "function": exponential_dropout_scheduler, + "T": 5e4, + }, + "dropout": 0.5, + }, + "training_params": { + "output_folder": "FCN_Encoder_read_syn_line_all_pad_max_cursive", # folder names for logs and weights + "max_nb_epochs": 10000, # max number of epochs for the training + "max_training_time": 3600 + * 24 + * 1.9, # max training time limit (in seconds) + "load_epoch": "last", # ["best", "last"], to load weights from best epoch or last trained epoch + "interval_save_weights": None, # None: keep best and last only + "use_ddp": False, # Use DistributedDataParallel + "use_amp": True, # Enable automatic mix-precision + "nb_gpu": torch.cuda.device_count(), + "batch_size": 1, # mini-batch size per GPU + "optimizers": { + "all": { + "class": Adam, + "args": { + "lr": 0.0001, + "amsgrad": False, + }, + } + }, + "lr_schedulers": None, + "eval_on_valid": True, # Whether to eval and logs metrics on validation set during training or not + "eval_on_valid_interval": 2, # Interval (in epochs) to evaluate during training + "focus_metric": "cer", # Metrics to focus on to determine best epoch + "expected_metric_value": "low", # ["high", "low"] What is best for the focus metric value + "set_name_focus_metric": "{}-valid".format(dataset_name), + "train_metrics": ["loss_ctc", "cer", "wer"], # Metrics name for training + "eval_metrics": [ + "loss_ctc", + "cer", + "wer", + ], # Metrics name for evaluation on validation set during training + "force_cpu": False, # True for debug purposes to run on cpu only + }, + } + + if ( + params["training_params"]["use_ddp"] + and not params["training_params"]["force_cpu"] + ): + mp.spawn( + train_and_test, args=(params,), nprocs=params["training_params"]["nb_gpu"] + ) + else: + train_and_test(0, params) diff --git a/dan/ocr/line/model_utils.py b/dan/ocr/line/model_utils.py new file mode 100644 index 00000000..9417e800 --- /dev/null +++ b/dan/ocr/line/model_utils.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from torch.nn import AdaptiveMaxPool2d, Conv1d, Module +from torch.nn.functional import log_softmax + + +class Decoder(Module): + def __init__(self, params): + super(Decoder, self).__init__() + + self.vocab_size = params["vocab_size"] + + self.ada_pool = AdaptiveMaxPool2d((1, None)) + self.end_conv = Conv1d( + in_channels=params["enc_size"], + out_channels=self.vocab_size + 1, + kernel_size=1, + ) + + def forward(self, x): + x = self.ada_pool(x).squeeze(2) + x = self.end_conv(x) + return log_softmax(x, dim=1) diff --git a/dan/ocr/line/train.py b/dan/ocr/line/train.py new file mode 100644 index 00000000..9e092fd9 --- /dev/null +++ b/dan/ocr/line/train.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +import random + +import numpy as np +import torch +import torch.multiprocessing as mp +from torch.optim import Adam + +from dan.manager.ocr import OCRDataset, OCRDatasetManager +from dan.models import FCN_Encoder +from dan.ocr.line.model_utils import Decoder +from dan.ocr.line.utils import TrainerLineCTC +from dan.schedulers import exponential_dropout_scheduler, exponential_scheduler +from dan.transforms import line_aug_config + + +def add_line_parser(subcommands) -> None: + parser = subcommands.add_parser( + "line", + description=__doc__, + ) + parser.set_defaults(func=run) + + +def train_and_test(rank, params): + torch.manual_seed(0) + torch.cuda.manual_seed(0) + np.random.seed(0) + random.seed(0) + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + params["training_params"]["ddp_rank"] = rank + model = TrainerLineCTC(params) + model.load_model() + + # Model trains until max_time_training or max_nb_epochs is reached + model.train() + + # load weights giving best CER on valid set + model.params["training_params"]["load_epoch"] = "best" + model.load_model() + + # compute metrics on train, valid and test sets (in eval conditions) + metrics = [ + "cer", + "wer", + "time", + ] + for dataset_name in params["dataset_params"]["datasets"].keys(): + for set_name in [ + "test", + "valid", + "train", + ]: + model.predict( + "{}-{}".format(dataset_name, set_name), + [ + (dataset_name, set_name), + ], + metrics, + output=True, + ) + + +def run(): + dataset_name = "READ_2016" # ["RIMES", "READ_2016"] + dataset_level = "syn_line" + params = { + "dataset_params": { + "dataset_manager": OCRDatasetManager, + "dataset_class": OCRDataset, + "datasets": { + dataset_name: "../../../Datasets/formatted/{}_{}".format( + dataset_name, dataset_level + ), + }, + "train": { + "name": "{}-train".format(dataset_name), + "datasets": [ + (dataset_name, "train"), + ], + }, + "valid": { + "{}-valid".format(dataset_name): [ + (dataset_name, "valid"), + ], + }, + "config": { + "load_in_memory": True, # Load all images in CPU memory + "worker_per_gpu": 8, # Num of parallel processes per gpu for data loading + "width_divisor": 8, # Image width will be divided by 8 + "height_divisor": 32, # Image height will be divided by 32 + "padding_value": 0, # Image padding value + "padding_token": 1000, # Label padding value (None: default value is chosen) + "padding_mode": "br", # Padding at bottom and right + "charset_mode": "CTC", # add blank token + "constraints": [ + "CTC_line", + ], # Padding for CTC requirements if necessary + "normalize": True, # Normalize with mean and variance of training dataset + "padding": { + "min_height": "max", # Pad to reach max height of training samples + "min_width": "max", # Pad to reach max width of training samples + "min_pad": None, + "max_pad": None, + "mode": "br", # Padding at bottom and right + "train_only": False, # Add padding at training time and evaluation time + }, + "preprocessings": [ + { + "type": "to_RGB", + # if grayscale image, produce RGB one (3 channels with same value) otherwise do nothing + }, + ], + # Augmentation techniques to use at training time + "augmentation": line_aug_config(0.9, 0.1), + # + "synthetic_data": { + "mode": "line_hw_to_printed", + "init_proba": 1, + "end_proba": 1, + "num_steps_proba": 1e5, + "probadocument_scheduler_function": exponential_scheduler, + "config": { + "background_color_default": (255, 255, 255), + "background_color_eps": 15, + "text_color_default": (0, 0, 0), + "text_color_eps": 15, + "font_size_min": 30, + "font_size_max": 50, + "color_mode": "RGB", + "padding_left_ratio_min": 0.02, + "padding_left_ratio_max": 0.1, + "padding_right_ratio_min": 0.02, + "padding_right_ratio_max": 0.1, + "padding_top_ratio_min": 0.02, + "padding_top_ratio_max": 0.2, + "padding_bottom_ratio_min": 0.02, + "padding_bottom_ratio_max": 0.2, + }, + }, + }, + }, + "model_params": { + # Model classes to use for each module + "models": { + "encoder": FCN_Encoder, + "decoder": Decoder, + }, + "transfer_learning": None, + "input_channels": 3, # 1 for grayscale images, 3 for RGB ones (or grayscale as RGB) + "enc_size": 256, + "dropout_scheduler": { + "function": exponential_dropout_scheduler, + "T": 5e4, + }, + "dropout": 0.5, + }, + "training_params": { + "output_folder": "FCN_read_2016_line_syn", # folder names for logs and weights + "max_nb_epochs": 10000, # max number of epochs for the training + "max_training_time": 3600 + * 24 + * 1.9, # max training time limit (in seconds) + "load_epoch": "last", # ["best", "last"], to load weights from best epoch or last trained epoch + "interval_save_weights": None, # None: keep best and last only + "use_ddp": False, # Use DistributedDataParallel + "use_amp": True, # Enable automatic mix-precision + "nb_gpu": torch.cuda.device_count(), + "batch_size": 16, # mini-batch size per GPU + "optimizers": { + "all": { + "class": Adam, + "args": { + "lr": 0.0001, + "amsgrad": False, + }, + } + }, + "lr_schedulers": None, # Learning rate schedulers + "eval_on_valid": True, # Whether to eval and logs metrics on validation set during training or not + "eval_on_valid_interval": 2, # Interval (in epochs) to evaluate during training + "focus_metric": "cer", # Metrics to focus on to determine best epoch + "expected_metric_value": "low", # ["high", "low"] What is best for the focus metric value + "set_name_focus_metric": "{}-valid".format( + dataset_name + ), # Which dataset to focus on to select best weights + "train_metrics": ["loss_ctc", "cer", "wer"], # Metrics name for training + "eval_metrics": [ + "loss_ctc", + "cer", + "wer", + ], # Metrics name for evaluation on validation set during training + "force_cpu": False, # True for debug purposes to run on cpu only + }, + } + + if ( + params["training_params"]["use_ddp"] + and not params["training_params"]["force_cpu"] + ): + mp.spawn( + train_and_test, args=(params,), nprocs=params["training_params"]["nb_gpu"] + ) + else: + train_and_test(0, params) diff --git a/dan/ocr/line/utils.py b/dan/ocr/line/utils.py new file mode 100644 index 00000000..01ed68be --- /dev/null +++ b/dan/ocr/line/utils.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +import re +import time + +import torch +from torch.cuda.amp import autocast +from torch.nn import CTCLoss + +from dan.manager.training import OCRManager +from dan.ocr.utils import LM_ind_to_str + + +class TrainerLineCTC(OCRManager): + def __init__(self, params): + super(TrainerLineCTC, self).__init__(params) + + def train_batch(self, batch_data, metric_names): + """ + Forward and backward pass for training + """ + x = batch_data["imgs"].to(self.device) + y = batch_data["labels"].to(self.device) + x_reduced_len = [s[1] for s in batch_data["imgs_reduced_shape"]] + y_len = batch_data["labels_len"] + + loss_ctc = CTCLoss(blank=self.dataset.tokens["blank"]) + self.zero_optimizers() + + with autocast(enabled=self.params["training_params"]["use_amp"]): + x = self.models["encoder"](x) + global_pred = self.models["decoder"](x) + + loss = loss_ctc(global_pred.permute(2, 0, 1), y, x_reduced_len, y_len) + + self.backward_loss(loss) + + self.step_optimizers() + pred = torch.argmax(global_pred, dim=1).cpu().numpy() + + values = { + "nb_samples": len(batch_data["raw_labels"]), + "loss_ctc": loss.item(), + "str_x": self.pred_to_str(pred, x_reduced_len), + "str_y": batch_data["raw_labels"], + } + + return values + + def evaluate_batch(self, batch_data, metric_names): + """ + Forward pass only for validation and test + """ + x = batch_data["imgs"].to(self.device) + y = batch_data["labels"].to(self.device) + x_reduced_len = [s[1] for s in batch_data["imgs_reduced_shape"]] + y_len = batch_data["labels_len"] + + loss_ctc = CTCLoss(blank=self.dataset.tokens["blank"]) + + start_time = time.time() + with autocast(enabled=self.params["training_params"]["use_amp"]): + x = self.models["encoder"](x) + global_pred = self.models["decoder"](x) + + loss = loss_ctc(global_pred.permute(2, 0, 1), y, x_reduced_len, y_len) + pred = torch.argmax(global_pred, dim=1).cpu().numpy() + str_x = self.pred_to_str(pred, x_reduced_len) + + process_time = time.time() - start_time + + values = { + "nb_samples": len(batch_data["raw_labels"]), + "loss_ctc": loss.item(), + "str_x": str_x, + "str_y": batch_data["raw_labels"], + "time": process_time, + } + return values + + def ctc_remove_successives_identical_ind(self, ind): + res = [] + for i in ind: + if res and res[-1] == i: + continue + res.append(i) + return res + + def pred_to_str(self, pred, pred_len): + """ + convert prediction tokens to string + """ + ind_x = [pred[i][: pred_len[i]] for i in range(pred.shape[0])] + ind_x = [self.ctc_remove_successives_identical_ind(t) for t in ind_x] + str_x = [LM_ind_to_str(self.dataset.charset, t, oov_symbol="") for t in ind_x] + str_x = [re.sub("( )+", " ", t).strip(" ") for t in str_x] + return str_x diff --git a/dan/ocr/train.py b/dan/ocr/train.py new file mode 100644 index 00000000..1bcbe1c7 --- /dev/null +++ b/dan/ocr/train.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from dan.ocr.line.train import add_line_parser +from dan.ocr.document.train import add_document_parser + +def add_train_parser(subcommands) -> None: + parser = subcommands.add_parser( + "train", + description=__doc__, + ) + subcommands = parser.add_subparsers(metavar="subcommand") + + add_line_parser(subcommands) + add_document_parser(subcommands) diff --git a/dan/ocr/utils.py b/dan/ocr/utils.py new file mode 100644 index 00000000..8038f6f9 --- /dev/null +++ b/dan/ocr/utils.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Charset / labels conversion +def LM_str_to_ind(labels, str): + return [labels.index(c) for c in str] + + +def LM_ind_to_str(labels, ind, oov_symbol=None): + if oov_symbol is not None: + res = [] + for i in ind: + if i < len(labels): + res.append(labels[i]) + else: + res.append(oov_symbol) + else: + res = [labels[i] for i in ind] + return "".join(res) diff --git a/dan/ocr_utils.py b/dan/ocr_utils.py deleted file mode 100644 index 4685f66f..00000000 --- a/dan/ocr_utils.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - - -# Charset / labels conversion -def LM_str_to_ind(labels, str): - return [labels.index(c) for c in str] - - -def LM_ind_to_str(labels, ind, oov_symbol=None): - if oov_symbol is not None: - res = [] - for i in ind: - if i < len(labels): - res.append(labels[i]) - else: - res.append(oov_symbol) - else: - res = [labels[i] for i in ind] - return "".join(res) diff --git a/dan/post_processing.py b/dan/post_processing.py index 3b456ba5..1242959c 100644 --- a/dan/post_processing.py +++ b/dan/post_processing.py @@ -1,50 +1,7 @@ # -*- coding: utf-8 -*- -# Copyright Université de Rouen Normandie (1), INSA Rouen (2), -# tutelles du laboratoire LITIS (1 et 2) -# contributors : -# - Denis Coquenet -# -# -# This software is a computer program written in Python whose purpose is to -# provide public implementation of deep learning works, in pytorch. -# -# This software is governed by the CeCILL-C license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/ or redistribute the software under the terms of the CeCILL-C -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL-C license and that you accept its terms. - import numpy as np -from Datasets.dataset_formatters.read2016_formatter import ( - SEM_MATCHING_TOKENS as READ_MATCHING_TOKENS, -) -from Datasets.dataset_formatters.rimes_formatter import ( - SEM_MATCHING_TOKENS as RIMES_MATCHING_TOKENS, -) -from Datasets.dataset_formatters.simara_formatter import ( - SEM_MATCHING_TOKENS as SIMARA_MATCHING_TOKENS, -) +from dan.datasets.format.simara import SEM_MATCHING_TOKENS as SIMARA_MATCHING_TOKENS class PostProcessingModule: @@ -94,193 +51,6 @@ class PostProcessingModule: self.num_op += 1 -class PostProcessingModuleREAD(PostProcessingModule): - """ - Specific post-processing for the READ 2016 dataset at single-page and double-page levels - """ - - def __init__(self): - super(PostProcessingModuleREAD, self).__init__() - - self.matching_tokens = READ_MATCHING_TOKENS - self.reverse_matching_tokens = dict() - for key in self.matching_tokens: - self.reverse_matching_tokens[self.matching_tokens[key]] = key - - def post_processing_page_labels(self): - """ - Correct tokens of page detection. - """ - ind = 0 - while ind != len(self.prediction): - # Label must start with a begin-page token - if ind == 0 and self.prediction[ind] != "ⓟ": - self.insert_label(0, "ⓟ") - continue - # There cannot be tokens out of begin-page end-page scope: begin-page must be preceded by end-page - if ( - self.prediction[ind] == "ⓟ" - and ind != 0 - and self.prediction[ind - 1] != "â“…" - ): - self.insert_label(ind, "â“…") - continue - # There cannot be tokens out of begin-page end-page scope: end-page must be followed by begin-page - if ( - self.prediction[ind] == "â“…" - and ind < len(self.prediction) - 1 - and self.prediction[ind + 1] != "ⓟ" - ): - self.insert_label(ind + 1, "ⓟ") - ind += 1 - # Label must start with a begin-page token even for empty prediction - if len(self.prediction) == 0: - self.insert_label(0, "ⓟ") - ind += 1 - # Label must end with a end-page token - if self.prediction[-1] != "â“…": - self.insert_label(ind, "â“…") - - def post_processing(self): - """ - Correct tokens of page number, section, body and annotations. - """ - self.post_processing_page_labels() - ind = 0 - begin_token = None - in_section = False - while ind != len(self.prediction): - # each tags must be closed while changing page - if self.prediction[ind] == "â“…": - if begin_token is not None: - self.insert_label(ind, self.matching_tokens[begin_token]) - begin_token = None - ind += 1 - elif in_section: - self.insert_label(ind, self.matching_tokens["â“¢"]) - in_section = False - ind += 1 - else: - ind += 1 - continue - # End token is removed if the previous begin token does not match with it - if self.prediction[ind] in "ⓃⒶⒷ": - if begin_token == self.reverse_matching_tokens[self.prediction[ind]]: - begin_token = None - ind += 1 - else: - self.del_label(ind) - continue - if self.prediction[ind] == "Ⓢ": - # each sub-tags must be closed while closing section - if in_section: - if begin_token is None: - in_section = False - ind += 1 - else: - self.insert_label(ind, self.matching_tokens[begin_token]) - begin_token = None - ind += 2 - else: - self.del_label(ind) - continue - if self.prediction[ind] == "â“¢": - # A sub-tag must be closed before opening a section - if begin_token is not None: - self.insert_label(ind, self.matching_tokens[begin_token]) - begin_token = None - ind += 1 - # A section must be closed before opening a new one - elif in_section: - self.insert_label(ind, "Ⓢ") - in_section = False - ind += 1 - else: - in_section = True - ind += 1 - continue - if self.prediction[ind] == "â“": - # Page number cannot be in section: a started section must be closed - if begin_token is None: - if in_section: - in_section = False - self.insert_label(ind, "Ⓢ") - ind += 1 - begin_token = self.prediction[ind] - ind += 1 - else: - self.insert_label(ind, self.matching_tokens[begin_token]) - begin_token = None - ind += 1 - continue - if self.prediction[ind] in "â“â“‘": - # Annotation and body must be in section - if begin_token is None: - if in_section: - begin_token = self.prediction[ind] - ind += 1 - else: - in_section = True - self.insert_label(ind, "â“¢") - ind += 1 - # Previous sub-tag must be closed - else: - self.insert_label(ind, self.matching_tokens[begin_token]) - begin_token = None - ind += 1 - continue - ind += 1 - res = "".join(self.prediction) - if self.confidence is not None: - return res, np.array(self.confidence) - return res - - -class PostProcessingModuleRIMES(PostProcessingModule): - """ - Specific post-processing for the RIMES dataset at page level - """ - - def __init__(self): - super(PostProcessingModuleRIMES, self).__init__() - self.matching_tokens = RIMES_MATCHING_TOKENS - self.reverse_matching_tokens = dict() - for key in self.matching_tokens: - self.reverse_matching_tokens[self.matching_tokens[key]] = key - - def post_processing(self): - ind = 0 - begin_token = None - while ind != len(self.prediction): - char = self.prediction[ind] - # a tag must be closed before starting a new one - if char in self.matching_tokens.keys(): - if begin_token is None: - ind += 1 - else: - self.insert_label(ind, self.matching_tokens[begin_token]) - ind += 2 - begin_token = char - continue - # an end token without prior corresponding begin token is removed - elif char in self.matching_tokens.values(): - if begin_token == self.reverse_matching_tokens[char]: - ind += 1 - begin_token = None - else: - self.del_label(ind) - continue - else: - ind += 1 - # a tag must be closed - if begin_token is not None: - self.insert_label(ind + 1, self.matching_tokens[begin_token]) - res = "".join(self.prediction) - if self.confidence is not None: - return res, np.array(self.confidence) - return res - - class PostProcessingModuleSIMARA(PostProcessingModule): """ Specific post-processing for the SIMARA dataset at page level diff --git a/dan/predict.py b/dan/predict.py index 4473af17..753e584d 100644 --- a/dan/predict.py +++ b/dan/predict.py @@ -10,7 +10,7 @@ import yaml from dan.decoder import GlobalHTADecoder from dan.models import FCN_Encoder -from dan.ocr_utils import LM_ind_to_str +from dan.ocr.utils import LM_ind_to_str class DAN: diff --git a/dan/schedulers.py b/dan/schedulers.py new file mode 100644 index 00000000..f801804b --- /dev/null +++ b/dan/schedulers.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +import numpy as np +from torch.nn import Dropout, Dropout2d + + +class DropoutScheduler: + def __init__(self, models, function, T=1e5): + """ + T: number of gradient updates to converge + """ + + self.teta_list = list() + self.init_teta_list(models) + self.function = function + self.T = T + self.step_num = 0 + + def step(self, num): + self.step_num += num + + def init_teta_list(self, models): + for model_name in models.keys(): + self.init_teta_list_module(models[model_name]) + + def init_teta_list_module(self, module): + for child in module.children(): + if isinstance(child, Dropout) or isinstance(child, Dropout2d): + self.teta_list.append([child, child.p]) + else: + self.init_teta_list_module(child) + + def update_dropout_rate(self): + for (module, p) in self.teta_list: + module.p = self.function(p, self.step_num, self.T) + + +def exponential_dropout_scheduler(dropout_rate, step, max_step): + return dropout_rate * (1 - np.exp(-10 * step / max_step)) + + +def exponential_scheduler(init_value, end_value, step, max_step): + step = min(step, max_step - 1) + return init_value - (init_value - end_value) * (1 - np.exp(-10 * step / max_step)) + + +def linear_scheduler(init_value, end_value, step, max_step): + return init_value + step * (end_value - init_value) / max_step diff --git a/dan/transforms.py b/dan/transforms.py new file mode 100644 index 00000000..b33489c6 --- /dev/null +++ b/dan/transforms.py @@ -0,0 +1,510 @@ +# -*- coding: utf-8 -*- +""" +Each transform class defined here takes as input a PIL Image and returns the modified PIL Image +""" +import math + +import cv2 +import numpy as np +from cv2 import dilate, erode, normalize +from numpy import random +from PIL import Image, ImageOps +from torchvision.transforms import ( + ColorJitter, + GaussianBlur, + RandomCrop, + RandomPerspective, +) +from torchvision.transforms.functional import InterpolationMode + +from dan.utils import rand, rand_uniform, randint + + +class SignFlipping: + """ + Color inversion + """ + + def __init__(self): + pass + + def __call__(self, x): + return ImageOps.invert(x) + + +class DPIAdjusting: + """ + Resolution modification + """ + + def __init__(self, factor, preserve_ratio): + self.factor = factor + + def __call__(self, x): + w, h = x.size + return x.resize( + (int(np.ceil(w * self.factor)), int(np.ceil(h * self.factor))), + Image.BILINEAR, + ) + + +class Dilation: + """ + OCR: stroke width increasing + """ + + def __init__(self, kernel, iterations): + self.kernel = np.ones(kernel, np.uint8) + self.iterations = iterations + + def __call__(self, x): + return Image.fromarray( + dilate(np.array(x), self.kernel, iterations=self.iterations) + ) + + +class Erosion: + """ + OCR: stroke width decreasing + """ + + def __init__(self, kernel, iterations): + self.kernel = np.ones(kernel, np.uint8) + self.iterations = iterations + + def __call__(self, x): + return Image.fromarray( + erode(np.array(x), self.kernel, iterations=self.iterations) + ) + + +class GaussianNoise: + """ + Add Gaussian Noise + """ + + def __init__(self, std): + self.std = std + + def __call__(self, x): + x_np = np.array(x) + mean, std = np.mean(x_np), np.std(x_np) + std = math.copysign(max(abs(std), 0.000001), std) + min_, max_ = np.min( + x_np, + ), np.max(x_np) + normal_noise = np.random.randn(*x_np.shape) + if ( + len(x_np.shape) == 3 + and x_np.shape[2] == 3 + and np.all(x_np[:, :, 0] == x_np[:, :, 1]) + and np.all(x_np[:, :, 0] == x_np[:, :, 2]) + ): + normal_noise[:, :, 1] = normal_noise[:, :, 2] = normal_noise[:, :, 0] + x_np = ((x_np - mean) / std + normal_noise * self.std) * std + mean + x_np = normalize(x_np, x_np, max_, min_, cv2.NORM_MINMAX) + + return Image.fromarray(x_np.astype(np.uint8)) + + +class Sharpen: + """ + Add Gaussian Noise + """ + + def __init__(self, alpha, strength): + self.alpha = alpha + self.strength = strength + + def __call__(self, x): + x_np = np.array(x) + id_matrix = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]]) + effect_matrix = np.array([[1, 1, 1], [1, -(8 + self.strength), 1], [1, 1, 1]]) + kernel = (1 - self.alpha) * id_matrix - self.alpha * effect_matrix + kernel = np.expand_dims(kernel, axis=2) + kernel = np.concatenate([kernel, kernel, kernel], axis=2) + sharpened = cv2.filter2D(x_np, -1, kernel=kernel[:, :, 0]) + return Image.fromarray(sharpened.astype(np.uint8)) + + +class ZoomRatio: + """ + Crop by ratio + Preserve dimensions if keep_dim = True (= zoom) + """ + + def __init__(self, ratio_h, ratio_w, keep_dim=True): + self.ratio_w = ratio_w + self.ratio_h = ratio_h + self.keep_dim = keep_dim + + def __call__(self, x): + w, h = x.size + x = RandomCrop((int(h * self.ratio_h), int(w * self.ratio_w)))(x) + if self.keep_dim: + x = x.resize((w, h), Image.BILINEAR) + return x + + +class ElasticDistortion: + def __init__(self, kernel_size=(7, 7), sigma=5, alpha=1): + + self.kernel_size = kernel_size + self.sigma = sigma + self.alpha = alpha + + def __call__(self, x): + x_np = np.array(x) + + h, w = x_np.shape[:2] + + dx = np.random.uniform(-1, 1, (h, w)) + dy = np.random.uniform(-1, 1, (h, w)) + + x_gauss = cv2.GaussianBlur(dx, self.kernel_size, self.sigma) + y_gauss = cv2.GaussianBlur(dy, self.kernel_size, self.sigma) + + n = np.sqrt(x_gauss**2 + y_gauss**2) + + nd_x = self.alpha * x_gauss / n + nd_y = self.alpha * y_gauss / n + + ind_y, ind_x = np.indices((h, w), dtype=np.float32) + + map_x = nd_x + ind_x + map_x = map_x.reshape(h, w).astype(np.float32) + map_y = nd_y + ind_y + map_y = map_y.reshape(h, w).astype(np.float32) + + dst = cv2.remap(x_np, map_x, map_y, cv2.INTER_LINEAR) + return Image.fromarray(dst.astype(np.uint8)) + + +class Tightening: + """ + Reduce interline spacing + """ + + def __init__(self, color=255, remove_proba=0.75): + self.color = color + self.remove_proba = remove_proba + + def __call__(self, x): + x_np = np.array(x) + interline_indices = [np.all(line == 255) for line in x_np] + indices_to_removed = np.logical_and( + np.random.choice( + [True, False], + size=len(x_np), + replace=True, + p=[self.remove_proba, 1 - self.remove_proba], + ), + interline_indices, + ) + new_x = x_np[np.logical_not(indices_to_removed)] + return Image.fromarray(new_x.astype(np.uint8)) + + +def get_list_augmenters(img, aug_configs, fill_value): + """ + Randomly select a list of data augmentation techniques to used based on aug_configs + """ + augmenters = list() + for aug_config in aug_configs: + if rand() > aug_config["proba"]: + continue + if aug_config["type"] == "dpi": + valid_factor = False + while not valid_factor: + factor = rand_uniform( + aug_config["min_factor"], aug_config["max_factor"] + ) + valid_factor = not ( + ( + "max_width" in aug_config + and factor * img.size[0] > aug_config["max_width"] + ) + or ( + "max_height" in aug_config + and factor * img.size[1] > aug_config["max_height"] + ) + or ( + "min_width" in aug_config + and factor * img.size[0] < aug_config["min_width"] + ) + or ( + "min_height" in aug_config + and factor * img.size[1] < aug_config["min_height"] + ) + ) + augmenters.append( + DPIAdjusting(factor, preserve_ratio=aug_config["preserve_ratio"]) + ) + + elif aug_config["type"] == "zoom_ratio": + ratio_h = rand_uniform(aug_config["min_ratio_h"], aug_config["max_ratio_h"]) + ratio_w = rand_uniform(aug_config["min_ratio_w"], aug_config["max_ratio_w"]) + augmenters.append( + ZoomRatio( + ratio_h=ratio_h, ratio_w=ratio_w, keep_dim=aug_config["keep_dim"] + ) + ) + + elif aug_config["type"] == "perspective": + scale = rand_uniform(aug_config["min_factor"], aug_config["max_factor"]) + augmenters.append( + RandomPerspective( + distortion_scale=scale, + p=1, + interpolation=InterpolationMode.BILINEAR, + fill=fill_value, + ) + ) + + elif aug_config["type"] == "elastic_distortion": + kernel_size = ( + randint(aug_config["min_kernel_size"], aug_config["max_kernel_size"]) + // 2 + * 2 + + 1 + ) + sigma = rand_uniform(aug_config["min_sigma"], aug_config["max_sigma"]) + alpha = rand_uniform(aug_config["min_alpha"], aug_config["max_alpha"]) + augmenters.append( + ElasticDistortion( + kernel_size=(kernel_size, kernel_size), sigma=sigma, alpha=alpha + ) + ) + + elif aug_config["type"] == "dilation_erosion": + kernel_h = randint(aug_config["min_kernel"], aug_config["max_kernel"] + 1) + kernel_w = randint(aug_config["min_kernel"], aug_config["max_kernel"] + 1) + if randint(0, 2) == 0: + augmenters.append( + Erosion((kernel_w, kernel_h), aug_config["iterations"]) + ) + else: + augmenters.append( + Dilation((kernel_w, kernel_h), aug_config["iterations"]) + ) + + elif aug_config["type"] == "color_jittering": + augmenters.append( + ColorJitter( + contrast=aug_config["factor_contrast"], + brightness=aug_config["factor_brightness"], + saturation=aug_config["factor_saturation"], + hue=aug_config["factor_hue"], + ) + ) + + elif aug_config["type"] == "gaussian_blur": + max_kernel_h = min(aug_config["max_kernel"], img.size[1]) + max_kernel_w = min(aug_config["max_kernel"], img.size[0]) + kernel_h = randint(aug_config["min_kernel"], max_kernel_h + 1) // 2 * 2 + 1 + kernel_w = randint(aug_config["min_kernel"], max_kernel_w + 1) // 2 * 2 + 1 + sigma = rand_uniform(aug_config["min_sigma"], aug_config["max_sigma"]) + augmenters.append( + GaussianBlur(kernel_size=(kernel_w, kernel_h), sigma=sigma) + ) + + elif aug_config["type"] == "gaussian_noise": + augmenters.append(GaussianNoise(std=aug_config["std"])) + + elif aug_config["type"] == "sharpen": + alpha = rand_uniform(aug_config["min_alpha"], aug_config["max_alpha"]) + strength = rand_uniform( + aug_config["min_strength"], aug_config["max_strength"] + ) + augmenters.append(Sharpen(alpha=alpha, strength=strength)) + + else: + print("Error - unknown augmentor: {}".format(aug_config["type"])) + exit(-1) + + return augmenters + + +def apply_data_augmentation(img, da_config): + """ + Apply data augmentation strategy on input image + """ + applied_da = list() + if da_config["proba"] != 1 and rand() > da_config["proba"]: + return img, applied_da + + # Convert to PIL Image + img = img[:, :, 0] if img.shape[2] == 1 else img + img = Image.fromarray(img) + + fill_value = da_config["fill_value"] if "fill_value" in da_config else 255 + augmenters = get_list_augmenters( + img, da_config["augmentations"], fill_value=fill_value + ) + if da_config["order"] == "random": + random.shuffle(augmenters) + + for augmenter in augmenters: + img = augmenter(img) + applied_da.append(type(augmenter).__name__) + + # convert to numpy array + img = np.array(img) + img = np.expand_dims(img, axis=2) if len(img.shape) == 2 else img + return img, applied_da + + +def apply_transform(img, transform): + """ + Apply data augmentation technique on input image + """ + img = img[:, :, 0] if img.shape[2] == 1 else img + img = Image.fromarray(img) + img = transform(img) + img = np.array(img) + return np.expand_dims(img, axis=2) if len(img.shape) == 2 else img + + +def line_aug_config(proba_use_da, p): + return { + "order": "random", + "proba": proba_use_da, + "augmentations": [ + { + "type": "dpi", + "proba": p, + "min_factor": 0.5, + "max_factor": 1.5, + "preserve_ratio": True, + }, + { + "type": "perspective", + "proba": p, + "min_factor": 0, + "max_factor": 0.4, + }, + { + "type": "elastic_distortion", + "proba": p, + "min_alpha": 0.5, + "max_alpha": 1, + "min_sigma": 1, + "max_sigma": 10, + "min_kernel_size": 3, + "max_kernel_size": 9, + }, + { + "type": "dilation_erosion", + "proba": p, + "min_kernel": 1, + "max_kernel": 3, + "iterations": 1, + }, + { + "type": "color_jittering", + "proba": p, + "factor_hue": 0.2, + "factor_brightness": 0.4, + "factor_contrast": 0.4, + "factor_saturation": 0.4, + }, + { + "type": "gaussian_blur", + "proba": p, + "min_kernel": 3, + "max_kernel": 5, + "min_sigma": 3, + "max_sigma": 5, + }, + { + "type": "gaussian_noise", + "proba": p, + "std": 0.5, + }, + { + "type": "sharpen", + "proba": p, + "min_alpha": 0, + "max_alpha": 1, + "min_strength": 0, + "max_strength": 1, + }, + { + "type": "zoom_ratio", + "proba": p, + "min_ratio_h": 0.8, + "max_ratio_h": 1, + "min_ratio_w": 0.99, + "max_ratio_w": 1, + "keep_dim": True, + }, + ], + } + + +def aug_config(proba_use_da, p): + return { + "order": "random", + "proba": proba_use_da, + "augmentations": [ + { + "type": "dpi", + "proba": p, + "min_factor": 0.75, + "max_factor": 1, + "preserve_ratio": True, + }, + { + "type": "perspective", + "proba": p, + "min_factor": 0, + "max_factor": 0.4, + }, + { + "type": "elastic_distortion", + "proba": p, + "min_alpha": 0.5, + "max_alpha": 1, + "min_sigma": 1, + "max_sigma": 10, + "min_kernel_size": 3, + "max_kernel_size": 9, + }, + { + "type": "dilation_erosion", + "proba": p, + "min_kernel": 1, + "max_kernel": 3, + "iterations": 1, + }, + { + "type": "color_jittering", + "proba": p, + "factor_hue": 0.2, + "factor_brightness": 0.4, + "factor_contrast": 0.4, + "factor_saturation": 0.4, + }, + { + "type": "gaussian_blur", + "proba": p, + "min_kernel": 3, + "max_kernel": 5, + "min_sigma": 3, + "max_sigma": 5, + }, + { + "type": "gaussian_noise", + "proba": p, + "std": 0.5, + }, + { + "type": "sharpen", + "proba": p, + "min_alpha": 0, + "max_alpha": 1, + "min_strength": 0, + "max_strength": 1, + }, + ], + } diff --git a/dan/utils.py b/dan/utils.py new file mode 100644 index 00000000..3c8ea8f7 --- /dev/null +++ b/dan/utils.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np +import torch +from torch.distributions.uniform import Uniform + + +def randint(low, high): + """ + call torch.randint to preserve random among dataloader workers + """ + return int(torch.randint(low, high, (1,))) + + +def rand(): + """ + call torch.rand to preserve random among dataloader workers + """ + return float(torch.rand((1,))) + + +def rand_uniform(low, high): + """ + call torch uniform to preserve random among dataloader workers + """ + return float(Uniform(low, high).sample()) + + +def pad_sequences_1D(data, padding_value): + """ + Pad data with padding_value to get same length + """ + x_lengths = [len(x) for x in data] + longest_x = max(x_lengths) + padded_data = np.ones((len(data), longest_x)).astype(np.int32) * padding_value + for i, x_len in enumerate(x_lengths): + padded_data[i, :x_len] = data[i][:x_len] + return padded_data + + +def resize_max(img, max_width=None, max_height=None): + if max_width is not None and img.shape[1] > max_width: + ratio = max_width / img.shape[1] + new_h = int(np.floor(ratio * img.shape[0])) + new_w = int(np.floor(ratio * img.shape[1])) + img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR) + if max_height is not None and img.shape[0] > max_height: + ratio = max_height / img.shape[0] + new_h = int(np.floor(ratio * img.shape[0])) + new_w = int(np.floor(ratio * img.shape[1])) + img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR) + return img + + +def pad_images(data, padding_value, padding_mode="br"): + """ + data: list of numpy array + mode: "br"/"tl"/"random" (bottom-right, top-left, random) + """ + x_lengths = [x.shape[0] for x in data] + y_lengths = [x.shape[1] for x in data] + longest_x = max(x_lengths) + longest_y = max(y_lengths) + padded_data = ( + np.ones((len(data), longest_x, longest_y, data[0].shape[2])) * padding_value + ) + for i, xy_len in enumerate(zip(x_lengths, y_lengths)): + x_len, y_len = xy_len + if padding_mode == "br": + padded_data[i, :x_len, :y_len, ...] = data[i] + elif padding_mode == "tl": + padded_data[i, -x_len:, -y_len:, ...] = data[i] + elif padding_mode == "random": + xmax = longest_x - x_len + ymax = longest_y - y_len + xi = randint(0, xmax) if xmax >= 1 else 0 + yi = randint(0, ymax) if ymax >= 1 else 0 + padded_data[i, xi : xi + x_len, yi : yi + y_len, ...] = data[i] + else: + raise NotImplementedError("Undefined padding mode: {}".format(padding_mode)) + return padded_data + + +def pad_image( + image, + padding_value, + new_height=None, + new_width=None, + pad_width=None, + pad_height=None, + padding_mode="br", + return_position=False, +): + """ + data: list of numpy array + mode: "br"/"tl"/"random" (bottom-right, top-left, random) + """ + if pad_width is not None and new_width is not None: + raise NotImplementedError("pad_with and new_width are not compatible") + if pad_height is not None and new_height is not None: + raise NotImplementedError("pad_height and new_height are not compatible") + + h, w, c = image.shape + pad_width = ( + pad_width + if pad_width is not None + else max(0, new_width - w) + if new_width is not None + else 0 + ) + pad_height = ( + pad_height + if pad_height is not None + else max(0, new_height - h) + if new_height is not None + else 0 + ) + + if not (pad_width == 0 and pad_height == 0): + padded_image = np.ones((h + pad_height, w + pad_width, c)) * padding_value + if padding_mode == "br": + hi, wi = 0, 0 + elif padding_mode == "tl": + hi, wi = pad_height, pad_width + elif padding_mode == "random": + hi = randint(0, pad_height) if pad_height >= 1 else 0 + wi = randint(0, pad_width) if pad_width >= 1 else 0 + else: + raise NotImplementedError("Undefined padding mode: {}".format(padding_mode)) + padded_image[hi : hi + h, wi : wi + w, ...] = image + output = padded_image + else: + hi, wi = 0, 0 + output = image + + if return_position: + return output, [[hi, hi + h], [wi, wi + w]] + return output + + +def pad_image_width_right(img, new_width, padding_value): + """ + Pad img to right side with padding value to reach new_width as width + """ + h, w, c = img.shape + pad_width = max((new_width - w), 0) + pad_right = np.ones((h, pad_width, c), dtype=img.dtype) * padding_value + img = np.concatenate([img, pad_right], axis=1) + return img diff --git a/images/visual.png b/images/visual.png new file mode 100644 index 0000000000000000000000000000000000000000..e228e7924cb2760dc61636651b525ef5359408c5 GIT binary patch literal 134135 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�n~r1G1pafPkYQ)C4Da(XywGWJNM2x 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 a_T^Qa=cNaU{##!p#G$IFr2u+w74|=%6YoF( literal 0 HcmV?d00001 diff --git a/images/visual_slanted_lines.png b/images/visual_slanted_lines.png new file mode 100644 index 0000000000000000000000000000000000000000..478af3ac1eb40316bbb1f0e7400f592b0d31ec70 GIT binary patch literal 213318 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%0AokjbT0)@mm8(9SVfd5aCWuCzw#6gK%or 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�K3n{wKWD{CkF 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%0Dfr9r<)k8JJc;8Dk_m5>&EaN{oOab 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 literal 0 HcmV?d00001 -- GitLab