扫描的合同倾斜 3 度,直接送模型读表格,每行金额和项目名错开一列,20 页人工核了两个小时,换成手机拍的反而更准。

一开始怀疑是「分辨率只有 150dpi,小字不足 8 像素」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。没有做倾斜与透视校正,行被切斜。少数情况下是表格线被当成文字一起识别。

另外,双栏排版被按整行读取。

做纠偏再识别

magick scan.png -deskew 40% -sharpen 0x1 fixed.png

随后把分辨率提到 300dpi 并转灰度

magick scan.png -density 300 -colorspace Gray -resize 200% big.png

然后按列切分后再逐块送模型

python split_columns.py --image big.png --cols 2 --out tiles/

等前面都确认过,再抽查金额列与合计是否一致

python verify_table.py --csv result.csv --sum-field amount

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

恢复的判定其实很直接。识别出的行与表格列对齐,金额合计与页脚一致,错位行数为零。

这里还有个坑。倾斜 3 度在肉眼几乎看不出,但足以让 50 行的表格整体漂一列,识别前先纠偏比换模型有效。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189