项目地址:https://gitee.com/Shanyalin/pdf-tranlate。
关于机器学习部分的代码没有提交,也不会提交,会在此罗列相关的资料 ,避免我的经验影响了读者的理解。
接上一篇简要介绍了机器学习来识别表格的方案。注意此方案的可行性是有条件限制的,细心的读者会留意到上一篇中有模糊的提到pymupdf中宽度的单位,但始终没有说明确究竟是什么。因为在单一的坐标参考系中,讨论这些意义并不大,反正都是在同一个坐标系中提取或者写入。point的坐标单位有px像素,in英寸, 厘米cm, 毫米mm,磅pt,派卡(约4号铅字)pc;其中1in=2.54cm=25.4mm=72pt=6pc,唯独没有与px的转换标准。这意味着机器翻译给出的point的unit和pymupdf给出的point的unit不一致时,坐标间就可能无法转换。
经实验后发现,pymupdf默认是以px为单位的,以pdf页面的左上角为原点,向右下角递增。机器学习识别表格的模型给出的结果显示,以px为单位,以图片(注意pdf转图片有可能大小不一样)的左上角为原点,向右下角递增。经进一步确认当图片的大小与pdf页面的大小一致时,两边的坐标完全一致,不需要转变坐标系。
机器学习的项目时微软亚洲研究院的项目,地址:TableBank 。 使用的模型是X101。tablebank目前不能再win上安装(应该是没有预编译包,可以尝试自行编译),model zoo说明了相关模型是在Detectron2上被训练的,Detectron2的相关文档上有环境安装的说明文档 。linux或者macos,py3.6以上,pytorch1.7以上,opencv是可选的,所以不限制版本。这个环境说复杂,还是有些复杂的,对于机器学习有一定经验的人来说还是比较简单的。
第一步安装cuda,这个参考nVidia的官方教程。第二步,根据cuda版本安装合适版本的pytorch。第三步,根据pytorch的版本选择安装detectron2。服务器的cuda是10.2的,pytorch和detectron2的安装如下,仅供参考:
pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 -f https://download.pytorch.org/whl/torch_stable.html pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu102/torch1.9/index.html pip install opencv-python
环境安装完毕之后,可以观摩demo.py 和 api的文档,来学习如何调用预训练的模型,以下代码仅供测试学习,初步了解之后可以根据需要进行改造。
from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg import cv2 tablebank = '/Detection/All_X101' # 模型地址 cfg = get_cfg() cfg.merge_from_file(f'{tablebank}/All_X101.yaml') cfg.MODEL.WEIGHTS = f'{tablebank}/model_final.pth' pred = DefaultPredictor(cfg) inputs = cv2.imread("input.jpg") outputs = pred(inputs) boxes = outputs['instances'].pred_boxes.tensor.cpu().numpy() scores = outputs['instances'].scores.cpu().numpy() bbox = [] for i, b in enumerate(boxes): if scores[i] > 0.5: bbox.append([float(x) for x in b]) print(bbox)
当前阶段,将detectron2相关环境部署在服务器,以api的形式提供服务,通过post图片,返回图片上表格的检测结果,用于开发和测试。后期或将表格检测功能集成到表格提取部分,或独立出去以服务的形式存在。以上将现阶段遇到的主要问题都记录下来,或有问题没有提到,以后有新的发展将会继续更新。
over!