最近一段时间我在做一个需求,因为我关注了好几个理财子的公众号,他们偶尔会发一些当前在售的理财产品的清单文章,然后我就想能不能把他们的清单文章里的理财产品的数据以及亮点给汇总起来。

然后我尝试了一些多模态的大模型,正常来说效果是够的,但是有时候碰到一些很长很长的图片就会识别不准。同时token的费用也会较多。因此,当我偶然了解到腾讯云的智能结构化OCR服务时,决定一试其能否提供更好的解决方案。

这篇文章的目的也就是带大家来体验一下 腾讯云智能结构化识别 的,有彦祖可能会问了,这个智能结构化识别和普通的ocr识别有啥区别。官方是这么介绍的:

腾讯云智能结构化OCR产品提供基础与高级版本选项,具备全面的行业覆盖能力,能精确识别包括卡证、物流单据、工业标签、服务合同及医疗报告在内的多种文件;即便在版式多变或中英文混排的情形下,仍可维持高识别精度。借助多模态大模型技术构建键值对应关系,支持客户个性化模板定制,提升数据提取录入效率,适用于政务处理、票据核销、行业表单填写、国际物流管理、人寿保险理赔、AI在线问诊、律师事务所合同审查及供应链合同审核等多种应用场景。

字面意义上来说可以理解为普通ocr加上多模态模型,模型把ocr识别的结果进行了结构化的处理。可能是这样吧,咱先试一试~

我这边选择用腾讯云的python sdk来测试,sdk的地址是这个:https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/tencentcloud/ocr/v20181119/ocr_client.py

官方说支持的python环境是2.7,3.6~3.9,所以我就直接用py3.9开了一个虚拟环境。

价格

目前看来,腾讯云似乎正在举办活动,每月提供一个包含1000次识别的资源包,不过不清楚这一优惠会持续多长时间(在这里感谢一下腾讯云,我的cos目前每个月还有很多的免费资源包~)。根据资费介绍文档,智能结构化识别服务的标准收费为400元/1000次。这样的定价在市场中颇具竞争力,对于需要频繁使用OCR服务的用户来说,成本相对可控。不过,具体费用是否划算还需结合个人或企业的实际需求和使用频率来考量。

安装sdk

安装sdk很快,啪一下就行

pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python

代码

先去腾讯云控制台,右上角的访问管理,添加一个子用户,授权选择 QcloudOCRFullAccess,然后新增api密钥(妥善保管SecretId和SecretKey)

1.png

2.png

然后看看这个文档,看起来接口支持传入图片的url或者base64的地址,不过很好奇这个 PdfPageNumber 参数,看起来接口并没有支持上传pdf文件,也不知道这个有啥用。(咱也不管,目前需求只是识别图片就行)

3.png

OK,接口参数知道了,代码很快就出来了

from tencentcloud.ocr.v20181119 import ocr_client, models
from tencentcloud.common import credential
import os
import json
import base64


#  base 64 编码格式
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")
  
  
def parse_ocr_result(json_data):
    # 解析 JSON 数据
    data = json.loads(json_data)
    # 初始化文本块
    text_block = []
  
    # 添加角度信息
    text_block.append(f"角度: {data['Angle']}")
  
    # 遍历结构列表
    for structural in data['StructuralList']:
        for group in structural['Groups']:
            for line in group['Lines']:
                key = line['Key']['AutoName']
                value = line['Value']['AutoContent']
                text_block.append(f"{key}: {value}")
  
    full_text = ""
    for WordList in data['WordList']:
        full_text += WordList['DetectedText']
  
    text_block.append(full_text)
    # 返回文本块
    return "\n".join(text_block)


def ocr(image_base64):
    cred = credential.Credential(
        "YourSecretId",
        "YourSecretKey")
    ocr = ocr_client.OcrClient(
        credential=cred,
        region="ap-guangzhou",
    )
    req = models.SmartStructuralProRequest()
    req.ImageBase64 = image_base64
    # req.ReturnFullText = True  # 额外的参数都在这里修改
    res = ocr.SmartStructuralPro(req)
    return parse_ocr_result(res.to_json_string(ensure_ascii=False, indent=4))


if __name__ == "__main__":
    base64_image = encode_image("Snipaste_2024-12-16_19-56-16.png")
    print(ocr(base64_image))

验证

以这个图为例(进行了必要的打码处理)

4.png

第一次识别,没有传其他参数,只是传了图片的base64,看看返回结果~

5.png

挺好,返回的数据相较于传统的ocr来说,自动把数据给结构化了,美中不足的是日日变成了 88,然后一般来说管号码叫代码才对~

WordList 没有数据是因为默认是没有开启全文字段的识别。

这次我们开启ReturnFullText等于True

req.ReturnFullText = True

这次全文有了,不过奇怪的是,全文识别出了正确的产品名称,可是上面的结构化数据还是错误的,这点不应该啊,有待改进~

6.png

OK,到这里ocr识别的代码已经跑通,我们来部署一个简单的web服务。

web部署

这里我们选择使用python的fastapi来部署web服务。

首先安装,这个很简单,还是啪一下就好

pip install fastapi uvicorn python-multipart -i https://mirrors.cloud.tencent.com/pypi/simple/
# app.py
import base64
from fastapi import FastAPI, UploadFile, File
from ocr import ocr
app = FastAPI()


@app.post("/ocr")
async def perform_ocr(image: UploadFile = File(...)):
    image_bytes = await image.read()  # 读取图像文件
    image_base64 = base64.b64encode(image_bytes).decode("utf-8")  # 转换为 base64
    response = ocr(image_base64)
    return {
        "code": 200,
        "data": response
    }

启动命令:uvicorn main:app --reload,postman验证一下,work~

7.png

到这里我们简单的体验了腾讯云智能结构化识别,整体用起来比较简单,相对于传统的ocr,多了一层结构化数据的处理。

到这里,本篇已经完结,也欢迎大家在评论区留言,分享你对ocr应用的一些经验和看法~

(本文首发腾讯云开发者社区,公众号:编程挺好玩)

Snipaste_2024-12-07_11-05-00.png