背景
OCR(Optical Character Recognition,光学字符识别)是一种将图像中的文字转换为机器编码文本的技术。这项技术可以自动读取纸质文档上的文字信息,并将其转换成电子格式,便于编辑、存储和检索。OCR 技术在很多领域都有广泛应用,比如数据录入、文献数字化、辅助阅读设备等。
LLM 助力 OCR 的方式
- 文本理解和后处理:
- 语义理解:LLM 可以帮助 OCR 系统理解识别出的文本内容,从而对错误或模糊的地方进行校正。例如,如果 OCR 系统误读了某个单词,LLM 可以根据上下文来推测正确的单词。
- 格式修复:对于结构复杂的文档,如包含表格、列表等,LLM 能够帮助恢复原始文档的格式,使输出结果更加符合原始文档的结构。
- 多模态信息融合:
- 结合图像识别和自然语言处理能力,LLM 可以处理包含文本和图像的混合内容,实现更高级别的信息提取和理解。
- 特定领域优化:
- 在特定领域(如法律、医学等),LLM 可以通过预训练和微调来优化对专业术语的理解和识别,提高特定领域的 OCR 准确性。
LLM 进行图像识别与传统 OCR 对比时的主要缺点
LLM 的缺点
- 高计算资源需求:
- 训练成本:训练大型语言模型需要大量的计算资源,包括高性能 GPU 和大规模的数据集。这导致训练成本非常高昂。
- 推理成本:即使在模型训练完成后,进行实时推理也需要较高的计算资源,这对于资源有限的设备(如嵌入式系统)来说是一个挑战。
- 数据隐私和安全问题:
- 数据收集:训练 LLM 需要大量的数据,这些数据可能包含敏感信息。收集和使用这些数据需要严格遵守数据隐私和安全法规,增加了合规成本。
- 数据泄露风险:在传输和存储过程中,数据有泄露的风险,特别是在云环境中。
- 模型复杂性和可解释性差:
- 黑盒性质:大型语言模型通常被视为“黑盒”,内部机制难以理解,这在某些需要高度透明和可解释性的应用场景中可能是一个问题。
- 调试困难:由于模型复杂,调试和优化变得更加困难,尤其是在遇到特定问题时。
- 训练时间和成本:
- 长时间训练:训练 LLM 需要大量的时间和计算资源,这在快速迭代和开发周期短的项目中可能是一个瓶颈。
- 持续优化:模型需要定期进行微调和优化,以适应新的数据和应用场景,这增加了维护成本。
- 泛化能力的局限性:
- 特定领域适应:尽管 LLM 具有较强的泛化能力,但在特定领域(如医学、法律等)的性能可能不如专门为这些领域设计的传统 OCR 系统。
- 长尾问题:对于一些罕见或特殊的字符和布局,LLM 可能表现不佳,因为这些情况在训练数据中出现的频率较低。
- 实时性和延迟:
- 响应时间:由于 LLM 的复杂性,实时处理图像和文本的响应时间可能较长,这对于需要快速反馈的应用(如实时翻译、即时通讯等)可能是一个问题。
- 模型大小和存储:
- 大模型占用空间:大型语言模型通常体积庞大,占用较多的存储空间,这在存储资源有限的设备上可能是一个问题。
与传统 OCR 的对比
- 技术成熟度:
- 传统 OCR:已经发展了几十年,技术相对成熟,有许多现成的商业产品和服务,易于集成和使用。
- LLM:虽然近年来取得了显著进展,但仍处于快速发展阶段,技术和工具仍在不断完善中。
- 成本效益:
- 传统 OCR:成本相对较低,适合预算有限的小型企业和个人开发者。
- LLM:初始投资和长期维护成本较高,更适合大型企业和有较高预算的项目。
- 应用场景:
- 传统 OCR:适用于标准化和结构化的文档处理,如发票、表格等。
- LLM:适用于复杂和非结构化的文档处理,如手写笔记、多语言文档等。
识别图型验证码
今天我们来看的场景是 图型验证码识别,使用公网大模型API起成本高效识别图型验证码
提示词
请对这张图片进行OCR识别,并输出最准确的验证码,直接输出识别出的结果字符,不要输出其他内容。
文心一言3.5
识别成功
通义千问2.5
识别成功
通义千问2-VL-开源版-7B
图片理解qwen2-vl-7b
识别成功
关于7B模型
一般来说,7B参数量的模型在推理时可能需要至少8GB到16GB的GPU显存,但这只是一个粗略的估计。为了更准确地评估所需GPU显存,建议参考该模型官方提供的文档或测试环境中的具体要求。如果是在本地运行,还应该考虑是否进行了任何优化措施,比如混合精度训练(使用FP16而非FP32),这可以有效减少所需的显存量。如果您打算进行模型训练而不是简单的推理,那么可能还需要更多的显存来存储梯度信息和其他训练过程中产生的数据。
KIMI
识别成功
Gemini 1.5 Flash
做 OCR 效果非常好,可以在 Prompt 里面定制要输出的格式,并且成本极低。 案例有宝玉反馈其朋友某公司使用第三方的OCR的服务,用来提取发票上的文字为结构化数据。但收费较高.
参考提示词: *** Extract text from the provided image and organize it into a structured JSON format. ***
Google 每天为开发者免费提供15亿个Token,其中 Gemini 1.5 Flash免费套餐包含: - 每分钟15次请求(RPM) - 每分钟100万个Token(TPM) - 每天1,500次Token(RPD) - 免费上下文缓存服务,每小时最多可存储100万个Token - 免费微调 Gemini 1.5 Pro免费套餐包含: - 每分钟2次请求(RPM) - 每分钟32,000个Token(TPM) - 每天50次请求(RPD) 微调模型 text-embedding-004 提供: - 每分钟1,500次请求(RPM) 除了前面说的 API,Google AI Studio 还为开发者提供免费访问,其中 Gemini 1.5 Pro 有 2M Token上下文窗口。 价格页面:https://ai.google.dev/pricing Google AI Studio:https://aistudio.google.com
发票识别示例场景
代码实现
使用代码实现调用大模型API
import os
import json
import base64
import requests
from datetime import datetimeclass AliBailianImageService:
def __init__(self, configuration):
self.configuration = configurationdef get_api_key(self):
# 根据环境变量决定从哪里读取 API Key
dev_environment_variable = os.getenv("ENVIRONMENT")
is_development = not dev_environment_variable or dev_environment_variable.lower() == "development"if is_development:
# 开发环境从配置中读取
api_key = self.configuration.get("DASHSCOPE_API_KEY")
else:
# 生产环境从环境变量读取
api_key = os.getenv("DASHSCOPE_API_KEY")# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key = "sk-xxx"
if not api_key:
print("API Key 未设置。请确保环境变量 'DASHSCOPE_API_KEY' 已设置。")
return Nonereturn api_key
def get_image_base64_string_and_save(self, image_url):
response = requests.get(image_url)
if response.status_code != 200:
raise Exception(f"Failed to download image: {response.status_code}")image_data = response.content
encoded_image = base64.b64encode(image_data).decode('utf-8')# 可选步骤:保存图片到文件
# filename = f"{uuid.uuid4()}.jpg"
# with open(filename, 'wb') as f:
# f.write(image_data)return encoded_image
def send_post_request(self, url, json_content, api_key):
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"Accept": "application/json"
}response = requests.post(url, data=json_content, headers=headers)
response_body = response.textself.write_response_to_log(response_body)
if response.status_code >= 200 and response.status_code < 300:
return response_body
else:
return f"请求失败: {response.status_code}"def write_response_to_log(self, response_body):
log_file_path = "Logs/response.log"
log_dir = os.path.dirname(log_file_path)if not os.path.exists(log_dir):
os.makedirs(log_dir)with open(log_file_path, 'a') as f:
f.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Response Body: {response_body}\n")def get_results(self):
api_key = self.get_api_key()
if not api_key:
return Noneencoded_image = self.get_image_base64_string_and_save(
"http://0.0.0.0/7661454/captchaimage?rnd=0.8717223995099175"
)url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
json_content = {
"model": "qwen2-vl-7b-instruct",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "请对这张图片进行OCR识别,并输出最准确的验证码,直接输出识别出的结果字符,不要输出其他内容。"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{encoded_image}"}}
]
}
]
}json_content_str = json.dumps(json_content)
result = self.send_post_request(url, json_content_str, api_key)
print(result)
return resultif __name__ == "__main__":
# 示例配置
config = {
"DASHSCOPE_API_KEY": "your-api-key-here"
}service = AliBailianImageService(config)
result = service.get_results()
if result:
print("Result:", result)
通义千问2-VL-开源版-2B
通义千问VL模型qwen2-vl-2b-instruct可以根据您传入的图片来进行回答,curl参考
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "qwen-vl-max", "input":{ "messages":[ { "role": "user", "content": [ {"image": "https://img.alicdn.com/imgextra/i2/O1CN01y1lotD1hINrPr60fs_!!6000000004254-0-tps-1384-3024.jpg"}, {"text": "这是什么?"} ] } ] } }'
事实情况下独立部署也可以
测试图片进行识别
返回示例
[2024-11-06 16:14:22] Response Body: {"choices":[{"message":{"content":"\"bafy\"","role":"assistant"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":60,"completion_tokens":6,"total_tokens":66},"created":1730880859,"system_fingerprint":null,"model":"qwen-vl-plus","id":"chatcmpl-5a306496-300c-9815-8c50-35e98f15508d"}
目前仅供免费体验,另一个官方示例是视觉语言模型输出示例
传统OCR工具提取的内容不完整且格式混乱。大模型不仅能精准提取图片中的文字,还能以规整的形式输出。
通义千问团队以Apache 2.0协议开源了Qwen2-VL-2B和Qwen2-VL-7B,开源代码已集成到Hugging Face Transformers、vLLM和其他第三方框架中。开发者可以通过Hugging Face和魔搭ModelScope下载使用模型,也可通过通义官网、通义APP的主对话页面使用模型。
图片理解
视觉理解
Qwen2-VL、Qwen-VL如何使用_大模型服务平台百炼(Model Studio)-阿里云帮助中心
阿里云百炼平台:
https://help.aliyun.com/zh/model-studio/developer-reference/qwen-vl-api
GitHub:
https://github.com/QwenLM/Qwen2-VL
HuggingFace:
https://huggingface.co/collections/Qwen/qwen2-vl-66cee7455501d7126940800d
魔搭ModelScope:
https://modelscope.cn/organization/qwen?tab=model
模型体验:
https://huggingface.co/spaces/Qwen/Qwen2-VL
https://qwen.readthedocs.io/en/latest/benchmark/speed_benchmark.html
总结
我们基于互联网大模型API辅助实现图型验证码识别,如果配合工作流更是简单便捷,同时成本不高, 使得老一代信息系统中图型验证码已存在安全隐患。相比传统OCR识别,能够按要求完善识别后格式。
LLM(Large Language Models,大型语言模型)辅助OCR(Optical Character Recognition,光学字符识别)图片识别具有重要意义,主要体现在以下几个方面:
1、提高信息提取的准确性和效率
OCR技术的局限性:
- OCR技术虽然能够从图像中提取文本信息,但在处理复杂场景时,如具有复杂背景、手写字体、低质量图像等情况,其识别准确性可能会受到影响。
LLM的辅助作用:
- LLM可以对OCR提取的文本进行深入分析,理解其上下文含义,并提取出关键信息。这种分析能力使得LLM能够纠正OCR识别中的错误,提高信息提取的准确性。
- LLM还可以根据用户的提问或需求,对提取的信息进行进一步的筛选和整理,从而提高信息提取的效率。
2、拓展OCR技术的应用场景
传统OCR的应用限制:
传统的OCR技术主要应用于文档扫描、车牌识别等相对简单的场景。
LLM赋能下的OCR应用:
在LLM的辅助下,OCR技术可以应用于更复杂的场景,如自然场景文本识别、手写字体识别等。
此外,LLM还可以结合OCR技术实现定制化的关键信息抽取,满足不同行业和领域的特定需求。
3、推动智能化发展
自动化办公:
- 在办公场景中,LLM与OCR的结合可以实现对文档图片的自动识别、关键信息提取和整理,极大地提高了工作效率。例如,在财务报销流程中,可以自动从发票图片中提取关键信息并录入系统。
智能客服:
- 在智能客服领域,用户可能会通过图片形式发送问题或需求。利用LLM与OCR技术,智能客服可以自动识别图片中的文字信息,并据此给出相应的回答或解决方案。
其他领域:
- 在电商领域,LLM技术可以用于分析商品图片中的关键信息,如品牌、颜色、尺码等,以支持商品推荐和库存管理等决策。
- 在医疗影像分析领域,可以使用OCR技术提取影像中的文字信息,再使用LLM理解影像描述的语义信息,从而实现对病情的自动诊断和分析。
4、技术融合与创新
技术融合:
- LLM与OCR的结合是技术融合的一个典型例子。这种融合不仅提高了信息提取的准确性和效率,还拓展了OCR技术的应用场景。
技术创新:
- 随着LLM技术的不断发展,其在OCR领域的应用也将不断创新。例如,通过引入更先进的深度学习算法和模型结构,可以进一步提高LLM对OCR提取文本的理解和分析能力。
- 最后关注灵活就业新动态,了解更多行业资讯、前沿技术请关注公众号:贤才宝
- (贤才宝https://www.51xcbw.com)