Repository: PaddlePaddle/PaddleOCR

Issue:
PPStructure版面分析得到的结果，bbox里OCR的结果缺失最后一行
请提供下述完整信息以便快速定位问题/Please provide the following information to quickly locate the problem

- 系统环境/System Environment：
- 版本号/Version：Paddle：  PaddleOCR： 问题相关组件/Related components：
- 运行指令/Command Code：
- 完整报错/Complete Error Message：
![屏幕截图 2023-06-30 185505](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/f2159e3f-4075-4e69-8fd2-ebd6e2f301d2)
以如图页面版面分析的文本块可视化结果所示，该文本块OCR结果缺失最后一行
![屏幕截图 2023-06-30 185951](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/a3b1568f-c0b5-498f-9fa9-4fe4b4f6c650)
整体上看，版面分析的效果还不错，但是为什么文本块的OCR结果这么差，许多文本块的OCR结果缺失，未缺失的也缺最后一行


Discussion:
经过简单可视化，显示layout结果的每个块的图，很多图里明显有文本，但是OCR结果要么没有识别出任何文字，要么就缺行
![屏幕截图 2023-07-05 150940](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/66e2a7b4-abf3-4128-8c08-d2ffe890a59e)

有相同的问题，同问
https://github.com/PaddlePaddle/PaddleOCR/issues/10097
我将左下角的文本块的图单独拿出来，使用paddleocr识别，结果竟然识别不出来这种最简单的case纯文本的图
![屏幕截图 2023-07-05 160016](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/2c7fb269-0e81-4d41-a1c9-ba50b239b632)
![result 0](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/0fa2d171-1c80-41f5-9874-128dc1cd715e)

经过测试，结论是ocr性能与图片分辨率强相关，pdf转图片的过程中将图片提升每个尺寸的缩放系数，生成分辨率提高的图像，ocr效果提升。但是具体效果与缩放系数相关，这里有推荐的设置吗？
`import fitz  # fitz就是pip install PyMuPDF
def pdf2img(pdf_path, image_dir):
    pdfDoc = fitz.open(pdf_path)
    for pg in range(pdfDoc.pageCount):
        page = pdfDoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为4，这将为我们生成分辨率提高4的图像。
        # 此处若是不做设置，默认图片大小为：792X612, dpi=96
        zoom_x = 4  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 4
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)
        if not os.path.exists(image_path):  # 判断存放图片的文件夹是否存在
            os.makedirs(image_path)  # 若图片文件夹不存在就创建
        pix.writePNG(image_path + '/' + 'images_%s.png' % pg)  # 将图片写入指定的文件夹内
`

经过实验，PPStructure版面分析的过程中，先将PDF转换为图片，其中不同分辨率会导致ocr的效果不稳定，底层的ocr模型对分辨率的鲁棒性很差。

以下为原始PDF文档：
[基于会话的推荐方法综述.pdf](https://github.com/PaddlePaddle/PaddleOCR/files/11963657/default.pdf)

以第三页为例测试，
- 直接使用paddleocr可以识别所有文字：
![result_1_ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/c9349ace-650a-4de0-8851-24efb5f88a11)
- 使用PPStructure，版面分析后OCR结果很差：
![result_1](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/c555d1c0-38a0-416b-a781-851f113d0f90)
- PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
![result_1 0](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/c9dc436c-b834-4a5a-a8a5-c373e28bc395)
- 单独用paddleocr识别，完全识别不出来：
![result_1 0 _ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/b8c4e28b-9bca-4eca-9015-cab489f0404b)

PDF转图片每个尺寸缩放系数为2测试，
- 直接使用paddleocr可以识别所有文字：
![result_2_ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/e2acbbef-0ce3-4bc3-94c3-976fd6be03ba)
- 使用PPStructure，版面分析后OCR结果有提升，但是左列中间文本块最后一行识别出错，最下面两个文本块丢失最后一行：
![result_2](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/f8f30ccc-ab6e-42ae-844d-d9ff61bc1558)
- PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
![result_2 0](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/074721ac-bc63-4f46-8c34-401c7b981783)
- 单独用paddleocr识别，丢失最后一行：
![result_2 0 _ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/9fd2dd3a-1333-4f11-9e72-6609ce3bf340)

PDF转图片每个尺寸缩放系数为4测试，
- 直接使用paddleocr可以识别所有文字：
![result_4_ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/30aa8ff5-a394-4fb7-a6d9-4b938f60ba43)
- 使用PPStructure，版面分析后OCR结果有提升，不过之前能识别出来的标题，更高的分辨率反而识别不出来了
![result_4](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/e6312049-2bbc-47da-90a2-87d2fc69c8b6)
- PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
![result_4 0](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/3fd1c785-7766-4896-aaf5-38365cf50daa)
- 单独用paddleocr识别，基本能够识别：
![result_4 0 _ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/8c6fdbba-87dd-405a-8633-a56ab88494f5)

- PDF转图片每个尺寸缩放系数为8测试，
- 直接使用paddleocr可以识别所有文字：
![result_8_ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/1a557667-451f-4e37-b140-98d25eff1c4c)
- 使用PPStructure，版面分析后OCR结果基本正确：
![result_8](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/1e6eb838-0a2a-4124-91b5-078c2c8bfe71)
- PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
![result_8 0](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/68db005c-41c7-47d5-9695-2f2d1777df7d)
- 单独用paddleocr识别，基本能够识别：
![result_8 0 _ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/ed541e03-e0d3-4df8-8ce7-8b0a41cc7a3b)

虽然目前可以在PDF转图片的时候采用更大的缩放系数，但是会带来更长的时间消耗。而每个尺寸缩放的实验中，整页PDF直接用paddleocr都基本能识别所有文字，但是用PPStructure版面分析的pipeline中进行的OCR却效果很差，这里该如何解决？
> 经过实验，PPStructure版面分析的过程中，先将PDF转换为图片，其中不同分辨率会导致ocr的效果不稳定，底层的ocr模型对分辨率的鲁棒性很差。
> 
> 以下为原始PDF文档： [基于会话的推荐方法综述.pdf](https://github.com/PaddlePaddle/PaddleOCR/files/11963657/default.pdf)
> 
> 以第三页为例测试，
> 
> * 直接使用paddleocr可以识别所有文字：
>   ![result_1_ocr](https://user-images.githubusercontent.com/25731261/251328675-c9349ace-650a-4de0-8851-24efb5f88a11.png)
> * 使用PPStructure，版面分析后OCR结果很差：
>   ![result_1](https://user-images.githubusercontent.com/25731261/251330792-c555d1c0-38a0-416b-a781-851f113d0f90.png)
> * PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
>   ![result_1 0](https://user-images.githubusercontent.com/25731261/251330241-c9dc436c-b834-4a5a-a8a5-c373e28bc395.png)
> * 单独用paddleocr识别，完全识别不出来：
>   ![result_1 0 _ocr](https://user-images.githubusercontent.com/25731261/251330374-b8c4e28b-9bca-4eca-9015-cab489f0404b.png)
> 
> PDF转图片每个尺寸缩放系数为2测试，
> 
> * 直接使用paddleocr可以识别所有文字：
>   ![result_2_ocr](https://user-images.githubusercontent.com/25731261/251330915-e2acbbef-0ce3-4bc3-94c3-976fd6be03ba.png)
> * 使用PPStructure，版面分析后OCR结果有提升，但是左列中间文本块最后一行识别出错，最下面两个文本块丢失最后一行：
>   ![result_2](https://user-images.githubusercontent.com/25731261/251331223-f8f30ccc-ab6e-42ae-844d-d9ff61bc1558.png)
> * PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
>   ![result_2 0](https://user-images.githubusercontent.com/25731261/251331547-074721ac-bc63-4f46-8c34-401c7b981783.png)
> * 单独用paddleocr识别，丢失最后一行：
>   ![result_2 0 _ocr](https://user-images.githubusercontent.com/25731261/251331703-9fd2dd3a-1333-4f11-9e72-6609ce3bf340.png)
> 
> PDF转图片每个尺寸缩放系数为4测试，
> 
> * 直接使用paddleocr可以识别所有文字：
>   ![result_4_ocr](https://user-images.githubusercontent.com/25731261/251331811-30aa8ff5-a394-4fb7-a6d9-4b938f60ba43.png)
> * 使用PPStructure，版面分析后OCR结果有提升，不过之前能识别出来的标题，更高的分辨率反而识别不出来了
>   ![result_4](https://user-images.githubusercontent.com/25731261/251354753-e6312049-2bbc-47da-90a2-87d2fc69c8b6.png)
> * PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
>   ![result_4 0](https://user-images.githubusercontent.com/25731261/251355159-3fd1c785-7766-4896-aaf5-38365cf50daa.png)
> * 单独用paddleocr识别，基本能够识别：
>   ![result_4 0 _ocr](https://user-images.githubusercontent.com/25731261/251355681-8c6fdbba-87dd-405a-8633-a56ab88494f5.png)
> * PDF转图片每个尺寸缩放系数为8测试，
> * 直接使用paddleocr可以识别所有文字：
>   ![result_8_ocr](https://user-images.githubusercontent.com/25731261/251355785-1a557667-451f-4e37-b140-98d25eff1c4c.png)
> * 使用PPStructure，版面分析后OCR结果基本正确：
>   ![result_8](https://user-images.githubusercontent.com/25731261/251356129-1e6eb838-0a2a-4124-91b5-078c2c8bfe71.png)
> * PPStructure结果中的'img'字段为版面分析块的图，将左下角的文本块对应的图保存：
>   ![result_8 0](https://user-images.githubusercontent.com/25731261/251356890-68db005c-41c7-47d5-9695-2f2d1777df7d.png)
> * 单独用paddleocr识别，基本能够识别：
>   ![result_8 0 _ocr](https://user-images.githubusercontent.com/25731261/251356978-ed541e03-e0d3-4df8-8ce7-8b0a41cc7a3b.png)
> 
> 虽然目前可以在PDF转图片的时候采用更大的缩放系数，但是会带来更长的时间消耗。而每个尺寸缩放的实验中，整页PDF直接用paddleocr都基本能识别所有文字，但是用PPStructure版面分析的pipeline中进行的OCR却效果很差，这里该如何解决？

- 手动截取一张包含左下角文本块的图，周围包含空白，以防OCR的放大预处理导致像素失真，单独用paddleocr识别，基本能识别：
![屏幕截图 2023-07-06 151852](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/6909fdce-717d-49cc-ac53-6675feab2108)
![result 0 _screen_ocr](https://github.com/PaddlePaddle/PaddleOCR/assets/25731261/2e00dc43-2968-474a-9191-f3f6927075c4)

推测为PPStructure得到了版面分析的结果后，对各个块的图进行OCR，有一个放大的预处理，导致像素失真，而OCR对缩放像素失真的鲁棒性很差。

那么如何在OCR的对图片预处理修改，不进行导致像素失真的缩放操作？有什么参数可以控制OCR对输入图片的的resize吗？
make

mark
can someone share sample code to get layout analysis using different models present at 
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/docs/models_list_en.md

> can someone share sample code to get layout analysis using different models present at https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/docs/models_list_en.md

you can download model, then change model dir:
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/layout/README.md#72-model-inference
also you can use parameter layout_model_dir of method PPStructure:
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/docs/quickstart_en.md#223-layout-analysis
@lycfight , its not working I shared the issue here - https://github.com/PaddlePaddle/PaddleOCR/issues/10476 please take a look
mark
mark

我也遇到了同样的问题，请问大佬PDF转图片然后进行缩放是如何做的？
我是将PDF用fitz读取获得每一页，然后将每个Page 获取他们的 pixmap，再通过iobytes用cv 获取到图片。
> 我也遇到了同样的问题，请问大佬PDF转图片然后进行缩放是如何做的？ 我是将PDF用fitz读取获得每一页，然后将每个Page 获取他们的 pixmap，再通过iobytes用cv 获取到图片。

但是使用V3的模型，PPstructure在OCR的过程中，会比 v4的模型效果好一些。
> 我也遇到了同样的问题，请问大佬PDF转图片然后进行缩放是如何做的？ 我是将PDF用fitz读取获得每一页，然后将每个Page 获取他们的 pixmap，再通过iobytes用cv 获取到图片。

就是PPStructure内置的OCR的缩放问题导致的，这得等官方解决。我采取了折中的办法，只检测出各块bbox位置，不使用PPStructure内置的OCR，然后用另外单独的PaddleOCR解析出所有行的bbox，结合一下过滤
> > 我也遇到了同样的问题，请问大佬PDF转图片进行缩放是如何做的？我等于PDF用fitz读取每一页，然后将每一页获取他们的像素图，再通过iobytes用cv获取到图片。
> 
> 就是PPStructure内置的OCR的缩放问题导致的，这得等官方解决。我采取了折中的办法，只检测出各块bbox位置，不使用PPStructure内置的OCR，用另外单独的PaddleOCR解析出所有行的bbox，结合一下过滤

请问内置的ocr的缩放参数是哪一个？我也遇到这个问题，不知道如何修改
> > > 我也遇到了同样的问题，请问大佬PDF转图片进行缩放是如何做的？我等于PDF用fitz读取每一页，然后将每一页获取他们的像素图，再通过iobytes用cv获取到图片。
> > 
> > 
> > 就是PPStructure内置的OCR的缩放问题导致的，这得等官方解决。我采取了折中的办法，只检测出各块bbox位置，不使用PPStructure内置的OCR，用另外单独的PaddleOCR解析出所有行的bbox，结合一下过滤
> 
> 请问内置的ocr的缩放参数是哪一个？我也遇到这个问题，不知道如何修改

缩放只是PPStructure内置版面分析后处理的问题，有时OCR识别不出来的情况，放大有可能能识别出来一点，但也不太稳定。我没用缩放，参考上一条回复，OCR单独做，和layout的各类块结合一下过滤

我也遇到了同样的问题，参考 @lycfight （感谢🙏）的思路对 PaddleOCR 进行了非官方修复：
- 分支：https://github.com/RussellLuo/PaddleOCR/tree/hotfix-ppstructure-ocr
- 修改：https://github.com/PaddlePaddle/PaddleOCR/compare/release/2.7...RussellLuo:PaddleOCR:hotfix-ppstructure-ocr

安装该修复版本：

```bash
pip install git+https://github.com/RussellLuo/PaddleOCR.git@hotfix-ppstructure-ocr
```

使用说明：

```bash
# 官方命令：paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structurex
```

如果大家也遇到了这个问题，希望这个修复版本能够起到缓解作用。最终，还是期待官方的解决方案！
> 我也遇到了同样的问题，参考 @lycfight （感谢🙏）的思路对 PaddleOCR 进行了非官方修复：
> 
> * 分支：https://github.com/RussellLuo/PaddleOCR/tree/hotfix-ppstructure-ocr
> * 修改：[release/2.7...RussellLuo:PaddleOCR:hotfix-ppstructure-ocr](https://github.com/PaddlePaddle/PaddleOCR/compare/release/2.7...RussellLuo:PaddleOCR:hotfix-ppstructure-ocr)
> 
> 安装该修复版本：
> 
> ```shell
> pip install git+https://github.com/RussellLuo/PaddleOCR.git@hotfix-ppstructure-ocr
> ```
> 
> 使用说明：
> 
> ```shell
> # 官方命令：paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure
> paddleocr --image_dir=ppstructure/docs/table/1.png --type=structurex
> ```
> 
> 如果大家也遇到了这个问题，希望这个修复版本能够起到缓解作用。最终，还是期待官方的解决方案！

大佬你修复的版本PyMuPDF是没有版本限制了吗？我现在有个东西要用1.23.1的，但是PaddleOCR会冲突。
mark
推测是PDF转image时的缩放系数导致图片分辨率过低的问题，修改ppcor.utils.utility.py 第109行开始：

elif os.path.basename(img_path)[-3:].lower() == 'pdf':
        import fitz
        from PIL import Image, ImageFilter
        imgs = []
        with fitz.open(img_path) as pdf:
            for pg in range(0, pdf.page_count):
                page = pdf[pg]
                ## 提高PDF转换为图片时的分辨率，您可以通过调整fitz.Matrix中的缩放因子来实现。目前，代码中的缩放因子设置为2，这意味着图片的分辨率将是PDF的两倍。
                # mat = fitz.Matrix(2, 2)
                mat = fitz.Matrix(1, 1)
                pm = page.get_pixmap(matrix=mat, alpha=False)

                # if width and height > 2000 pixels, don't enlarge the image
                if pm.width > 2000 and pm.height > 2000:
                    pm = page.get_pixmap(matrix=fitz.Matrix(1, 1), alpha=False)
                else:
                    scale = int(max(2000/pm.width,2000/pm.height))
                    pm = page.get_pixmap(matrix=fitz.Matrix(scale, scale), alpha=False)
                    print('convert PDF to image with width {} , height {}'.format(pm.width,pm.height))

                img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)
                # 应用锐化滤波器
                img = img.filter(ImageFilter.SHARPEN)

                img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
                imgs.append(img)
            return imgs, False, True
> 如果大家也遇到了这个问题，希望这个修复版本能够起到缓解作用。最终，还是期待官方的解决方案！

PaddleOCR 正在经历从一个企业开源项目转型为一个完全社区驱动的项目的过程中。以后，社区就是官方。 😄 

现在，社区有一个解决 long standing issues 的活动： #11906 ，如果你有兴趣，可以试着 upstream 你的改动到 PaddleOCR 仓库（ main 分支 ）。
@jzhang533 感谢认可，很荣幸可以给 PaddleOCR 社区作贡献！我尝试提交了一个 PR：#11916 🚀

Resolving patch:
diff --git a/ppstructure/predict_system.py b/ppstructure/predict_system.py
--- a/ppstructure/predict_system.py
+++ b/ppstructure/predict_system.py
@@ -58,7 +58,6 @@ def __init__(self, args):
                 logger.warning(
                     "When args.layout is false, args.ocr is automatically set to false"
                 )
-            args.drop_score = 0
             # init model
             self.layout_predictor = None
             self.text_system = None
@@ -93,6 +92,7 @@ def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
             'all': 0
         }
         start = time.time()
+
         if self.image_orientation_predictor is not None:
             tic = time.time()
             cls_result = self.image_orientation_predictor.predict(
@@ -108,6 +108,7 @@ def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
                 img = cv2.rotate(img, cv_rotate_code[angle])
             toc = time.time()
             time_dict['image_orientation'] = toc - tic
+
         if self.mode == 'structure':
             ori_im = img.copy()
             if self.layout_predictor is not None:
@@ -116,6 +117,20 @@ def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
             else:
                 h, w = ori_im.shape[:2]
                 layout_res = [dict(bbox=None, label='table')]
+
+            # As reported in issues such as #10270 and #11665, the old
+            # implementation, which recognizes texts from the layout regions,
+            # has problems with OCR recognition accuracy.
+            #
+            # To enhance the OCR recognition accuracy, we implement a patch fix
+            # that first use text_system to detect and recognize all text information
+            # and then filter out relevant texts according to the layout regions.
+            text_res = None
+            if self.text_system is not None:
+                text_res, ocr_time_dict = self._predict_text(img)
+                time_dict['det'] += ocr_time_dict['det']
+                time_dict['rec'] += ocr_time_dict['rec']
+
             res_list = []
             for region in layout_res:
                 res = ''
@@ -126,6 +141,8 @@ def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
                 else:
                     x1, y1, x2, y2 = 0, 0, w, h
                     roi_img = ori_im
+                bbox = [x1, y1, x2, y2]
+
                 if region['label'] == 'table':
                     if self.table_system is not None:
                         res, table_time_dict = self.table_system(
@@ -135,67 +152,83 @@ def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
                         time_dict['det'] += table_time_dict['det']
                         time_dict['rec'] += table_time_dict['rec']
                 else:
-                    if self.text_system is not None:
-                        if self.recovery:
-                            wht_im = np.ones(ori_im.shape, dtype=ori_im.dtype)
-                            wht_im[y1:y2, x1:x2, :] = roi_img
-                            filter_boxes, filter_rec_res, ocr_time_dict = self.text_system(
-                                wht_im)
-                        else:
-                            filter_boxes, filter_rec_res, ocr_time_dict = self.text_system(
-                                roi_img)
-                        time_dict['det'] += ocr_time_dict['det']
-                        time_dict['rec'] += ocr_time_dict['rec']
-
-                        # remove style char,
-                        # when using the recognition model trained on the PubtabNet dataset,
-                        # it will recognize the text format in the table, such as <b>
-                        style_token = [
-                            '<strike>', '<strike>', '<sup>', '</sub>', '<b>',
-                            '</b>', '<sub>', '</sup>', '<overline>',
-                            '</overline>', '<underline>', '</underline>', '<i>',
-                            '</i>'
-                        ]
-                        res = []
-                        for box, rec_res in zip(filter_boxes, filter_rec_res):
-                            rec_str, rec_conf = rec_res[0], rec_res[1]
-                            for token in style_token:
-                                if token in rec_str:
-                                    rec_str = rec_str.replace(token, '')
-                            if not self.recovery:
-                                box += [x1, y1]
-                            if self.return_word_box:
-                                word_box_content_list, word_box_list = cal_ocr_word_box(rec_str, box, rec_res[2])
-                                res.append({
-                                    'text': rec_str,
-                                    'confidence': float(rec_conf),
-                                    'text_region': box.tolist(),
-                                    'text_word': word_box_content_list,
-                                    'text_word_region': word_box_list
-                                })
-                            else:
-                                res.append({
-                                    'text': rec_str,
-                                    'confidence': float(rec_conf),
-                                    'text_region': box.tolist()
-                                })
+                    if text_res is not None:
+                        # Filter the text results whose regions intersect with the current layout bbox.
+                        res = self._filter_text_res(text_res, bbox)
+
                 res_list.append({
                     'type': region['label'].lower(),
-                    'bbox': [x1, y1, x2, y2],
+                    'bbox': bbox,
                     'img': roi_img,
                     'res': res,
                     'img_idx': img_idx
                 })
+
             end = time.time()
             time_dict['all'] = end - start
             return res_list, time_dict
+
         elif self.mode == 'kie':
             re_res, elapse = self.kie_predictor(img)
             time_dict['kie'] = elapse
             time_dict['all'] = elapse
             return re_res[0], time_dict
+
         return None, None
 
+    def _predict_text(self, img):
+        filter_boxes, filter_rec_res, ocr_time_dict = self.text_system(img)
+
+        # remove style char,
+        # when using the recognition model trained on the PubtabNet dataset,
+        # it will recognize the text format in the table, such as <b>
+        style_token = [
+            '<strike>', '<strike>', '<sup>', '</sub>', '<b>',
+            '</b>', '<sub>', '</sup>', '<overline>',
+            '</overline>', '<underline>', '</underline>', '<i>',
+            '</i>'
+        ]
+        res = []
+        for box, rec_res in zip(filter_boxes, filter_rec_res):
+            rec_str, rec_conf = rec_res[0], rec_res[1]
+            for token in style_token:
+                if token in rec_str:
+                    rec_str = rec_str.replace(token, '')
+            if self.return_word_box:
+                word_box_content_list, word_box_list = cal_ocr_word_box(rec_str, box, rec_res[2])
+                res.append({
+                    'text': rec_str,
+                    'confidence': float(rec_conf),
+                    'text_region': box.tolist(),
+                    'text_word': word_box_content_list,
+                    'text_word_region': word_box_list
+                })
+            else:
+                res.append({
+                    'text': rec_str,
+                    'confidence': float(rec_conf),
+                    'text_region': box.tolist()
+                })
+        return res, ocr_time_dict
+
+    def _filter_text_res(self, text_res, bbox):
+        res = []
+        for r in text_res:
+            box = r['text_region']
+            rect = box[0][0], box[0][1], box[2][0], box[2][1]
+            if self._has_intersection(bbox, rect):
+                res.append(r)
+        return res
+
+    def _has_intersection(self, rect1, rect2):
+        x_min1, y_min1, x_max1, y_max1 = rect1
+        x_min2, y_min2, x_max2, y_max2 = rect2
+        if x_min1 > x_max2 or x_max1 < x_min2:
+            return False
+        if y_min1 > y_max2 or y_max1 < y_min2:
+            return False
+        return True
+
 
 def save_structure_res(res, save_folder, img_name, img_idx=0):
     excel_save_folder = os.path.join(save_folder, img_name)


Test patch: