You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需额外API调用的Azure认知服务同步OCR方案问询

Azure Cognitive Services OCR 问题与解决方案

现状与需求

我目前使用Azure认知服务进行图像OCR,已基于Python SDK实现两种方式:

  • 异步方法:调用read启动OCR,再轮询get_read_result获取结果,但每次轮询都会产生额外费用,增加成本
  • 同步方法:使用recognize_printed_text,无需额外调用即可返回结果,但OCR结果的准确性和质量远不如异步方法

寻求以下建议:

  1. 是否存在无需额外调用结果查询API的Azure认知服务同步OCR实现方式?
  2. 提升同步OCR结果准确性的方法
  3. 保证精度前提下降低成本的替代方案

现有实现代码

异步OCR实现

from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from msrest.authentication import CognitiveServicesCredentials
import time

# 替换为Azure门户获取的端点和密钥
endpoint = 'https://....cognitiveservices.azure.com/'
key = '....'

# 设置认证凭据
credentials = CognitiveServicesCredentials(key)

# 创建计算机视觉客户端
client = ComputerVisionClient(endpoint, credentials)

# 待识别的图像URL
url = "https://i.ebayimg.com/images/g/dcYAAOSw~5NlHSbh/s-l960.jpg"

# 调用异步Read API,返回原始HTTP响应以获取操作ID
rawHttpResponse = client.read(url, language="en", raw=True)

# 从响应头中提取操作ID
operationLocation = rawHttpResponse.headers["Operation-Location"]
numberOfCharsInOperationId = 36
operationId = operationLocation[-numberOfCharsInOperationId:]

# 轮询等待OCR完成
while True:
    result = client.get_read_result(operationId)
    print(f"当前状态: {result.status}")
    if result.status not in ['notStarted', 'running']:
        print("OCR处理完成")
        break
    time.sleep(1)

# 提取识别结果
if result.status == OperationStatusCodes.succeeded:
    for line in result.analyze_result.read_results[0].lines:
        print(line.text)
        # print(line.bounding_box) # 可选:打印文本边界框

同步OCR实现

from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from msrest.authentication import CognitiveServicesCredentials

# 替换为Azure门户获取的端点和密钥
endpoint = 'https://....cognitiveservices.azure.com/'
key = ' '

# 设置认证凭据
credentials = CognitiveServicesCredentials(key)

# 创建计算机视觉客户端
client = ComputerVisionClient(endpoint, credentials)

# 待识别的图像URL
url = "https://i.ebayimg.com/images/g/dcYAAOSw~5NlHSbh/s-l960.jpg"

# 指定识别语言
language = "en"

# 调用同步OCR接口
result = client.recognize_printed_text(url, language=language)

# 提取识别结果
for region in result.regions:
    for line in region.lines:
        words = [word.text for word in line.words]
        print(' '.join(words))
        # print(line.bounding_box) # 可选:打印文本边界框

解决方案

1. 无额外查询的高准确率同步OCR是否存在?

目前Azure认知服务中,不存在既具备Read API级别的高准确率、又无需额外查询调用的同步OCR接口。

  • 异步Read API是Azure主推的OCR方案,针对复杂场景(如模糊、倾斜、手写体等)优化,准确率远高于旧的同步接口,但必须通过轮询获取结果
  • 同步的recognize_printed_text属于旧版API,仅针对清晰印刷体优化,准确率有限,但无需额外调用

2. 提升同步OCR(recognize_printed_text)准确性的方法

  • 精准指定语言参数:根据图像文本的实际语言设置language参数(如中文用zh-Hans,英文用en),避免使用默认值导致识别偏差
  • 优化输入图像:
    • 确保图像分辨率不低于300DPI,避免模糊、拉伸或压缩失真
    • 对倾斜图像先做旋转校正,保证文本水平对齐
    • 裁剪图像至仅包含文本的区域,减少背景干扰
  • 增强图像对比度:如果文本与背景对比度低,通过预处理工具(如OpenCV)调整亮度、对比度,突出文本特征
  • 避免复杂背景:尽量使用纯色背景的图像,减少纹理、图案对识别的干扰

3. 保证精度前提下降低成本的替代方案

优化异步Read API的轮询逻辑

  • 调整轮询间隔:无需每秒轮询,可先等待2-3秒(简单图像通常在此时间内完成),之后每2秒查询一次,减少get_read_result的调用次数
  • 批量处理任务:收集一定数量的图像后批量提交异步任务,统一查询结果,避免频繁的单次查询开销

成本控制策略

  • 选择合适的定价层:使用预留实例可降低单位调用成本;针对非核心业务,可选用较低定价层的实例
  • 过滤无效调用:先通过简单的图像分析(如检测图像中是否存在文本),仅对包含文本的图像调用OCR,避免无效请求产生费用
  • 混合方案:对清晰的印刷体图像使用同步API,对复杂场景(模糊、手写、多语言混合)使用异步Read API,平衡准确率与成本

自定义模型优化

如果你的业务场景存在特定字体、格式或领域文本,可训练自定义OCR模型,提升特定场景下的识别准确率,减少不必要的通用识别开销


内容的提问来源于stack exchange,提问作者SoajanII

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:07:08