【unstructured】针对unstructured的pdf提取的hi_res策略不能够连接huggingface.co下载模型的问题而选择本地化模型推理部署的方法

unstructured pdf hi_res策略本地推理部署说明

unstructured pdf的hi_res策略如果选用detectron2时有些问题需要关注, detectron2自从2021年到现在很久没有更新。使用如新的python3.12及最新的torch2.3.1去编译源码安装会报错torch找不到的问题导致源码编译安装失败。根据要使用的detectron2及pytorch等需应用的包,综合考量选择首先构建一个虚拟python3.9,版本环境(推荐python3.9而不是其它,不能使用python3.7因此之后使用过程中会用到importlib.metadata但其在python3.8之后才有)以方便安装detectron2及其依赖等。这里的虚拟python环境使用miniconda。

python3.9虚拟环境准备

安装miniconda

miniconda官网

输入如下命令:

$ mkdir -p ~/miniconda3
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
$ bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
$ rm -rf ~/miniconda3/miniconda.sh
$ ~/miniconda3/bin/conda init bash

创建一个conda-env环境

$ conda create --name conda-py39-env python=3.9
$ conda activate conda-py39-env

安装unstructured

背景知识

  • unstructured inference
  • 如下安装过程中会自动下载pytorch的高版本v2.3.1并耗费较长时间。但如果使用hi_res的detectron2,其依赖于较低版本的pytorch,在下面安装detectron2时会介绍。

安装步骤

依次命令行键入如下指令:

$ pip install unstructured
$ pip install unstructured[pdf,local-inference]
$ sudo apt install libmagic-dev
$ pip install poppler-utils
$ sudo apt install tesseract-ocr
$ sudo apt install tesseract-ocr-chi-sim
$ sudo apt install libtesseract-dev pandoc
$ pip install psutil

注意上面的tesseract要单独有一条命令来安装语言包,如安装有问题请参考tesseract及语言包安装

安装detectron2

背景知识

  • detectron2自从2021年到现在很久没有更新,高版本python如3.12不太兼容,推荐基于python3.9
  • detectron2安装方法
  • detectron2要求pytorch>=1.8, python>=3.7
  • [torchvision开源代码](https://github.com/pytorch/vision/)中会给出torch, torchvision与python的版本搭配
  • pytorch旧版本要求 链接中找到pytorch 1.10.1版本的安装命令,使用CUDA11.1

安装detectron2及其依赖torch,torchvision和torchaudio

综上,最终决定选用python=3.9, torch=1.10.1, torchvision=0.11.2, cuda=11.1,键入命令如下:

$ pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html
$ python -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu111/torch1.10/index.html

部署模型

背景知识

  • 使用unstructured的hi_res策略来解析PDF会使用深度学习模型识别文档布局并使用图像识别来提取表格结构信息,会使用多种模型。需要单独下载的模型有:
    • yolox或detectron2等文档布局识别模型;
    • microsoft/table-transformer的模型来识做表格检测、表格结构识别(row,column,不同cell)等以及表格功能性分析(如判别列标题单元格,行标题单元格等);
    • timm的resnet18模型;
  • unstructured的hi_res支持的模型
  • 模型部署在本地来进行本地推理,此种方式需要手动去huggingface.co下载三类模型后将模型放置在代码所在目录。
  • 截止当前unstuctured版本,本地部署timm的resnet18与layout model和microsoft的table transformer model稍不同,其代码不能自动识别本地下载的模型,需要更改unstructured源码以令其正确本地加载模型,下面会介绍。

hi_res策略三种模型本地推理部署

layout model(detectron2及yolox)模型本地推理部署

在代码工作目录新建文件夹:unstructuredio/yolo_x_layout和unstructuredio/detectron2_faster_rcnn_R_50_FPN_3x以存放hi_res的layout解析模型,
huggingface中hi_res模型下载地址下载至少包含yolox及detectron2的两种模型:

  • unstructuredio/yolo_x_layout/yolox_l0.05.onnx
  • unstructuredio/detectron2_faster_rcnn_R_50_FPN_3x/model.onnx

或更多其它基于yolo与detectron2的模型。对于基于detectron2的布局解析模型,可在layout parser model zoo里进行选择Layout Detection Models,这里可以乎略,继续向下看。

microsoft的table-transformer模型本地推理部署

在代码工作目录新建文件夹:microsoft/table-transformer-structure-recognition/,并从huggingface中table-transformer配置下载地址下载。

timm/resnet18.a1_in1k的模型本地推理部署

timm/resnet18.a1_in1k模型下载下载所有内容,并人工将miniconda3/envs/conda-py39-env/lib/python3.9/site-packages/timm/models/_builder.py的line159添加:

load_from="file"
pretrained_loc += "/pytorch_model.bin"

总结

按上述步骤实践之后就可以正常进行local inference了,如上内容全基于发布文章时的条件,大体重点情况如下:

  • unstructured=0.14.9
  • unstructured-inference=0.7.36
  • torch=1.10,1+cu111
  • torchvision=0.11.2+cu111
  • torchaudio=0.10.1+cu111
  • detectron2=0.6+cu111
    有任何问题请详细查看相关官方文档及自行参考unstructured源码。
<think>首先,用户的问题是关于Python错误 "zipfile.BadZipFile: File is not a zip file"。用户提到在运行代码时遇到这个错误,希望找到原因和解决方法。 根据系统指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用(用户提供的引用[1][2][3])。 用户提供的引用: - [^1]: 描述了在Flask框架开发中遇到这个错误,但没有找到原因。 - [^2]: 提供了在合并Excel表格时遇到错误,排查步骤包括检查路径和过滤临时文件。 - [^3]: 建议使用国内镜像源安装模块。 用户真正的需求是解决 "zipfile.BadZipFile: File is not a zip file" 错误。错误通常发生在尝试打开或读取一个是有效ZIP格式的文件时。 关键点: - 错误原因:Python的zipfile模块试图打开一个文件,但它是有效的ZIP文件。 - 常见场景: - 文件路径错误或文件存在。 - 文件损坏。 - 文件是临时文件(如Excel的临时文件,以.~开头)。 - 文件是ZIP格式(如Excel文件是Office Open XML格式,但可能被误处理)。 - 解决方法: - 检查文件路径是否正确。 - 确保文件存在且可读。 - 验证文件是否是有效的ZIP文件(例如,使用文件浏览器或命令行工具)。 - 在代码中过滤掉临时文件。 - 使用正确的库处理特定文件类型(如使用openpyxl或pandas处理Excel文件)。 回答结构: 1. **解释错误原因**:简要说明错误是什么。 2. **常见原因分析**:列出可能导致错误的几个原因。 3. **解决方法步骤**:提供逐步的排查和解决方法。 4. **代码示例**:如果需要,给出代码示例。 5. **生成相关问题**:在末尾添加相关问题。 引用应用: - 引用[^2]中提到过滤临时文件的方法,可以在回答中引用。 - 引用[^3]中提到使用国内镜像源,但可能直接相关,除非用户提到安装问题。 最终回答应使用中文,结构清晰。</think>### zipfile.BadZipFile: File is not a zip file 解决方法 当您在Python中运行代码时遇到 `zipfile.BadZipFile: File is not a zip file` 错误,这通常表示 `zipfile` 模块尝试打开或读取一个文件,但该文件是有效的ZIP格式。该错误可能由多种原因引起,包括文件路径错误、文件损坏、临时文件干扰或文件格式兼容。下面我将逐步解释原因并提供解决方法,帮助您快速排查和修复问题。 #### 错误原因分析 1. **文件路径错误或文件存在**:代码中指定的文件路径正确,或文件已被移动/删除。 2. **文件损坏或无效**:目标文件可能损坏(如下载中断)或根本是ZIP文件(如Excel文件可能被误识别)。 3. **临时文件干扰**:某些应用程序(如Excel)会生成临时文件(如以 `.~` 开头的文件),这些文件是有效的ZIP格式,但可能被错误地包含在文件列表中[^2]。 4. **文件格式兼容**:尝试用 `zipfile` 打开非ZIP文件(如Office文档),尽管Office文件(.xlsx, .docx)内部使用ZIP压缩,但直接处理时需特定库。 5. **环境问题**:Python库安装完整或损坏(较少见)。 #### 逐步解决方法 请按顺序尝试以下步骤,大多数情况下问题能在前几步解决: 1. **检查文件路径和存在性**: - 确保代码中指定的文件路径正确无误。使用 `os.path.exists()` 验证文件是否存在。 - 示例代码: ```python import os file_path = "your/file/path.xlsx" # 替换为您的文件路径 if not os.path.exists(file_path): print(f"错误:文件存在或路径错误: {file_path}") else: print(f"文件存在: {file_path}") ``` 2. **过滤临时文件**: - 在读取文件夹时,排除临时文件(如以 `.~` 开头的文件)。这是常见原因,尤其在处理Excel文件时[^2]。 - 修改代码示例: ```python import os folder_path = "your/folder/path" # 只获取.xlsx文件,并排除临时文件 file_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith('.xlsx') and not file.startswith('.~')] # 添加过滤条件 print(file_paths) # 检查过滤后的文件列表 ``` 3. **验证文件完整性**: - 手动检查文件是否为有效的ZIP格式: - 在命令行运行:`unzip -t yourfile.zip`(Linux/Mac)或使用7-Zip工具(Windows)。 - 如果文件损坏,尝试重新下载或恢复。 - 对于Office文件(如.xlsx),使用专用库(如 `openpyxl` 或 `pandas`)代替 `zipfile`: ```python import pandas as pd df = pd.read_excel("yourfile.xlsx") # 正确读取Excel文件 ``` 4. **检查代码逻辑**: - 确保您没有意外地将非ZIP文件传递给 `zipfile.ZipFile()`。 - 示例修复: ```python from zipfile import ZipFile try: with ZipFile("yourfile.zip", 'r') as zip_ref: # 确保文件是ZIP格式 zip_ref.extractall("target_dir") except Exception as e: print(f"解压失败: {e}") ``` 5. **更新或重装Python库**: - 如果问题与库损坏相关,使用国内镜像源重新安装相关模块(如 `pandas`, `openpyxl`)[^3]: ```bash pip install pandas openpyxl -i https://mirrors.aliyun.com/pypi/simple ``` #### 常见场景示例 - **Excel文件处理**:如果您在合并Excel表格时出错,确保过滤临时文件并使用 `pandas`(见步骤3)。 - **Flask应用开发**:如果错误在Flask中出现,检查上传文件的处理逻辑,避免直接操作非ZIP文件[^1]。 通过以上步骤,大多数 `zipfile.BadZipFile` 错误都能解决。如果问题仍存在,请提供更多上下文(如代码片段),我会进一步协助分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值