一、需求分析
我们要实现的功能很简单,通过使用百度的API进行图片当中文字的详细识别,进行输出,图片的处理要注意本质上是二进制处理的,所以在图片文件读取的时候一定注意模式问题,我们先需要获得技术文档当中的token值,进行身份验证,在发送post请求的时候,将token一并携带发送,保证识别效果,在返回的response中进行数据解析,直接调用json()即可,在后面的处理当中可以看到技术文档当中的返回类型为JOSN
样例效果:
比如我要识别技术文档当中部分截图内容
识别结果:
二、产品选择及准备
登录百度智能云之后在产品这一栏选择人工智能中的通用文字识别,进入技术文档当中先看一看具体的使用方式
进入文字识别的技术文档当中我们可以看到,要访问的url,发起请求的方法以及要携带的token值
那么首先我们需要考虑先获取token的值,进入‘Access Token获取’一文当中查看获取方式
我们发现在token的获取当中要在url当中带上三个必须参数:grant_type,client_id,client_secret
那么grant_type是有固定的值client_credentials的,那么剩下两个怎么办呢?
登录百度智能云,选择你要进行的项目
点击创建应用
创建好之后进行查看,访问所需的API Key和Secret Key就创建好了
按照既定格式将url准备好
'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
三、开始编写应用
1、获取token
# 获取access_token()
def get_token():
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
content = response.json()
return content['access_token']
token = get_token()
服务器给我们返回的数据当中携带的参数如下,我们只提取我们需要的即可
如果请求发生报错,请参考以下提示,做相应的处理
2、处理图片
图片的处理上要符合技术文档当中的要求
了解了要求之后我们开始处理图片
在处理图片的时候open方法一定要清楚里面的参数含义,不要随意调用
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开 file 并返回对应的 file object。 如果该文件不能被打开,则引发 OSError。
file 是一个 path-like object,表示将要打开的文件的路径(绝对路径或者当前工作目录的相对路径),也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)
mode 是一个可选字符串,用于指定打开文件的模式。默认值是 ‘r’ ,这意味着它以文本模式打开并读取。其他常见模式有:写入 ‘w’ (截断已经存在的文件);排它性创建 ‘x’ ;追加写 ‘a’ (在 一些 Unix 系统上,无论当前的文件指针在什么位置,所有 写入都会追加到文件末尾)。在文本模式,如果 encoding 没有指定,则根据平台来决定使用的编码:使用 locale.getpreferredencoding(False) 来获取本地编码。(要读取和写入原始字节,请使用二进制模式并不要指定 encoding。)可用的模式有:
字符 | 意义 |
---|---|
| 读取(默认) |
| 写入,并先截断文件 |
| 排它性创建,如果文件已存在则失败 |
| 写入,如果文件存在则在末尾追加 |
| 二进制模式 |
| 文本模式(默认) |
| 打开用于更新(读取与写入) |
encoding 是用于解码或编码文件的编码的名称。这应该只在文本模式下使用。
encoding后面的值是字符集:utf-8,ACSII,Unicode,GBK,GB2312,UCS-2等
但要注意在处理图片的时候不能写encoding参数
# 处理图片
with open('图片文件路径','rb') as f:
msg = f.read()
# base64进行处理,生成image
image = base64.b64encode(msg)
图片处理好之后开始准备发送请求的参数
Body中放置请求参数,参数详情如下:
请求参数
参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
---|---|---|---|---|
image | 和url二选一 | string | - | 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持 jpg/jpeg/png/bmp 格式,当image字段存在时url字段失效 |
url | 和image二选一 | string | - | 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效,不支持https的图片链接 |
language_type | 否 | string | CHN_ENG ENG JAP KOR FRE SPA POR GER ITA RUS | 识别语言类型,默认为CHN_ENG 可选值包括: - CHN_ENG:中英文混合 - ENG:英文 - JAP:日语 - KOR:韩语 - FRE:法语 - SPA:西班牙语 - POR:葡萄牙语 - GER:德语 - ITA:意大利语 - RUS:俄语 |
detect_direction | 否 | string | true/false | 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括: - true:检测朝向; - false:不检测朝向。 |
detect_language | 否 | string | true/false | 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) |
paragraph | 否 | string | true/false | 是否输出段落信息 |
probability | 否 | string | true/false | 是否返回识别结果中每一行的置信度 |
那么必选参数当中我们准备好处理好的Image即可
返回参数
字段 | 是否必选 | 类型 | 说明 |
---|---|---|---|
direction | 否 | int32 | 图像方向,当detect_direction=true时存在。 - -1:未定义, - 0:正向, - 1: 逆时针90度, - 2:逆时针180度, - 3:逆时针270度 |
log_id | 是 | uint64 | 唯一的log id,用于问题定位 |
words_result | 是 | array[] | 识别结果数组 |
words_result_num | 是 | uint32 | 识别结果数,表示words_result的元素个数 |
+words | 否 | string | 识别结果字符串 |
paragraphs_result | 否 | array[] | 段落检测结果,当 paragraph=true 时返回该字段 |
+words_result_idx | 否 | array[] | 一个段落包含的行序号,当 paragraph=true 时返回该字段 |
probability | 否 | float | 识别结果中每一行的置信度值,包含average:行置信度平均值,variance:行置信度方差,min:行置信度最小值 |
language | false | int32 | 当detect_language=true时存在 |
发送请求要携带的参数,以及返回的参数我们清楚之后,可以开始发送请求了
3、发送请求,解析数据
在我们所要接收的参数当中我们提取words_result即可,注意其返回类型是数组
data = {
'image':image
}
# 发送请求
imgResponse = requests.post(imgUrl, params = params, data = data)
content = imgResponse.json()
imgres = content['words_result']
for i in imgres:
print(i['words'])
最终得到识别结果
案例实现很简单,其他相应的复杂内容我们按照需求及文档帮助增减适当的参数即可完成