python——人工智能之网络图片文字识别案例详细讲解!

299 阅读4分钟

一、需求分析

我们要实现的功能很简单,通过使用百度的API进行图片当中文字的详细识别,进行输出,图片的处理要注意本质上是二进制处理的,所以在图片文件读取的时候一定注意模式问题,我们先需要获得技术文档当中的token值,进行身份验证,在发送post请求的时候,将token一并携带发送,保证识别效果,在返回的response中进行数据解析,直接调用json()即可,在后面的处理当中可以看到技术文档当中的返回类型为JOSN

![](https://p6-tt-ipv6.byteimg.com/large/pgc-image/8dbd79567578447a935a6ae94b69c259)

样例效果:
比如我要识别技术文档当中部分截图内容

![](https://p26-tt.byteimg.com/large/pgc-image/ed0c72baba5a4be7b33981ce1fac0d7b)

识别结果:

![](https://p3-tt-ipv6.byteimg.com/large/pgc-image/55bf441e00fe4d0d9a681db1e1ae81f5)

二、产品选择及准备

登录百度智能云之后在产品这一栏选择人工智能中的通用文字识别,进入技术文档当中先看一看具体的使用方式

![](https://p26-tt.byteimg.com/large/pgc-image/447a84b2f5ae444da76f5136357ef029)

进入文字识别的技术文档当中我们可以看到,要访问的url,发起请求的方法以及要携带的token值

![](https://p26-tt.byteimg.com/large/pgc-image/d8ec5e966bbc4bbe95c9e913131429f6)

那么首先我们需要考虑先获取token的值,进入‘Access Token获取’一文当中查看获取方式

![](https://p6-tt-ipv6.byteimg.com/large/pgc-image/df0d4e9e4169436281edd653d1bf4fd4)

我们发现在token的获取当中要在url当中带上三个必须参数:grant_type,client_id,client_secret
那么grant_type是有固定的值client_credentials的,那么剩下两个怎么办呢?
登录百度智能云,选择你要进行的项目

![](https://p1-tt-ipv6.byteimg.com/large/pgc-image/19f8ac0a5e524e76a421c8afb4286722)

点击创建应用

![](https://p26-tt.byteimg.com/large/pgc-image/4cfa6b4ffad743b58b1847637b150b6d)
![](https://p26-tt.byteimg.com/large/pgc-image/cb32c41156d943fb973db4e94751e0f3)

创建好之后进行查看,访问所需的API Key和Secret Key就创建好了

![](https://p1-tt-ipv6.byteimg.com/large/pgc-image/5856ae04b26c4bc7a941e09e7cd44095)

按照既定格式将url准备好

'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
1

三、开始编写应用

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()

服务器给我们返回的数据当中携带的参数如下,我们只提取我们需要的即可

![](https://p26-tt.byteimg.com/large/pgc-image/6055d8895e9e445a9ae1e16472dd4c0f)

如果请求发生报错,请参考以下提示,做相应的处理

![](https://p6-tt-ipv6.byteimg.com/large/pgc-image/6d67a4672caa407faf9ff628e2e60099)

2、处理图片

图片的处理上要符合技术文档当中的要求

![](https://p6-tt-ipv6.byteimg.com/large/pgc-image/f45eb2159b634843896dfa3731f97216)

了解了要求之后我们开始处理图片
在处理图片的时候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。)可用的模式有:

![](https://p6-tt-ipv6.byteimg.com/large/pgc-image/4f8bb5b62cdb4c54ad9e7edc312ecf3a)

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中放置请求参数,参数详情如下:

请求参数

![](https://p26-tt.byteimg.com/large/pgc-image/ba6831c02dad441fb7a4d8ab7fcb5aa4)

那么必选参数当中我们准备好处理好的Image即可

返回参数

![](https://p26-tt.byteimg.com/large/pgc-image/8e3018ec703f43158d6a7a6df79d5552)

发送请求要携带的参数,以及返回的参数我们清楚之后,可以开始发送请求了

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'])

最终得到识别结果
案例实现很简单,其他相应的复杂内容我们按照需求及文档帮助增减适当的参数即可完成

其实很简单的,就是调用一个接口,你学会了吗?完整项目代码获取⬅点这里