【调用通义千问实现手写文字识别】
1.作者介绍
彭鹏,男,西安工程大学电子信息学院,2024级研究生
研究方向:机器视觉与人工智能
电子邮件:17530520325@163.com
高金年,男,西安工程大学电子信息学院,2024级研究生,张宏伟人工智能课题组
研究方向:机器人与智能装备控制技术
电子邮件:2432529790@qq.com
2.OCR技术介绍
OCR是Optical Character Recognition(光学字符识别)的英文简称,它借助光学与计算机技术,将纸上印刷或手写文字读取并转化为计算机可接受、人类能理解的格式。
图像预处理:在进行文字识别之前,要对带有噪声的文字图像进行处理。以应对纸张的厚薄、光洁度和印刷质量都会造成的文字畸变,断笔、粘连和污点。
字符分割:对文档版面进行分析,首先对每一行进行行分割,再对每一行的文字单独分割。
特征提取:根据字符的结构、笔画等信息,提取能够代表字符的特征。这些特征能够帮助计算机更好地理解字符的形态,为后续的分类识别提供依据。
分类识别:通过深度学习将提取的特征与预定义字库对比,以找出最匹配字符。在分类识别的过程中,模型可以学习到不同字符的特征模式,从而准确地识别出输入图像中的字符。
后处理:对识别结果进行校正、修补和质量评估等处理,以提高识别的准确性和可靠性。
3.通义千问模型
Qwen-VL 是阿里云研发的大规模视觉语言模型。Qwen-VL 可以以图像、文本、检测框作为输入,并以文本和检测框作为输出。
3.1 获取API-KEY
- 访问阿里云百炼页面,注册并登录您的阿里云账号。
- 选择开通“百炼大模型推理”服务,并等待短信确认服务已成功开通。
- 从右上角的小人图标进入个人中心 -> API-KEY ->创建新的API-KEY。请妥善保存生成的API Key。
3.2 调用通义千问模型
1.在左侧列表中选择“模型广场”,找到“图像生成”类别下的“通义千问VL”模型,选择该模型对应的“API调用”按钮。
2.点击“图片+文本输入”,进入文档专区,并点击“文字提取(ORC)”以获取相关代码
3.3 代码实现
1.安装需要的库:在终端输入 pip install openai
注:所下载的openai版本应大于1.0.0,若Python版本低于3.7.0则无法下载相应openai版本,需切换Python版本。
2.在 base64_image = encode_image(“test.jpg”) 一行中输入本地图片的路径。
3.在 api_key=———— 中输入自己的API KEY
3.4 实验代码
pip install openai(在终端输入)
import os
from openai import OpenAI
import base64
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key="*******",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# Base64 编码格式
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
base64_image = encode_image("C:/Users/艾萨克/Desktop/3.JPG")
completion = client.chat.completions.create(
model="qwen-omni-turbo",
messages=[
{
"role": "system",
"content": [{"type": "text", "text": "You are a helpful assistant."}],
},
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url":
{"url": f"data:image/png;base64,{base64_image}"},
},
{"type": "text", "text": "识别图中的文字?"},
],
},
],
# 设置输出数据的模态,当前支持两种:["text","audio"]、["text"]
modalities=["text", "audio"],
audio={"voice": "Cherry", "format": "wav"},
# stream 必须设置为 True,否则会报错
stream=True,
stream_options={"include_usage": True},
)
for chunk in completion:
if chunk.choices:
print(chunk.choices[0].delta)
else:
print(chunk.usage)
3.5 实验结果
输入图片:
运行结果:
3.6 局限性
1.OCR在处理特殊符号、数学公式、化学式等复杂内容时可能会遇到困难。
输入图片:
运行结果:
2. OCR系统通常对标准字体和排版的效果较好,但对于非常规的字体、艺术字或复杂的排版,其识别效果可能会大打折扣