Repository: PaddlePaddle/PaddleOCR

Issue:
PPstructure 表格识别错误
请提供下述完整信息以便快速定位问题/Please provide the following information to quickly locate the problem

**系统环境/System Environment：**

Windows 10 家庭中文版 22H2：
1060MaxQ + CUDA 11.6

**版本号/Version：**
Python：3.9, anaconda
Paddle：paddlepaddle-gpu==2.5.1.post116
PaddleOCR： 2.7
问题相关组件/Related components：PPStructure 版面回复

**运行指令/Command Code：**
python predict_system.py --image_dir=3.pdf --det_model_dir=inference/ch_PP-OCRv4_det_infer --rec_model_dir=inference/ch_PP-OCRv4_rec_infer --rec_char_dict_path=../ppocr/utils/ppocr_keys_v1.txt --table_model_dir=inference/ch_ppstructure_mobile_v2.0_SLANet_infer --table_char_dict_path=../ppocr/utils/dict/table_structure_dict_ch.txt --layout_model_dir=inference/picodet_lcnet_x1_0_fgd_layout_cdla_infer --layout_dict_path=../ppocr/utils/dict/layout_dict/layout_cdla_dict.txt --vis_font_path=../doc/fonts/simfang.ttf --recovery=True --output=./output/ --use_gpu=False

**完整报错/Complete Error Message：**
PDF文档中的表格如下：
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/c09c9e6f-40ed-48b0-af03-09f87f66c326)

使用版面恢复，运行到最后出现
ppocr ERROR: error in layout recovery image:1.pdf, err msg: list index out of range
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/85848adc-abfe-488d-b3a1-7a1f237ec024)

能输出文件
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/b80fe2ab-f87e-4497-9ef1-01b6717f5a86)
但是在 predict_system.py 292 行，调用 convert_info_docx(img, all_res, save_folder, img_name) 时出现问题

**问题定位：**
原因在于，识别的表格行列数出现了格式错误
从 predict_system.py 调用 convert_info_docx
跳转到 recovery_to_doc.py 63行 parser.handle_table(region['res']['html'], doc)
调用 recovery/table_process.py 第238行 def handle_table(self, html, doc)
识别到表格的 res：
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/838a52b7-c36e-4fc2-b695-548e8ada3cbd)
产生的 html 如下：
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/b7d1f2e6-d862-479f-be2a-b93ea048f3dc)

其中 handle_table 函数中，提取的 cols_len = 4
但是在表格的 html 中错误地出现了 colspan = 5
导致在函数中，出现了 list index out of range 的情况
![image](https://github.com/PaddlePaddle/PaddleOCR/assets/43161566/a29b29d3-0466-4e23-80bd-8c0b6d1e2587)


这个 colspan=5 是在表格分析的过程中产生的，我无法解决，需要求助

 




Discussion:
同样的问题，请问解决了吗？

> 同样的问题，请问解决了吗？

@xxcoco763 检查之后似乎是模型的问题，复杂表格下模型准确度不够，所以将行列数判断错了。可以看看 https://blog.csdn.net/weixin_44451785/article/details/105888966，暂时先手动处理一下表格
上面链接失效了，还有其他方法解决colspan, rowspan文章或办法吗？
@nissansz 这个是链接格式没写好，把逗号后面的去掉就行了。或者直接搜 python对图片中的表格拆分
这个文章看过。有的时候表格线有断开，各种变形会导致投影法失效，有办法修补表格线吗？
另外，我用paddle训练表格识别模型，测试时，有的图片，colspan, rowspan会漏掉，这种是什么问题？怎么解决？

![image](https://github.com/PaddlePaddle/PaddleOCR/assets/41010669/91576c08-cd21-4b67-90e6-caaee51a8558)

@nissansz 如果是扫描文档，表格断开的话可以考虑用 opencv 做图像增强，做一些图形学的膨胀之类的加粗表格线。然后如果是拍照的图片变形了可能就要考虑手动用PS之类的修补了。
然后 colspan rowspan 这个可能是面对复杂表格，模型不够准确的问题，如果要解决的话可能只能微调模型了，加自己的数据来训练，我也还没有找到很好的方法
膨胀之类的加粗表格线，怎麽判断已经找到全部表格线？
这个应该没有什么好办法了，要靠opencv+调参，不同文档可能还不一样。比如用霍夫变换什么的识别表格线，里面挺多参数要手动试的
应该是最后一行合并的时候报错了，在269行添加一个判断就好了
  while docx_cell.text != '':  # Skip the merged cell
      cell_col += 1
      docx_cell = table.cell(cell_row, cell_col)

  if cell_row + rowspan - 1 == len(rows):
      rowspan -= 1

  cell_to_merge = table.cell(cell_row + rowspan - 1,
                             cell_col + colspan - 1)
> 应该是最后一行合并的时候报错了，在269行添加一个判断就好了 while docx_cell.text != '': # Skip the merged cell cell_col += 1 docx_cell = table.cell(cell_row, cell_col)
> 
> if cell_row + rowspan - 1 == len(rows): rowspan -= 1
> 
> cell_to_merge = table.cell(cell_row + rowspan - 1, cell_col + colspan - 1)

这是哪个py文件？




> > 应该是最后一行合并的时候报错了，在269行添加一个判断就好了 while docx_cell.text != '': # Skip the merged cell cell_col += 1 docx_cell = table.cell(cell_row, cell_col)
> > if cell_row + rowspan - 1 == len(rows): rowspan -= 1
> > cell_to_merge = table.cell(cell_row + rowspan - 1, cell_col + colspan - 1)
> 
> 这是哪个py文件？

> 

> 
![微信截图_20231109193911](https://github.com/PaddlePaddle/PaddleOCR/assets/38805230/185840f3-df5a-498a-b184-f9fcd46e1459)
table_process.py
这不是表格没识别出来，应该是在做还原到word文档的时候报错了，网上有其他的还原方法，可以去找下
我找到报错的问题是在表格提取成html时                    
colspan = int(col.attrs.get('colspan', 1))
rowspan = int(col.attrs.get('rowspan', 1))
这两个数值跟正确的表格是不相符的，导致list out，
现在的解决办法是报错的时候rowspan = int(col.attrs.get('rowspan', 1)) - 1 或colspan = int(col.attrs.get('colspan', 1)) - 1，目前只遇到跨度多了1的情况
我训练表格模型，有时正常span，有时消失。而且效果总没有官方好。
更奇怪的是，最简单的表格，也很难准确
> 我训练表格模型，有时正常span，有时消失。而且效果总没有官方好。 更奇怪的是，最简单的表格，也很难准确

正常的表格识别没什么问题，有个问题是pdf转图片的时候                mat = fitz.Matrix(2, 2)用的是2，会导致图片模糊，你可以把图片打印出来看下，如果很模糊要改变缩放系数，                if pm.width > 2000 or pm.height > 2000:也不能做这个缩小
有训练好的模型分享吗？
> 有训练好的模型分享吗？

没有，我也没训练过
crnn训练，英文识别率差,且英文单词间的空格缺失，这个有办法吗？
有没有好的参数设置呢？

Resolving patch:
diff --git a/ppstructure/recovery/table_process.py b/ppstructure/recovery/table_process.py
--- a/ppstructure/recovery/table_process.py
+++ b/ppstructure/recovery/table_process.py
@@ -253,18 +253,18 @@ def handle_table(self, html, doc):
             cols = get_table_columns(row)
             cell_col = 0
             for col in cols:
+                if cell_col >= cols_len:
+                    break
+
                 colspan = int(col.attrs.get('colspan', 1))
                 rowspan = int(col.attrs.get('rowspan', 1))
-
                 cell_html = get_cell_html(col)
                 if col.name == 'th':
                     cell_html = "<b>%s</b>" % cell_html
 
                 docx_cell = table.cell(cell_row, cell_col)
-
-                while docx_cell.text != '':  # Skip the merged cell
-                    cell_col += 1
-                    docx_cell = table.cell(cell_row, cell_col)
+                if (cell_col + colspan -1) >= cols_len:
+                    colspan -= 1
 
                 cell_to_merge = table.cell(cell_row + rowspan - 1,
                                            cell_col + colspan - 1)


Test patch: