Phi-3-Vision-128K大模型,AI助力OCR,文档处理更上一层楼

发布于 2024-10-15 14:17
浏览
0收藏

1 Phi-3-Vision-128K-Instruct 简介

Phi-3-Vision-128K-Instruct 属于 Phi-3 模型家族,专为多模态数据处理而构建,支持长达 128,000 个令牌的上下文长度。该模型融合了文本和视觉数据,非常适合需要同时解释文本和图像的任务。其开发涉及 5000 亿个训练令牌,包括高质量的合成数据和经过严格筛选的公开可用资源。此外,通过监督微调和偏好优化等精细训练手段,Phi-3-Vision-128K-Instruct 被打造成能够提供精确、可靠且安全的人工智能解决方案。

Phi-3-Vision-128K-Instruct 拥有42亿个参数,其架构精巧,集成了图像编码器、连接器、投影器以及 Phi-3 Mini 语言模型,使其成为轻量级但功能强大的选择,适用于广泛的应用。

2 应用场景

Phi-3-Vision-128K-Instruct 模型的应用范围广泛,主要聚焦在以下几个核心领域:

1). 文档提取和OCR技术:能够高效地将图像中的文字或扫描的文档转换成可编辑的格式,尤其擅长处理包含表格、图表等复杂布局的文档。这使其成为数字化纸质文档或自动化数据提取工作流程的有价值工具。

2). 图像内容理解:该模型能够解析图像内容,识别出图像中的对象,理解场景,并从中提取出有用的信息。

3). 资源受限环境:即使在计算能力或内存受限的环境下,Phi-3-Vision-128K-Instruct 也能够运行AI任务,确保性能不打折。

4). 实时应用场景:能够减少实时应用程序中的处理延迟,适用于实时数据流、聊天助手或流媒体内容分析等场景,以提高响应速度。

3 部署 Phi-3-Vision-128K-Instruct

要使用 Phi-3-Vision-128K-Instruct,需要设置所需的库和工具的开发环境。该模型集成在 Hugging Face transformers 库的开发版本(4.40.2)中。在深入代码示例之前,先确保你的 Python 环境配置了这些包:

# 所需包
flash_attn==2.5.8
numpy==1.24.4
Pillow==10.3.0
Requests==2.31.0
torch==2.3.0
torchvision==0.18.0
transformers==4.40.2

要加载模型,可以更新本地 transformers 库。

模型加载示例

以下是一个 Python 示例,展示了如何初始化模型并进行推理。使用类和函数来保持代码的清晰性和结构性:

from PIL import Image
import requests
from transformers import AutoModelForCausalLM, AutoProcessor

class Phi3VisionModel:
    def __init__(self, model_id="microsoft/Phi-3-vision-128k-instruct", device="cuda"):
        """
        Initialize the Phi3VisionModel with the specified model ID and device.
        
        Args:
            model_id (str): The identifier of the pre-trained model from Hugging Face's model hub.
            device (str): The device to load the model on ("cuda" for GPU or "cpu").
        """
        self.model_id = model_id
        self.device = device
        self.model = self.load_model()  # 在初始化期间加载模型
        self.processor = self.load_processor()  # 在初始化期间加载处理器
    
    def load_model(self):
        """
        Load the pre-trained language model with causal language modeling capabilities.
        
        Returns:
            model (AutoModelForCausalLM): The loaded model.
        """
        print("Loading model...")
        # 使用自动设备映射和数据类型调整加载模型
        return AutoModelForCausalLM.from_pretrained(
            self.model_id, 
            device_map="auto",  # 自动将模型映射到适当的设备
            torch_dtype="auto",  # 根据设备使用适当的 torch 数据类型
            trust_remote_code=True,  # 允许执行自定义代码以加载模型
            _attn_implementation='flash_attention_2'  # 使用优化的注意力实现
        ).to(self.device)  # 将模型移动到指定的设备
    
    def load_processor(self):
        """
        Load the processor associated with the model for processing inputs and outputs.
        
        Returns:
            processor (AutoProcessor): The loaded processor for handling text and images.
        """
        print("Loading processor...")
        # 使用 trust_remote_code=True 加载处理器,以处理任何自定义处理逻辑
        return AutoProcessor.from_pretrained(self.model_id, trust_remote_code=True)
    
    def predict(self, image_url, prompt):
        """
        Perform a prediction using the model given an image and a prompt.
        
        Args:
            image_url (str): The URL of the image to be processed.
            prompt (str): The textual prompt that guides the model's generation.
        
        Returns:
            response (str): The generated response from the model.
        """
        # 从提供的 URL 加载图像
        image = Image.open(requests.get(image_url, stream=True).raw)
        
        # 为模型格式化输入提示模板
        prompt_template = f"<|user|>\n<|image_1|>\n{prompt}<|end|>\n<|assistant|>\n"
        
        # 处理输入,将提示和图像转换为张量格式
        inputs = self.processor(prompt_template, [image], return_tensors="pt").to(self.device)
        
        # 设置模型响应生成的生成参数
        generation_args = {
            "max_new_tokens": 500,  # 生成的最大令牌数
            "temperature": 0.7,     # 生成的采样温度,以增加多样性
            "do_sample": False      # 禁用采样以获得确定性输出
        }
        print("Generating response...")
        # 使用模型生成输出 ID,跳过输入令牌
        output_ids = self.model.generate(**inputs, **generation_args)
        output_ids = output_ids[:, inputs['input_ids'].shape[1]:]  # Ignore the input prompt in the output
        
        # 解码生成的输出令牌以获得响应文本
        response = self.processor.batch_decode(output_ids, skip_special_tokens=True)[0]
        return response

# 初始化模型
phi_model = Phi3VisionModel()

# 示例预测
image_url = "https://example.com/sample_image.png"  # 示例图像的 URL  
prompt = "Extract the data in json format."  # 指导模型的提示  
response = phi_model.predict(image_url, prompt)  # 获取模型的响应 

print("Response:", response)  # 打印生成的响应

上述代码定义了 Phi3VisionModel​ 类,它抽象了模型的加载和使用,使其更容易集成到你的应用程序中。predict() 方法展示了如何使用自定义提示进行基于图像的推理。

4 OCR 功能测试

为了评估 Phi-3-Vision-128K-Instruct 模型的 OCR 性能,我们选取了一些真实扫描的身份证图像作为测试样本。这些图像质量参差不齐,清晰度也各不相同,给模型带来了不同程度的挑战。目标是展示模型如何能够从具有不同特征的文档中提取文本信息,例如模糊、复杂的背景和不同的文本字体。

图像 1:一本虚构的护照,上面详细记录了个人资料,包括姓名、国籍、出生地、签发日期和有效期。底部有一个可读区域。图像质量高,背景噪音不明显。

输出:

{
  "Type/Type": "P",
  "Country code/Code du pays": "UTO",
  "Passport Number/N° de passeport": "L898902C3",
  "Surname/Nom": "ERIKSSON",
  "Given names/Prénoms": "ANNA MARIA",
  "Nationality/Nationalité": "UTOPIAN",
  "Date of Birth/Date de naissance": "12 AUGUST/AOUT 74",
  "Personal No./N° personnel": "Z E 184226 B",
  "Sex/Sexe": "F",
  "Place of birth/Lieu de naissance": "ZENITH",
  "Date of issue/Date de délivrance": "16 APR/AVR 07",
  "Authority/Autorité": "PASSPORT OFFICE",
  "Date of expiry/Date d'expiration": "15 APR/AVR 12",
  "Holder's signature/Signature du titulaire": "anna maria eriksson",
  "Passport/Passeport": "P<UTOERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<<<<<L898902C36UT07408122F1204159ZE184226B<<<<10"
}

图像 2:一本荷兰护照,上面有清晰的持有人照片和整齐格式化的文本。字段包括护照号码、姓名、出生日期、国籍和有效期。文件以高对比度呈现,文本提取相对直接。底部的可读区域(MRZ)提供了结构化的数据格式,有助于验证提取信息的准确性。

Phi-3-Vision-128K大模型,AI助力OCR,文档处理更上一层楼-AI.x社区

输出:

以下是从护照中提取的完整数据,以 JSON 格式呈现:

{
  "passport": {
    "issuingCountry": "Netherlands",
    "issuingAuthority": "Koninkrijk der Nederlanden",
    "passportNumber": "SPEC12014",
    "issuingDate": "09 MAR 2014",
    "expiryDate": "09 MAR 2024",
    "holder": {
      "gender": "F",
      "nationality": "Netherlands",
      "placeOfBirth": "SPECIMEN",
      "sex": "WF",
      "firstNames": [
        "Willem",
        "Lieselotte"
      ]
    },
    "physicalDescription": {
      "height": "1.75 m",
      "hairColor": "gray",
      "hairLength": "short"
    },
    "issuingOffice": "Burg. van Stad en Dorp",
    "issuingDateAsInt": "14032014",
    "expiryDateAsInt": "14032024",
    "fieldsExtracted": [
      {
        "code": "NL",
        "dateOfBirth": "10 MAR 1965",
        "dateOfIssue": "09 MAR 2014",
        "dateOfExpiry": "09 MAR 2024",
        "firstNames": [
          "Willem",
          "Lieselotte"
        ],
        "nationality": "Netherlands",
        "passportNumber": "SPEC12014",
        "placeOfBirth": "SPECIMEN",
        "sex": "WF"
      }
    ]
  }
}

5 在线体验 Phi-3-Vision-128K-Instruct

如果你想亲自尝试 Phi-3-Vision-128K-Instruct 模型,你可以通过以下链接来体验:https://ai.azure.com/explore/models/Phi-3-vision-128k-instruct/version/1/registry/azureml。这个链接可以体验模型的功能,尝试其 OCR 功能。

Phi-3-Vision-128K大模型,AI助力OCR,文档处理更上一层楼-AI.x社区

6 架构与训练

Phi-3-Vision-128K-Instruct 模型不单是一个语言模型,它是一个强大的多模态工具,能够同时处理视觉和文本数据。这个模型经历了包含5000亿个令牌的综合训练,涵盖了文本和图像数据。其架构巧妙地融合了语言模型和图像处理模块,构建了一个能够理解超过128K令牌上下文的连贯系统,使之能够应对长篇对话或处理大量内容的文档。

得益于在如512 H100 GPU这样的高性能硬件上的训练,以及采用flash attention技术提高内存效率,Phi-3-Vision-128K-Instruct 模型能够轻松驾驭大规模任务。它的训练数据集是合成数据和经过筛选的真实世界数据的混合体,特别强调了数学、编码、常识推理和一般知识,这使模型具有广泛的适用性,能够适应各种不同的应用场景。

7 性能基准

Phi-3-Vision-128K-Instruct 模型的性能已在多个基准测试中进行了测试,这些测试包括 ScienceQA、AI2D、MathVista 和 TextVQA。在涉及文本和视觉信息结合的任务上,该模型的得分普遍超越了众多现有模型,特别是在以下两个方面表现突出:

  • 文档理解能力:Phi-3-Vision-128K-Instruct 能够从复杂的文档如 PDF 或图像中抽取关键信息。
  • 表格和图表理解:该模型能够精确解读图形数据,并将这些数据转换成文字描述。

值得一提的是,在 ChartQA 数据集上,Phi-3-Vision-128K-Instruct 达到了 81.4% 的准确率;在 AI2D 数据集上,也取得了 76.7% 的高分。这些成绩充分证明了模型在理解数据密集型文档方面的强劲实力。

结语

Phi-3-Vision-128K-Instruct 代表的不仅仅是多模态人工智能领域的一次进步,它更是引领我们走向一个文档提取、OCR和AI驱动内容生成无缝衔接、易于操作的未来。得益于其全面的训练、强大的架构和深思熟虑的设计,这一模型赋予了开发者在各个领域革新数据处理方式的能力。

本文转载自 AI科技论谈​,作者: AI科技论谈

收藏
回复
举报
回复
相关推荐