扫描的合同倾斜 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 行的表格整体漂一列,识别前先纠偏比换模型有效。这类问题最好一次改到位,反复小改反而容易把原因搅混。
