# copyright (c) 2024 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os from typing import Dict import numpy as np import copy import cv2 from ...common.result import BaseCVResult, HtmlMixin, XlsxMixin, StrMixin, JsonMixin class LayoutParsingResult(BaseCVResult, HtmlMixin, XlsxMixin): """Layout Parsing Result""" def __init__(self, data) -> None: """Initializes a new instance of the class with the specified data.""" super().__init__(data) HtmlMixin.__init__(self) XlsxMixin.__init__(self) def _to_img(self) -> Dict[str, np.ndarray]: res_img_dict = {} model_settings = self["model_settings"] if model_settings["use_doc_preprocessor"]: res_img_dict.update(**self["doc_preprocessor_res"].img) res_img_dict["layout_det_res"] = self["layout_det_res"].img["res"] if model_settings["use_general_ocr"] or model_settings["use_table_recognition"]: res_img_dict["overall_ocr_res"] = self["overall_ocr_res"].img["ocr_res_img"] if model_settings["use_general_ocr"]: general_ocr_res = copy.deepcopy(self["overall_ocr_res"]) general_ocr_res["rec_polys"] = self["text_paragraphs_ocr_res"]["rec_polys"] general_ocr_res["rec_texts"] = self["text_paragraphs_ocr_res"]["rec_texts"] general_ocr_res["rec_scores"] = self["text_paragraphs_ocr_res"][ "rec_scores" ] general_ocr_res["rec_boxes"] = self["text_paragraphs_ocr_res"]["rec_boxes"] res_img_dict["text_paragraphs_ocr_res"] = general_ocr_res.img["ocr_res_img"] if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0: table_cell_img = copy.deepcopy(self["doc_preprocessor_res"]["output_img"]) for sno in range(len(self["table_res_list"])): table_res = self["table_res_list"][sno] cell_box_list = table_res["cell_box_list"] for box in cell_box_list: x1, y1, x2, y2 = [int(pos) for pos in box] cv2.rectangle(table_cell_img, (x1, y1), (x2, y2), (255, 0, 0), 2) res_img_dict["table_cell_img"] = table_cell_img if model_settings["use_seal_recognition"] and len(self["seal_res_list"]) > 0: for sno in range(len(self["seal_res_list"])): seal_res = self["seal_res_list"][sno] seal_region_id = seal_res["seal_region_id"] sub_seal_res_dict = seal_res.img key = f"seal_res_region{seal_region_id}" res_img_dict[key] = sub_seal_res_dict["ocr_res_img"] return res_img_dict def _to_str(self, *args, **kwargs) -> Dict[str, str]: """Converts the instance's attributes to a dictionary and then to a string. Args: *args: Additional positional arguments passed to the base class method. **kwargs: Additional keyword arguments passed to the base class method. Returns: Dict[str, str]: A dictionary with the instance's attributes converted to strings. """ data = {} data["input_path"] = self["input_path"] model_settings = self["model_settings"] data["model_settings"] = model_settings if self["model_settings"]["use_doc_preprocessor"]: data["doc_preprocessor_res"] = self["doc_preprocessor_res"].str["res"] data["layout_det_res"] = self["layout_det_res"].str["res"] if model_settings["use_general_ocr"] or model_settings["use_table_recognition"]: data["overall_ocr_res"] = self["overall_ocr_res"].str["res"] if model_settings["use_general_ocr"]: general_ocr_res = {} general_ocr_res["rec_polys"] = self["text_paragraphs_ocr_res"]["rec_polys"] general_ocr_res["rec_texts"] = self["text_paragraphs_ocr_res"]["rec_texts"] general_ocr_res["rec_scores"] = self["text_paragraphs_ocr_res"][ "rec_scores" ] general_ocr_res["rec_boxes"] = self["text_paragraphs_ocr_res"]["rec_boxes"] data["text_paragraphs_ocr_res"] = general_ocr_res if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0: data["table_res_list"] = [] for sno in range(len(self["table_res_list"])): table_res = self["table_res_list"][sno] data["table_res_list"].append(table_res.str["res"]) if model_settings["use_seal_recognition"] and len(self["seal_res_list"]) > 0: data["seal_res_list"] = [] for sno in range(len(self["seal_res_list"])): seal_res = self["seal_res_list"][sno] data["seal_res_list"].append(seal_res.str["res"]) return StrMixin._to_str(data, *args, **kwargs) def _to_json(self, *args, **kwargs) -> Dict[str, str]: """ Converts the object's data to a JSON dictionary. Args: *args: Positional arguments passed to the JsonMixin._to_json method. **kwargs: Keyword arguments passed to the JsonMixin._to_json method. Returns: Dict[str, str]: A dictionary containing the object's data in JSON format. """ data = {} data["input_path"] = self["input_path"] model_settings = self["model_settings"] data["model_settings"] = model_settings if self["model_settings"]["use_doc_preprocessor"]: data["doc_preprocessor_res"] = self["doc_preprocessor_res"].json["res"] data["layout_det_res"] = self["layout_det_res"].json["res"] if model_settings["use_general_ocr"] or model_settings["use_table_recognition"]: data["overall_ocr_res"] = self["overall_ocr_res"].json["res"] if model_settings["use_general_ocr"]: general_ocr_res = {} general_ocr_res["rec_polys"] = self["text_paragraphs_ocr_res"]["rec_polys"] general_ocr_res["rec_texts"] = self["text_paragraphs_ocr_res"]["rec_texts"] general_ocr_res["rec_scores"] = self["text_paragraphs_ocr_res"][ "rec_scores" ] general_ocr_res["rec_boxes"] = self["text_paragraphs_ocr_res"]["rec_boxes"] data["text_paragraphs_ocr_res"] = general_ocr_res if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0: data["table_res_list"] = [] for sno in range(len(self["table_res_list"])): table_res = self["table_res_list"][sno] data["table_res_list"].append(table_res.json["res"]) if model_settings["use_seal_recognition"] and len(self["seal_res_list"]) > 0: data["seal_res_list"] = [] for sno in range(len(self["seal_res_list"])): seal_res = self["seal_res_list"][sno] data["seal_res_list"].append(seal_res.json["res"]) return JsonMixin._to_json(data, *args, **kwargs) def _to_html(self) -> Dict[str, str]: """Converts the prediction to its corresponding HTML representation. Returns: Dict[str, str]: The str type HTML representation result. """ model_settings = self["model_settings"] res_html_dict = {} if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0: for sno in range(len(self["table_res_list"])): table_res = self["table_res_list"][sno] table_region_id = table_res["table_region_id"] key = f"table_{table_region_id}" res_html_dict[key] = table_res.html["pred"] return res_html_dict def _to_xlsx(self) -> Dict[str, str]: """Converts the prediction HTML to an XLSX file path. Returns: Dict[str, str]: The str type XLSX representation result. """ model_settings = self["model_settings"] res_xlsx_dict = {} if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0: for sno in range(len(self["table_res_list"])): table_res = self["table_res_list"][sno] table_region_id = table_res["table_region_id"] key = f"table_{table_region_id}" res_xlsx_dict[key] = table_res.xlsx["pred"] return res_xlsx_dict