使用 Google OCR 服务的正确姿势

文档文本识别现在已经成为一个常见需求,经过调研,Google OCR 的识别准确率最高,信息也最全面,可以精确到每个字符,可以将每个字符的矩形点准确的给出,相对于科大讯飞只能给出单词的矩形要更有优势,下面就来说下如何使用 Google OCR 的服务。

0、必要条件

必要条件:Google账号、visa信用卡、科学上网;

  • Google 账号现在 China 不太好申请,尽量申请一个,可以使用很多的 Google 服务。

  • visa信用卡,其他国际信用卡也可以,不过 visa 卡很容易就可以申请到,支持的银行很多,推荐北京银行,终身免年费。

  • 科学上网,如果你不能科学上网,那么下面的就不用看了,所有一切都是建立在可以科学上网的前提下。

1、进入 Google Cloud 控制台

这个地址可以进入:https://console.cloud.google.com/

通过 google 账号进入之后的第一件事情就是让你绑定结算账户,这时就要用到上面说的 visa 信用卡了,当然不绑定也是可以的,不过有些服务不可以使用。

绑定完成后,此时会提醒你创建一个项目,如果你是新用户,你新创建的项目中会存入 $300 赠金,作为起始资金,可以试用一些付费产品,很多人用这个免费额度创建一个虚拟机来科学上网,增金有效期用一年。

绑定结算账户时会扣 $1 的服务费,如果你开启了一些不可以使用赠金的服务,不用的话要记得关闭,否则可能产生持续扣费,我因此损失了一些港币,所以在这里特别说明一下。

创建的项目就是一个大集合,里面包含了你可以使用的一切服务,所有的服务都是基于这个项目的,我们的示例也将在一个名为 test 的项目中进行演示。

2、OCR服务简单介绍和基本概念
  • OCR

就是文档文字识别服务,你将图片传上去,然后 Google 给你识别里面的文字,将识别结果告诉你,这里我们以手写识别为例。

我们的案例中将要识别的就是下面这张图片(装作是为了测试OCR才写这么丑的字):

下面是 Google OCR 的识别结果:

1
2
3
4
with the development of network, the Internet hos
become an essential tool for not only entertainment
but also study, So, on lae learning has been an
appealing topic .

可以看到最终的识别结果准确度很高。

  • Google OCR 服务费用

查看 官方定价

收费还是很便宜的,并且有免费额度,我们只是做演示和测试,免费额度足够用了。

在 IAM 和管理页面的配额中,可以管理 API 的调用量,设置调用频率和次数。

  • Google OCR 服务验证方式

API Key(密钥):部分 API 支持此方式,就是在请求的 URL 后面加一个 key=xxxx 的参数,Google 推荐当你的使用主体是人时使用此方式,也就是将密钥分发给某些开发者等。

Authorization(不记名令牌):这种方式是在请求头中加入 Authorization 验证,Google 推荐此方式使用在服务器中或者应用和应用之间的相互验证。

ADC(默认凭证):如果你不想使用发送请求的方式,可以直接使用 Google 提供的代码包,里面会包含 Google 的很多服务,内部已经封装好了请求代码,开发者只需要调用相应方法和函数就可以完成任务,ADC 要求将一些密钥数据配置到环境变量,代码包会去自动读取这些数据,因此代码中不需要出现密钥相关代码。

下面就来介绍如何使用这三种方式完成对上面图片的 OCR 识别。

准备 test 项目

首先创建好一个名为 test 的项目,如下图:

然后依次点击【导航菜单】–>【API和服务】–>【库】,这里可以搜索google 提供的所有服务,如下图:

接下来在搜索框中搜索【vision】,可以看到一个 Cloud Vision API 项,点击进入,出现如下图:

点击【启用】按钮即可开启 Vision 服务,启用之后会进入到 Vision 服务的详情页,会提示你需要创建凭据才可以使用此服务,如果看到提示,直接点击跳转即可,如果没有,按照【导航菜单】–>【API和服务】–>【凭据】进入到凭据创建页面。

至此准备工作就完成了,接下来就可以开始创建验证凭据操作了。

接下来的图片中所有的 key 都会以显式的方式展示,演示结束后 test 项目会被我删掉,所以暴露也无妨。

API Key

API Key 可以理解为我们常用的 Token 验证,生成一个验证串,然后接口直接使用这个串完成验证并使用服务,他的生成很简单,如下图:

创建完成之后,放入下面 curl 的 key 参数中即可发起请求,不过这个请求是需要科学上网的,所以使用 Google 的一切前提是可以科学上网。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
curl -X POST \
'https://vision.googleapis.com/v1/images:annotate?key=AIzaSyA3DpmipXrTIvxdS0PNHblZhK3vx-nZJb8' \
-H 'Accept: */*' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Content-Length: 375' \
-H 'Content-Type: application/json' \
-H 'Host: vision.googleapis.com' \
-H 'User-Agent: PostmanRuntime/7.20.1' \
-H 'cache-control: no-cache' \
-d '{
"requests":[
{
"image":{
"source":{
"imageUri":
"https://xxxxxxx/images/ocr.jpg"
}
},
"features":[
{
"type":"DOCUMENT_TEXT_DETECTION",
"maxResults":1
}
],
"imageContext": {
"languageHints":["en"]
}
}
]
}'

使用 postman 请求如果正确拿到返回结果,那么就成功了,如果对速度要求不高,简单测试,那么这种方式已经足够用了。

接下来是比较复杂的两种方式。

Authorization 和 ADC 都是基于服务账号的验证方式,Authorization 比较灵活,不需要安装额外的代码,ADC 有速度优势,但是需要安装额外的 google 代码包。

所以这里要做的第一步就是创建服务账号密钥,这个密钥在后面的两种方式中都要用到。

创建服务账号密钥

还是刚刚创建 API密钥 的页面,点击创建凭据,可以看到【服务账号密钥】项,点击打开新页面,如下图:

这里选择创建一个新的服务账号,然后指定名称,指定账号角色,这个角色可以限制账号所拥有的权限,这里我们选择项目所有者,接着点击创建,会下载一个 json 文件。

json 文件的具体内容对我们来说不需要了解,只需要知道这个文件很重要即可,下面两种验证方式都会用到此文件。

Authorization

此种方式和 API Key 差不多,也是要发请求完成,但不是添加 key 参数,而是在请求头中加入 Authorization 验证字段,下面是创建步骤:

首先在前面的图中可以发现右上角头像左边有一个命令行图表,意思是激活 Cloud Shell,Google 为每一个开发者提供一个云端Shell,你可以将其当做一个简单的命令行服务器使用,并且 Google 会为你保存快照,上面的文件不会丢失,非常方便,我们的创建操作就在这上面进行,如下图,点击之后出现 shell,配置需要一段时间,耐心等待。

接下来就在这里安装 gcloud 工具即可,依次输入下面的命令

1
2
3
4
5
curl https://sdk.cloud.google.com | bash
# 重启 shell:
exec -l $SHELL
# 运行 gcloud init 来初始化 gcloud 环境:
gcloud init

gcloud 安装完成后,需要将上一步创建服务账号时下载的 json 文件上传至 shell 中,通过上图的右边中间位置可以看到三个点的图标,点击即可看到上传文件按钮,上传完成后 ls 查看文件上传是否成功,如图:

接下里开始生成访问令牌:

1
2
3
4
5
# 对服务帐号进行身份验证
gcloud auth activate-service-account --key-file test-b04bc33e12ad.json

# 使用服务帐号获取授权令牌,该命令会返回一个访问令牌值
gcloud auth print-access-token

如图,将访问令牌记录下来:

创建完成之后,放入下面 curl 中即可发起请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
curl -X POST \
https://vision.googleapis.com/v1/images:annotate \
-H 'Accept: */*' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Authorization: Bearer ya29.c.KmO2B0wzpHUfOBvaRhsh1B9AzuZVqbicC2W_Kbxa7ByKSnb_pH0dvhnbTJRU9R0OZzc72u_2KK-KxpJtI7waol13K8yxGn1DRfzjxwrl1n1vBBcmlT3CtUYfO20k0uvIUfzh01k' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Content-Length: 375' \
-H 'Content-Type: application/json' \
-H 'Host: vision.googleapis.com' \
-H 'User-Agent: PostmanRuntime/7.20.1' \
-H 'cache-control: no-cache' \
-d '{
"requests":[
{
"image":{
"source":{
"imageUri":
"https://xxxxxxx/images/ocr.jpg"
}
},
"features":[
{
"type":"DOCUMENT_TEXT_DETECTION",
"maxResults":1
}
],
"imageContext": {
"languageHints":["en"]
}
}
]
}'

此种方式的速度和 API Key 方式速度差不多,因为都是先发请求给 Google,然后 Google 再去拿图片文件进行解析,所以会慢一些,下面 ADC 方式的速度可以提高一倍,推荐使用 ADC 方式,下面说下 ADC 方式怎么做。

ADC

ADC 也是建立在服务账号的基础上,只不过是直接使用服务账号的信息而不需要生成中间验证串,而且可以直接向 google 传输文件,所以速度上会快很多。

ADC 的核心是使用 google 提供的语言代码包,在这个代码包中已经封装了各种 API 服务,我们这里使用 Node.js 编写一小段代码,需要使用 @google-cloud/vision 包,然后需要设置环境变量,因为Google 代码包要从环境变量中读取验证信息,这个环境变量就是指定创建服务账号时下载的 json 文件位置:

1
export GOOGLE_APPLICATION_CREDENTIALS=/User/mac/Downloads/test-b04bc33e12ad.json

设置好环境变量之后,创建一个项目把下面代码帖进去,然后 npm i 安装好所需要的各种包,执行即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fs = require('fs')
const Koa = require('koa')
const Index = require('koa-router')
const vision = require('@google-cloud/vision').v1p3beta1

const app = new Koa()
const router = new Index()

router.post('/ocr', async ctx => {
const client = new vision.ImageAnnotatorClient()
const fileName = `/images.jpg`
const request = {
image: {
content: fs.readFileSync(fileName)
},
feature: {
languageHints: ['en-t-i0-handwrit']
}
}
const [result] = await client.documentTextDetection(request)
const fullTextAnnotation = result.fullTextAnnotation
ctx.body = fullTextAnnotation.text
})

app.use(router.routes())
app.listen(10000)

执行上面的代码需要配置好科学上网代理,请求才能发出去,Google 封装好的 API 要比自己发请求优雅许多,并且安全性也更好。

总结

至此如何使用 Google OCR 服务的流程就全部结束了,整个过程参考了下面的文档,关于 Node.js 的使用请自行解决。

◀        
        ▶