当Layout检测将大面积的表格区域误识别为文本框时,可以通过后处理自动将其转换为表格类型。
从 page_022.json 可以看到:
type: "text",而不是 type: "table"通过后处理规则,自动将满足条件的大文本块转换为表格:
# layout后处理配置
layout:
# 将大面积文本块转换为表格(后处理)
convert_large_text_to_table: true # 是否启用
min_text_area_ratio: 0.25 # 最小面积占比(25%)
min_text_width_ratio: 0.4 # 最小宽度占比(40%)
min_text_height_ratio: 0.3 # 最小高度占比(30%)
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
convert_large_text_to_table |
bool | true |
是否启用文本转表格功能 |
min_text_area_ratio |
float | 0.25 |
最小面积占比(0-1),文本块面积需占页面25%以上 |
min_text_width_ratio |
float | 0.4 |
最小宽度占比(0-1),文本块宽度需占页面40%以上 |
min_text_height_ratio |
float | 0.3 |
最小高度占比(0-1),文本块高度需占页面30%以上 |
area_ratio = text_block_area / page_area
if area_ratio >= min_text_area_ratio: # 默认 >= 0.25
# 满足面积条件
示例:
width_ratio = text_block_width / page_width
height_ratio = text_block_height / page_height
if (width_ratio >= min_text_width_ratio and
height_ratio >= min_text_height_ratio):
# 满足尺寸条件
示例:
has_table = any(
item.get('category', '').lower() in ['table', 'table_body']
for item in layout_results
)
if has_table:
# 页面已有表格,不进行转换(避免误判)
return layout_results
逻辑:
{
"bbox": [226, 288, 1495, 1685],
"category": "text",
"text": "1、账龄分析\n账龄 期末余额\n1年以内 178,051,695.35\n..."
}
{
"bbox": [226, 288, 1495, 1685],
"category": "table",
"original_category": "text", // 保留原始类别
"text": "1、账龄分析\n账龄 期末余额\n1年以内 178,051,695.35\n..."
}
layout:
convert_large_text_to_table: true
min_text_area_ratio: 0.25 # 25%面积
min_text_width_ratio: 0.4 # 40%宽度
min_text_height_ratio: 0.3 # 30%高度
layout:
convert_large_text_to_table: true
min_text_area_ratio: 0.15 # 降低到15%(更敏感)
min_text_width_ratio: 0.3 # 降低到30%
min_text_height_ratio: 0.2 # 降低到20%
layout:
convert_large_text_to_table: true
min_text_area_ratio: 0.35 # 提高到35%(更严格)
min_text_width_ratio: 0.5 # 提高到50%
min_text_height_ratio: 0.4 # 提高到40%
layout:
convert_large_text_to_table: false # 完全关闭
original_category 字段@staticmethod
def convert_large_text_to_table(
layout_results: List[Dict[str, Any]],
image_shape: Tuple[int, int],
min_area_ratio: float = 0.25,
min_width_ratio: float = 0.4,
min_height_ratio: float = 0.3
) -> List[Dict[str, Any]]:
"""
将大面积的文本块转换为表格
判断规则:
1. 面积占比:占页面面积超过 min_area_ratio(默认25%)
2. 尺寸比例:宽度和高度都超过一定比例(避免细长条)
3. 不与其他表格重叠:如果已有表格,不转换
"""
# 实现逻辑...
# 在 pipeline_manager_v2.py 中
# 2.6 将大面积文本块转换为表格(后处理)
if layout_results:
convert_large_text = self.config.get('layout', {}).get('convert_large_text_to_table', True)
if convert_large_text:
image_shape = (detection_image.shape[0], detection_image.shape[1])
layout_results = LayoutUtils.convert_large_text_to_table(
layout_results,
image_shape,
min_area_ratio=self.config.get('layout', {}).get('min_text_area_ratio', 0.25),
min_width_ratio=self.config.get('layout', {}).get('min_text_width_ratio', 0.4),
min_height_ratio=self.config.get('layout', {}).get('min_text_height_ratio', 0.3)
)
转换时会输出详细日志:
🔄 Converted large text block to table: area=43.6%, size=76.7%×59.8%, bbox=[226, 288, 1495, 1685]
✅ Converted 1 large text block(s) to table(s)
TABLE_BODY_CATEGORIES