Phi-3-Vision-128K大模型,AI助力OCR,文檔處理更上一層樓
1 Phi-3-Vision-128K-Instruct 簡介
Phi-3-Vision-128K-Instruct 屬于 Phi-3 模型家族,專為多模態(tài)數(shù)據(jù)處理而構(gòu)建,支持長達(dá) 128,000 個(gè)令牌的上下文長度。該模型融合了文本和視覺數(shù)據(jù),非常適合需要同時(shí)解釋文本和圖像的任務(wù)。其開發(fā)涉及 5000 億個(gè)訓(xùn)練令牌,包括高質(zhì)量的合成數(shù)據(jù)和經(jīng)過嚴(yán)格篩選的公開可用資源。此外,通過監(jiān)督微調(diào)和偏好優(yōu)化等精細(xì)訓(xùn)練手段,Phi-3-Vision-128K-Instruct 被打造成能夠提供精確、可靠且安全的人工智能解決方案。
Phi-3-Vision-128K-Instruct 擁有42億個(gè)參數(shù),其架構(gòu)精巧,集成了圖像編碼器、連接器、投影器以及 Phi-3 Mini 語言模型,使其成為輕量級(jí)但功能強(qiáng)大的選擇,適用于廣泛的應(yīng)用。
2 應(yīng)用場景
Phi-3-Vision-128K-Instruct 模型的應(yīng)用范圍廣泛,主要聚焦在以下幾個(gè)核心領(lǐng)域:
1). 文檔提取和OCR技術(shù):能夠高效地將圖像中的文字或掃描的文檔轉(zhuǎn)換成可編輯的格式,尤其擅長處理包含表格、圖表等復(fù)雜布局的文檔。這使其成為數(shù)字化紙質(zhì)文檔或自動(dòng)化數(shù)據(jù)提取工作流程的有價(jià)值工具。
2). 圖像內(nèi)容理解:該模型能夠解析圖像內(nèi)容,識(shí)別出圖像中的對(duì)象,理解場景,并從中提取出有用的信息。
3). 資源受限環(huán)境:即使在計(jì)算能力或內(nèi)存受限的環(huán)境下,Phi-3-Vision-128K-Instruct 也能夠運(yùn)行AI任務(wù),確保性能不打折。
4). 實(shí)時(shí)應(yīng)用場景:能夠減少實(shí)時(shí)應(yīng)用程序中的處理延遲,適用于實(shí)時(shí)數(shù)據(jù)流、聊天助手或流媒體內(nèi)容分析等場景,以提高響應(yīng)速度。
3 部署 Phi-3-Vision-128K-Instruct
要使用 Phi-3-Vision-128K-Instruct,需要設(shè)置所需的庫和工具的開發(fā)環(huán)境。該模型集成在 Hugging Face transformers 庫的開發(fā)版本(4.40.2)中。在深入代碼示例之前,先確保你的 Python 環(huán)境配置了這些包:
# 所需包
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 庫。
模型加載示例
以下是一個(gè) Python 示例,展示了如何初始化模型并進(jìn)行推理。使用類和函數(shù)來保持代碼的清晰性和結(jié)構(gòu)性:
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...")
# 使用自動(dòng)設(shè)備映射和數(shù)據(jù)類型調(diào)整加載模型
return AutoModelForCausalLM.from_pretrained(
self.model_id,
device_map="auto", # 自動(dòng)將模型映射到適當(dāng)?shù)脑O(shè)備
torch_dtype="auto", # 根據(jù)設(shè)備使用適當(dāng)?shù)?torch 數(shù)據(jù)類型
trust_remote_code=True, # 允許執(zhí)行自定義代碼以加載模型
_attn_implementation='flash_attention_2' # 使用優(yōu)化的注意力實(shí)現(xiàn)
).to(self.device) # 將模型移動(dòng)到指定的設(shè)備
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"
# 處理輸入,將提示和圖像轉(zhuǎn)換為張量格式
inputs = self.processor(prompt_template, [image], return_tensors="pt").to(self.device)
# 設(shè)置模型響應(yīng)生成的生成參數(shù)
generation_args = {
"max_new_tokens": 500, # 生成的最大令牌數(shù)
"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
# 解碼生成的輸出令牌以獲得響應(yīng)文本
response = self.processor.batch_decode(output_ids, skip_special_tokens=True)[0]
return response
# 初始化模型
phi_model = Phi3VisionModel()
# 示例預(yù)測
image_url = "https://example.com/sample_image.png" # 示例圖像的 URL
prompt = "Extract the data in json format." # 指導(dǎo)模型的提示
response = phi_model.predict(image_url, prompt) # 獲取模型的響應(yīng)
print("Response:", response) # 打印生成的響應(yīng)
上述代碼定義了 Phi3VisionModel? 類,它抽象了模型的加載和使用,使其更容易集成到你的應(yīng)用程序中。predict() 方法展示了如何使用自定義提示進(jìn)行基于圖像的推理。
4 OCR 功能測試
為了評(píng)估 Phi-3-Vision-128K-Instruct 模型的 OCR 性能,我們選取了一些真實(shí)掃描的身份證圖像作為測試樣本。這些圖像質(zhì)量參差不齊,清晰度也各不相同,給模型帶來了不同程度的挑戰(zhàn)。目標(biāo)是展示模型如何能夠從具有不同特征的文檔中提取文本信息,例如模糊、復(fù)雜的背景和不同的文本字體。
圖像 1:一本虛構(gòu)的護(hù)照,上面詳細(xì)記錄了個(gè)人資料,包括姓名、國籍、出生地、簽發(fā)日期和有效期。底部有一個(gè)可讀區(qū)域。圖像質(zhì)量高,背景噪音不明顯。
輸出:
{
"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:一本荷蘭護(hù)照,上面有清晰的持有人照片和整齊格式化的文本。字段包括護(hù)照號(hào)碼、姓名、出生日期、國籍和有效期。文件以高對(duì)比度呈現(xiàn),文本提取相對(duì)直接。底部的可讀區(qū)域(MRZ)提供了結(jié)構(gòu)化的數(shù)據(jù)格式,有助于驗(yàn)證提取信息的準(zhǔn)確性。
輸出:
以下是從護(hù)照中提取的完整數(shù)據(jù),以 JSON 格式呈現(xiàn):
{
"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 在線體驗(yàn) Phi-3-Vision-128K-Instruct
如果你想親自嘗試 Phi-3-Vision-128K-Instruct 模型,你可以通過以下鏈接來體驗(yàn):https://ai.azure.com/explore/models/Phi-3-vision-128k-instruct/version/1/registry/azureml。這個(gè)鏈接可以體驗(yàn)?zāi)P偷墓δ埽瑖L試其 OCR 功能。
6 架構(gòu)與訓(xùn)練
Phi-3-Vision-128K-Instruct 模型不單是一個(gè)語言模型,它是一個(gè)強(qiáng)大的多模態(tài)工具,能夠同時(shí)處理視覺和文本數(shù)據(jù)。這個(gè)模型經(jīng)歷了包含5000億個(gè)令牌的綜合訓(xùn)練,涵蓋了文本和圖像數(shù)據(jù)。其架構(gòu)巧妙地融合了語言模型和圖像處理模塊,構(gòu)建了一個(gè)能夠理解超過128K令牌上下文的連貫系統(tǒng),使之能夠應(yīng)對(duì)長篇對(duì)話或處理大量內(nèi)容的文檔。
得益于在如512 H100 GPU這樣的高性能硬件上的訓(xùn)練,以及采用flash attention技術(shù)提高內(nèi)存效率,Phi-3-Vision-128K-Instruct 模型能夠輕松駕馭大規(guī)模任務(wù)。它的訓(xùn)練數(shù)據(jù)集是合成數(shù)據(jù)和經(jīng)過篩選的真實(shí)世界數(shù)據(jù)的混合體,特別強(qiáng)調(diào)了數(shù)學(xué)、編碼、常識(shí)推理和一般知識(shí),這使模型具有廣泛的適用性,能夠適應(yīng)各種不同的應(yīng)用場景。
7 性能基準(zhǔn)
Phi-3-Vision-128K-Instruct 模型的性能已在多個(gè)基準(zhǔn)測試中進(jìn)行了測試,這些測試包括 ScienceQA、AI2D、MathVista 和 TextVQA。在涉及文本和視覺信息結(jié)合的任務(wù)上,該模型的得分普遍超越了眾多現(xiàn)有模型,特別是在以下兩個(gè)方面表現(xiàn)突出:
- 文檔理解能力:Phi-3-Vision-128K-Instruct 能夠從復(fù)雜的文檔如 PDF 或圖像中抽取關(guān)鍵信息。
- 表格和圖表理解:該模型能夠精確解讀圖形數(shù)據(jù),并將這些數(shù)據(jù)轉(zhuǎn)換成文字描述。
值得一提的是,在 ChartQA 數(shù)據(jù)集上,Phi-3-Vision-128K-Instruct 達(dá)到了 81.4% 的準(zhǔn)確率;在 AI2D 數(shù)據(jù)集上,也取得了 76.7% 的高分。這些成績充分證明了模型在理解數(shù)據(jù)密集型文檔方面的強(qiáng)勁實(shí)力。
結(jié)語
Phi-3-Vision-128K-Instruct 代表的不僅僅是多模態(tài)人工智能領(lǐng)域的一次進(jìn)步,它更是引領(lǐng)我們走向一個(gè)文檔提取、OCR和AI驅(qū)動(dòng)內(nèi)容生成無縫銜接、易于操作的未來。得益于其全面的訓(xùn)練、強(qiáng)大的架構(gòu)和深思熟慮的設(shè)計(jì),這一模型賦予了開發(fā)者在各個(gè)領(lǐng)域革新數(shù)據(jù)處理方式的能力。
本文轉(zhuǎn)載自 ??AI科技論談??,作者: AI科技論談
