type
Post
status
Published
date
Mar 1, 2023
slug
summary
tags
category
icon
password
腾讯云官方文字识别API文档地址:API Explorer - 云 API - 控制台 (tencent.com) 集成API文档地址:http://ocr.cbnxzs.com:8052/docshttp://ocr.cbnxzs.com:8052/redoc

1 腾讯云官方API使用方法

腾讯云官方的文档藏得比较深,不容易找到,可以直接点击链接API Explorer - 云 API - 控制台 (tencent.com)来找到腾讯云的官方文档。

1.1 腾讯云服务SDK

腾讯云官方的API使用集成在腾讯云SDK中,在使用这些API之前首先需要下载腾讯云的开发SDK,下载地址云产品SDK中心_云产品SDK文档-腾讯云 (tencent.com),在左边的产品中选择“人工智能-文字识别”,然后在右边选择响应语言的SDK下载即可。

1.2 调用代码生成

API Explorer - 云 API - 控制台 (tencent.com)页面,在中间的表单里输入相应的信息,在右边选择对应的语言,即可生成调用代码。
这里有一个必须要输入的参数Region,一般选择华东地区(上海),然后左边的参数可以选填ImageBase64或者ImageUrl,两者选其中一种即可,如果选择的图片存储在本地,一般选择ImageBase64方法,在这之前需要将图片使用Base64编码成字符串。

1.3 获取密钥

在生成的代码部分有"SecretId", "SecretKey"两个字段需要替换为自己的账户的密钥。在访问密钥 - 控制台 (tencent.com)这个页面可以新建密钥,然后修改对应的生成代码的部分即可完成调用。

1.4 提取文字

调用的响应结果包含图像中的很多信息,但是只有文本信息是我们需要的,这个时候就需要对json进行操作,提取其中的文本信息。例如,某个输出示例:
{    "Response": {        "Angel": 359.989990234375,        "Language": "zh",        "PdfPageSize": 0,        "RequestId": "f50122de-c766-4fdc-90e5-73a984a259cb",        "TextDetections": [           {                "AdvancedInfo": "{\"Parag\":{\"ParagNo\":1}}",                "Confidence": 100,                "DetectedText": "Sun",                "ItemPolygon": {                    "Height": 35,                    "Width": 74,                    "X": 464,                    "Y": 100               },                "Polygon": [                   {                        "X": 464,                        "Y": 100                   },                   {                        "X": 538,                        "Y": 100                   },                    ...               ],                ...           },            ...       ],        ...   },    ... }
我们需要提取DetectedText字段的内容,具体实现方式不唯一,可以自己尝试解决,或者直接保持返回的信息。

2 集成OCR服务API

集成OCR服务API目前集成了两种OCR模型:来自腾讯云的付费印刷体识别与来自百度的开源PaddleOCR模型,两种模型调用的API保持一致,需要使用POST请求将图片的base64编码放在请求体中发送请求,可以得到最终识别结果的字符串。此外,还增加了图像增强服务,对拍照所产生的图片进行增强,再使用OCR模型进行识别,这样准确率更高。
💡
预计在不久的将来会增加更多支持的模型。
整个服务的架构可以用以下的结构图来表示:
notion image
本项目中的API是指REST API,REST API 也称为 RESTful API,是遵循 REST 架构规范的应用编程接口(API 或 Web API),支持与 RESTful Web 服务进行交互。REST 是表述性状态传递的英文缩写。
当客户端通过 RESTful API 提出请求时,它会将资源状态表述传递给请求者或终端。该信息或表述通过 HTTP 以下列某种格式传输:JSON(Javascript 对象表示法)、HTML、XML、PHP 或纯文本。JSON 是最常用的编程语言配置文件格式,尽管它的名字英文原意为“JavaScript 对象表示法”,但它适用于各种语言,并且人和机器都能读。
你可以在任何平台(操作系统)、任何编程语言中使用REST API,它基于HTTP请求,大部分语言都内置了网络库(C/C++除外),可以方便地使用REST API而不需要安装额外的第三方库。
集成OCR服务API中不仅部署了PaddleOCR模型,使它可以用REST API 的方式调用,还封装了腾讯云OCR识别API为REST API,这样在调用腾讯云接口时,就不需要安装腾讯云的SDK了。

2.1 PaddleOCR 模型

PaddleOCR模型来自于PaddleOCR项目
本项目使用了PaddleOCR中的文本检测模型、方向分类器和文本识别模型,先识别出每个文本的文本框,再对每个文本框内文字的方向进行识别,修正方向后再使用文本识别模型识别出文本。这样对于同一张图片中,文本的方向不同的情况下有非常好的识别效果。
本项目使用了PaddleOCR的中文和英文识别模型,只能识别出中文和英文字符,对其他语言的字符不能很好地识别,如果需要接入对其他语言的支持,请在第三部分部署集成OCR模型API中自行修改相关代码。
集成OCR服务API中PaddleOCR 的请求地址为 http://ocr.cbnxzs.com:8052/api/paddle

2.2 腾讯云通用印刷体识别API

腾讯云文字识别(Optical Character Recognition,OCR)基于腾讯优图实验室的深度学习技术,将图片上的文字内容,智能识别成为可编辑的文本。OCR 支持身份证、名片等卡证类和票据类的印刷体识别,也支持运单等手写体识别,支持提供定制化服务,可以有效地代替人工录入信息。
可在以下网页体验腾讯云的OCR功能:
本项目中集成封装的腾讯云OCR服务为通用印刷体识别,识别语言为中英文混合。
集成OCR服务API中TencentOCR 的请求地址为http://ocr.cbnxzs.com:8052/api/tencent
👉
腾讯云OCR服务为付费服务,集成OCR服务API中包含了少量使用次数,请谨慎使用腾讯云OCR服务,如果非必要,请尽量使用PaddleOCR服务。

2.3 图像增强服务

图像增强服务来自本人的另一个项目
图片增强主要分为以下步骤进行:
  1. 使用高斯滤波去除噪声、使用膨胀操作使边缘更清晰、使用Candy算子进行边缘检测;
  1. 找出图片边缘中的最大轮廓、凸包拟合轮廓边缘、自适应排序找出最大四边形;
  1. 对原图进行透视变换,使最大四边形编程图像主体;
  1. 使用自适应二值化对图片进行锐化增强。
图片增强服务可以对图片进行矫正增强,例如下面这个例子:
notion image
进行图像增强后的图像为:
notion image
使用图像增强服务,只需要在对应的OCR服务请求参数中加入以下参数:
{ enhance: true, }
注意:图像增强服务仅适用于图片中有明显四边形边界的图像,否则可能造成意想不到的结果。

2.4 图片的Base64编码

图片的Base64编码指的是一种将图片数据转换成文本字符串的方法。具体而言,Base64编码将每3个字节的原始二进制数据转换成4个字符的文本字符串,这些字符都来自于一个64字符的字符表(包括大小写字母、数字和符号)。
例如,一张300x200像素的位图图片,如果使用24位色深,则它的大小为300x200x3 = 180,000个字节。如果对这个图片进行Base64编码,将得到一个240,000个字符的文本字符串。这个文本字符串可以直接在HTML、CSS和JavaScript等上下文中使用,而不需要传输二进制文件,从而具有更好的兼容性和可移植性。
在网页开发中,Base64编码常常用于在CSS中嵌入图片、在HTML中内联图片、或者在JavaScript中预加载图片等场景。
以下工具可以体验将一张图片转换为Base64编码:

2.5 HTTP请求

HTTP请求是一种客户端向服务器发送请求,以获取特定资源的协议。在Web开发中,HTTP(超文本传输协议)是用于在客户端和服务器之间传输数据的标准通信协议。
HTTP请求通常由客户端发起,发送给服务器,请求服务器返回需要的资源,如文本、图像、视频文件等。请求通常由一个请求报文组成,该报文包含了请求的类型(GET、POST、PUT、DELETE等)、请求的路径、请求头以及可选的请求主体。
服务器收到请求后,通过处理请求报文,查找请求的资源并将响应发送回客户端。响应通常由一个响应报文组成,该报文包括响应的状态码、响应头以及可选的响应主体。
常见的HTTP请求方法有:
  • GET:从服务器获取资源,不含请求主体。
  • POST:向服务器提交数据,可能包含请求主体。
  • PUT:像服务器上传新的数据,可能包含请求主体。
  • DELETE:从服务器删除指定资源,可能包含请求主体。
HTTP请求的过程就是客户端和服务器之间通过HTTP协议通信、交流和传输资源的整个流程。

2.6 集成OCR服务API调用

调用OCRAPI主要分为两步:进行Base64编码和发送请求。
以PaddleOCR模型为例,需要向地址http://ocr.cbnxzs.com:8052/api/paddle发送一个POST请求,请求体的构成如下:
{ img: "待识别图片的Base64编码", enhance: false, }
你可以使用以下工具体验集成OCR服务API的调用:
以下是常用的开发编程语言对集成OCR服务API的调用实例:

2.6.1 Python

Python仅仅需要一个第三方包 requests,如果你使用Anaconda的话,甚至自带了这个包。
import base64 import requests import json # Base64编码 img_path = "the/path/of/image" with open(img_path, 'rb') as f:    img_raw = f.read()    img_b64 = base64.b64encode(img_raw) # 发送请求 res = requests.post(url="http://ocr.cbnxzs.com:8052/api/paddle", data=json.dumps({ "img": "data:image/jpeg;base64," + img_b64.decode(), "enhance": False })) text = res.text

2.6.2 Node.js

Node.js 需要 fsaxios两个包,可以通过npm install xxx或者 yarn add xxx来安装这些包,当然你也可以用其他类似的包来实现调用。
// ECMAScript import axios from "axios"; import fs from "fs"; // Base64编码 let img_raw = fs.readFileSync("the/path/of/image"); let img_b64 = img_raw.toString('base64'); // 发送请求 axios.post("http://ocr.cbnxzs.com:8052/api/paddle", { img: "data:image/jpeg;base64,"+img_b64, enhance: false, }).then((res) => {    console.log(res.data) })

2.6.3 JAVA

Java需要第三方包com.alibaba.fastjson2.JSONObject
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; import com.alibaba.fastjson2.JSONObject; public class demo { public static String img2base64(String path) throws IOException { File file = new File(path); InputStream inputStream = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; inputStream.read(buffer); inputStream.close(); // 将图片转换为 Base64 编码的字符串 String imageBase64 = Base64.getEncoder().encodeToString(buffer); return imageBase64; } public static void main(String[] args) throws Exception { // 创建 URL 对象 URL url = new URL("http://ocr.cbnxzs.com:8052/api/paddle"); // 打开连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); // 设置请求头信息 connection.setRequestProperty("Content-Type", "application/json"); // 启用输出流,向服务器发送数据 connection.setDoOutput(true); String imgPath = "the/path/of/image"; String base64Img = img2base64(imgPath); // 创建 JSON 请求数据 JSONObject jsonObject = new JSONObject(); jsonObject.put("img", base64Img); jsonObject.put("enhance", false); String requestBody = jsonObject.toJSONString(); // 发送请求数据 try(OutputStream os = connection.getOutputStream()) { byte[] input = requestBody.getBytes("utf-8"); os.write(input, 0, input.length); } // 读取响应 try(BufferedReader br = new BufferedReader( new InputStreamReader(connection.getInputStream(), "utf-8"))) { StringBuilder response = new StringBuilder(); String responseLine = null; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println(response.toString()); } } }

2.6.4 .NET

using System.Net.Http; HttpClient client = new HttpClient(); byte[] img_raw = File.ReadAllBytes("the/path/of/image"); string img_b64 = Convert.ToBase64String(imgBytes); var values = new Dictionary<string, string> { { "img", img_b64 }, { "enhance", false } }; string url = "http://ocr.cbnxzs.com:8052/api/paddle"; var data = new FormUrlEncodedContent(values); var response = await client.PostAsync(url, data); string responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString);

2.6.5 Golang

package main import ( "bytes" "encoding/base64" "encoding/json" "fmt" "io/ioutil" "net/http" "unsafe" ) func main() { // 读取本地图片文件 fileData, err := ioutil.ReadFile("the/path/of/image") if err != nil { panic(err) } // 将图片文件转换成base64编码 imageBase64 := base64.StdEncoding.EncodeToString(fileData) //在这里编辑Json串 song := make(map[string]string) song["img"] = imageBase64 song["enhance"] = false bytesData, _ := json.Marshal(song) res, err := http.Post("http://ocr.cbnxzs.com:8052/api/paddle", "application/json;charset=utf-8", bytes.NewBuffer([]byte(bytesData))) if err != nil { fmt.Println("Fatal error ", err.Error()) } defer res.Body.Close() content, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println("Fatal error ", err.Error()) } str := (*string)(unsafe.Pointer(&content)) //转化为string,优化内存 fmt.Println(*str) }

3 自定义集成OCR服务API部署

如果你不满足于已有的集成OCR服务API,想要自己添加功能,或者是想结合到自己的服务端内,你可以自己来定制、部署属于自己的集成OCR服务API。
当然,本项目是基于Docker运行的,它不仅支持 Linux 系统,它还能很好地支持Windows、macOS等系统,借助Docker容器技术,部署起来非常方便。
💡
值得注意的是,部分OCR识别模型,例如PaddleOCR,它仅支持X86_64架构的CPU,而不支持ARM架构的CPU,这对跨平台性可能有一点影响。
本项目的地址:
本项目基于TencentOCR API 和 PaddleOCR, 使用FastAPI 开发,集成了两种API的使用方法,并在Docker中部署,部署过程简单方便。

3.1 配置腾讯云密钥

修改目录ocrapi/config.example.py 修改完内容后,将文件名改为config.py

3.2 编译Docker镜像

如果你没有安装Docker,请参考官方文档
在本项目根目录,使用以下命令就可以编译镜像
docker build -t saocr .
此命令会自动下载相关依赖,并且在任何环境下都不会报错,不过,可能需要等待一会......

3.3 启动Docker容器

使用以下命令
docker run -d -p 8000:8000 saocr
至此,集成OCR服务API部署完成。

致谢

感谢某位同学的DNS(域名解析服务)支持。
Qt 在线安装Friedman检验法