该库用于计算TEDS指标,用来评测表格识别算法效果。可与table_rec_test_dataset配套使用。
TEDS计算代码参考:PaddleOCR 和 DAVAR-Lab-OCR
pip install table_recognition_metric
- Usage:
$ table_recognition_metric -h usage: table_recognition_metric [-h] [-steds] [-gt GT_HTML] [-pred PRED_HTML] options: -h, --help show this help message and exit -steds, --structure_only -gt GT_HTML, --gt_html GT_HTML -pred PRED_HTML, --pred_html PRED_HTML
- Example:
$ table_recognition_metric -gt '<html><body><table><tr><td>购买方</td><td colspan="5">纳税人识别号地址、电记开户行及账号</td><td>密码区</td><td colspan="4"></td></tr><tr><td colspan="2">货物或应税劳务、服务名称理肤泉清痘旅行装控油祛痘调节水油平衡理肤泉特安舒缓修护乳40ml合计</td><td>规格型号</td><td>单位</td><td>11</td><td colspan="3"></td><td></td><td>税率17%17%</td><td></td></tr><tr><td colspan="2">价税合计(大写)</td><td colspan="9"></td></tr><tr><td>销售方</td><td colspan="5">纳税人识别号地址、电话开户行及账号</td><td>备注</td><td colspan="4"></td></tr></table></body></html>' -pred '' # 0.0
Note
如果只需要计算Struct-TEDS,只需在声明TEDS实例时,传入参数structure_only=True
即可,默认该参数为False
,即计算TEDS. e.g.
teds = TEDS(structure_only=True)
from table_recognition_metric import TEDS
teds = TEDS()
gt_html = '<html><body><table><tr><td>购买方</td><td colspan="5">纳税人识别号地址、电记开户行及账号</td><td>密码区</td><td colspan="4"></td></tr><tr><td colspan="2">货物或应税劳务、服务名称理肤泉清痘旅行装控油祛痘调节水油平衡理肤泉特安舒缓修护乳40ml合计</td><td>规格型号</td><td>单位</td><td>11</td><td colspan="3"></td><td></td><td>税率17%17%</td><td></td></tr><tr><td colspan="2">价税合计(大写)</td><td colspan="9"></td></tr><tr><td>销售方</td><td colspan="5">纳税人识别号地址、电话开户行及账号</td><td>备注</td><td colspan="4"></td></tr></table></body></html>'
pred_html = '<html><body><table><tr><td>购买方</td><td colspan="5">纳税人识别号地址、电记开户行及账号</td><td>密码区</td><td colspan="4"></td></tr><tr><td colspan="2">货物或应税劳务、服务名称理肤泉清痘旅行装控油祛痘调节水油平衡理肤泉特安舒缓修护乳40ml合计</td><td>规格型号</td><td>单位</td><td>11</td><td colspan="3"></td><td></td><td>税率17%17%</td><td></td></tr><tr><td colspan="2">价税合计(大写)</td><td colspan="9"></td></tr><tr><td>销售方</td><td colspan="5">纳税人识别号地址、电话开户行及账号</td><td>备注</td><td colspan="4"></td></tr></table></body></html>'
score = teds(gt_html, pred_html)
print(score)
# 1.0
- 这里以
rapid-table
在表格数据集table_rec_test_dataset上的评测代码,大家可以以此类推。 - 安装必要的包
pip install datasets pip install rapid_table pip install rapidocr_onnxruntime pip install table_recognition_metric
- 运行测试
import numpy as np from datasets import load_dataset from rapid_table import RapidTable from tqdm import tqdm from table_recognition_metric import TEDS dataset = load_dataset("SWHL/table_rec_test_dataset") test_data = dataset["test"] table_engine = RapidTable() teds = TEDS(structure_only=True) content = [] for one_data in tqdm(test_data): img = one_data.get("image") gt = one_data.get("html") pred_str, _, _ = table_engine(np.array(img)) scores = teds(gt, pred_str) content.append(scores) avg = sum(content) / len(content) print(f"TEDS: {avg:.5f}")
-
TEDS是IBM在论文《Image-based table recognition: data, model, and evaluation》中提出的。
-
之前提出的评测算法,主要是将一个表格的
ground truth
和recognition result
各自展平为非空cell两两之间的邻接关系列表。然后通过比较这两个列表,来计算precision, recall和F1-score。该metric主要存在两个明显问题:- 由于它只检查非空单元格之间的直接邻接关系,因此它无法检测由空单元格和超出直接邻居的单元格未对齐引起的错误;
- 由于它通过精准匹配来检查关系,因此它没有衡量fine-grained单元格内容识别性能的机制。
-
针对以上问题,TEDS通过以下方法予以解决:
- 通过在全局树结构级别检查识别结果,使其能够识别它识别所有类型的结构错误,来解决上述问题1;
- 当tree-edit的操作是节点替换时,计算对应的字符串编辑距离,来解决上述问题2。
-
计算公式:
$$TEDS(T_{a}, T_{b}) = 1 - \frac{EditDist(T_{a}, T_{b})}{max(|T_{a}|, |T_{b}|)}$$ 其中,
$EditDist$ 指的是tree-edit distance,$|T|$ 指的是在$T$ 中节点的数量。一个表格还原算法在一系列测试集上识别效果可以定义为:测试集中所有样例逐个计算其ground truth和predict result之间的TEDS,最终对所有样例的TEDS求均值得到最终得分。
- 显示添加计算S-TEDS指标参数