经常收到读者后台留言,问如何处理扫描版PDF,怎么把里面的字准确批量提取出来,然后保存为txt,word啥的。今天这篇文章我来探索一种较好的解决方案,提供完整智能体源码,详细操作步骤,确保大家可以复现,感兴趣的可以看看。从我电脑上找了一本《天池比赛》扫描版PDF,扫描版意思就是全是图片,并且图片清晰度不怎地,如下图所示全书365页:下面是使用本文介绍的方法,批量处理这个扫描版PDF,选取第十页的提取结果,左侧图是原版,右侧是提取后保存成word的结果:大家可以对一对,我看了下提取正确率非常高,所以想要处理扫描PDF的可以使用本文方法。一句话总结下这个解决方案:基于 Qwen2.5-VL-7B 多模态大模型构建智能体,自动读取扫描版 PDF,借助图像多模态逐页理解内容,并按阅读顺序整理输出,最终生成结构清晰的 Word 文档。2)基于多模态(Vision-Language)能力理解图片内容,相比传统的OCR识别方法,准确度大大提升;3)全自动化批量处理,放在后台运行,一本书很快就能转化完。有些读者跑这样的模型一回,电脑就热的发烫,心疼电脑。还有些电脑没有GPU,跑起来太慢了。确实也是,在本地跑大模型很耗电脑,没有GPU效率也很慢,最好的方法就是薅一些平台的羊毛,他们提供了远程GPU算力,一般注册刚开始都会送一些券,够用一段时间。比如腾讯云,gpugeek,阿里云,这些平台都提供了GPU算力,其中gpugeek的算力平时经常用,用起来挺友好,送的券现在还没用完。今天就以他家的这个平台,咱们把扫描版PDF直接转出word来,走起。选择一个型号,比如24GB显存跑Qwen2.5-VL-7B,足够了:选择官方镜像,依次选择如下图所示,Miniconda主要为了配置环境:显示运行中,表明镜像创建好了,直接就能开始薅他家的GPU算力了:如下所示,显示为GPU 0,RTX A5000型号:安装torch,transformers等,直接复制下面两行命令执行:pipinstalltorchtorchvision--index-urlhttps://download.pytorch.org/whl/cu121pipinstalltransformerssafetensors 如果要处理视频或多模态任务,再安装opencv-python:
以上环境就安装好了,不需要写代码,只需要执行命令。咱们搞个demo,大家直接复制下面代码,保存为:vl_ocr.pyfromtransformersimportQwen2_5_VLForConditionalGeneration,AutoTokenizer,AutoProcessorfromqwen_vl_utilsimportprocess_vision_info#default oadthemodelontheavailabledevice(s)model=Qwen2_5_VLForConditionalGeneration.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct",torch_dtype="auto",device_map="auto")#Werecommendenablingflash_attention_2forbetteraccelerationandmemorysaving,especiallyinmulti-imageandvideoscenarios.#model=Qwen2_5_VLForConditionalGeneration.from_pretrained(#"Qwen/Qwen2.5-VL-7B-Instruct",#torch_dtype=torch.bfloat16,#attn_implementation="flash_attention_2",#device_map="auto",#)#defaultprocesserprocessor=AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct")#Thedefaultrangeforthenumberofvisualtokensperimageinthemodelis4-16384.#Youcansetmin_pixelsandmax_pixelsaccordingtoyourneeds,suchasatokenrangeof256-1280,tobalanceperformanceandcost.#min_pixels=256*28*28#max_pixels=1280*28*28#processor=AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct",min_pixels=min_pixels,max_pixels=max_pixels)messages=[{"role":"user","content":[{"type":"image","image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",},{"type":"text","text":"请用中文描述这张图片的内容。"},],}]#Preparationforinferencetext=processor.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)image_inputs,video_inputs=process_vision_info(messages)inputs=processor(text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",)inputs=inputs.to("cuda")#Inference:Generationoftheoutputgenerated_ids=model.generate(**inputs,max_new_tokens=128)generated_ids_trimmed=[out_ids[len(in_ids):]forin_ids,out_idsinzip(inputs.input_ids,generated_ids)]output_text=processor.batch_decode(generated_ids_trimmed,skip_special_tokens=True,clean_up_tokenization_spaces=False)print(output_text) 因为本地还没有下载过"Qwen2.5-VL-7B"模型,所以transformers框架自动去Huggingface下载模型的全部权重文件。model.safetensors.index.json是模型的索引文件。model-00001-of-00005.safetensors等这几个是模型的权重分片(大模型通常被切成多个小块,分片下载)。 咱们默认输入如下这个图片,让它理解下这个图的信息: 上传一个300多页的pdf文件到服务器,使用scp命令:scp-P41277ocr_test.pdfroot@你的服务器名字(来源文章一开始复制的登录地址) 提示输入密码后,输入文章一开始登录地方的密码,如下图所示:pipinstallpdf2imagepython-docx 然后安装pdf2image的一个系统依赖包,如下所示:sudoaptupdatesudoaptinstallpoppler-utils 完整代码scanpdf_to_doc.py文件一共89行代码,是的,只需要89行代码就可以实现这样的实用功能:特意找了难度最高的目录页,因为目录页清晰度很差,但是展示效果如下图所示,没有问题,就连页码也都对齐整了:
|