| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- # Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved.
- #
- # 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 copy
- from typing import Dict
- import numpy as np
- from PIL import Image, ImageDraw
- from ...common.result import BaseCVResult, HtmlMixin, JsonMixin, XlsxMixin
- 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"]
- res_img_dict["overall_ocr_res"] = self["overall_ocr_res"].img["ocr_res_img"]
- if model_settings["use_table_recognition"] and len(self["table_res_list"]) > 0:
- table_cell_img = Image.fromarray(
- copy.deepcopy(self["doc_preprocessor_res"]["output_img"][:, :, ::-1])
- )
- table_draw = ImageDraw.Draw(table_cell_img)
- rectangle_color = (255, 0, 0)
- 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]
- table_draw.rectangle(
- [x1, y1, x2, y2], outline=rectangle_color, width=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"]
- if (
- model_settings["use_formula_recognition"]
- and len(self["formula_res_list"]) > 0
- ):
- for sno in range(len(self["formula_res_list"])):
- formula_res = self["formula_res_list"][sno]
- formula_region_id = formula_res["formula_region_id"]
- sub_formula_res_dict = formula_res.img
- key = f"formula_res_region{formula_region_id}"
- res_img_dict[key] = sub_formula_res_dict["res"]
- 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"]
- data["page_index"] = self["page_index"]
- model_settings = self["model_settings"]
- data["model_settings"] = model_settings
- data["parsing_res_list"] = self["parsing_res_list"]
- 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"]
- data["overall_ocr_res"] = self["overall_ocr_res"].str["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"])
- if (
- model_settings["use_formula_recognition"]
- and len(self["formula_res_list"]) > 0
- ):
- data["formula_res_list"] = []
- for sno in range(len(self["formula_res_list"])):
- formula_res = self["formula_res_list"][sno]
- data["formula_res_list"].append(formula_res.str["res"])
- return JsonMixin._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"]
- data["page_index"] = self["page_index"]
- model_settings = self["model_settings"]
- data["model_settings"] = model_settings
- data["parsing_res_list"] = self["parsing_res_list"]
- 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"]
- data["overall_ocr_res"] = self["overall_ocr_res"].json["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"])
- if (
- model_settings["use_formula_recognition"]
- and len(self["formula_res_list"]) > 0
- ):
- data["formula_res_list"] = []
- for sno in range(len(self["formula_res_list"])):
- formula_res = self["formula_res_list"][sno]
- data["formula_res_list"].append(formula_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
|