python实现图片文字提取,准确率高达99%,强无敌!!!
上次我使用的百度AI开放平台的API接口实现图片的转化,后来有许多小伙伴都私信问我,怎么获取百度AI平台的AK和SK。为了统一回答大家的问题,今天我又使用百度API实现了一个从图片中提取文字和识别身份证的功能,详细描述实现过程,有收获的小伙伴记得收藏、转发分享哦。
百度AI开放平台
百度AI开放平台网址:https://login.bce.baidu.com/
首先我们需要注册一个账号,注册登录之后我们选择文字识别
菜鸟小白的平台因为已经创建了一个应用了,首次登录应该是没有应用的,点击创建应用就好了
后面输入创建的应用名称,从创建页面上看API支持的功能很多,什么文字识别、身份证识别、银行卡识别和驾驶证识别等等,另外如果需要其他类型的功能(如图片效果增强等)也可以直接勾选上。
下面我们不需要选择文字识别包名,填写一个应用描述点击创建就OK了。
创建完成之后我们就可以看到我们需要的AK(API Key)和SK(Secret Key)了。
思路分析
可以看到百度AI开放平台是有提供API文档和举例代码的。写程序之前需要先看看我们的要使用的接口是什么格式,是否需要身份认证。百度AI开放就是需要使用AK和SK去和平台做一个鉴权操作,获取一个access token,然后我们再拿着这个access token去请求接口,完成我们今天需要完成的文字识别和身份证识别功能。
鉴权函数
从分析来看,我们首先需要去获取一个access token,用于后续的请求合法性鉴别。查看平台的接口文档,我们的编码如下,这个其实在我们之前的图片处理程序中也是一样的。
文档地址:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
百度AI开放平台鉴权函数
def get_access_token(): url = 'https://aip.baidubce.com/oauth/2.0/token' data = { 'grant_type': 'client_credentials', # 固定值 'client_id': 'eFGwDIb*******HucbnPr', # 在开放平台注册后所建应用的API Key 'client_secret': 'XPxWT2L********PFVCKS6PVih' # 所建应用的Secret Key } res = requests.post(url, data=data) res = res.json() print(res) access_token = res['access_token'] return access_token
文字识别函数
鉴权函数写好之后,我们就可以拿着获取到的access token去向平台接口发起请求,识别图片中的文字了。从平台文档上看通用文字识别的url为
https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic
平台的API文档地址:https://cloud.baidu.com/doc/OCR/s/1k3h7y3db
#通用文字识别def general_word(): #通用文字识别接口url general_word_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic' #获取执行路径 # path = os.getcwd() # 二进制方式打开图片文件 f = open('5.jpg', 'rb') img = base64.b64encode(f.read()) print(img) params = {'image':img, 'language_type':'CHN_ENG'} access_token = get_access_token() request_url = general_word_url + '?access_token=' + access_token print(request_url) headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) # print(response) # res = response.json() if response: res = response.json()['words_result'] print(res) file_name = '菜鸟小白.txt' with open(file_name, 'w', encoding='utf-8') as f: for j in res: print(j['words']) f.write(j['words']+'\n')123456789101112131415161718192021222324252627123456789101112131415161718192021222324252627
当我们判断返回值存在内容时,我们将json格式的返回值,写入“菜鸟小白.txt”文档中。
身份证识别函数
我们写完了文字识别之后,其实写身份证识别和其它证件的识别就都是一样的方式了调用了。
#身份证识别def idcard(): idcard_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard' # 二进制方式打开图片文件 f = open('4.jpg', 'rb') img = base64.b64encode(f.read()) params = {'id_card_side':'front','image':img} access_token = get_access_token() request_url = idcard_url + '?access_token=' + access_token print(request_url) headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: res = response.json()['words_result'] file_name = '菜鸟小白的学习分享.txt' with open(file_name, 'w', encoding='utf-8') as f: f.write('住址:'+res['住址']['words']+'\n') f.write('出生日期:' + res['出生']['words'] + '\n') f.write('姓名:' + res['姓名']['words'] + '\n') f.write('公民身份号码:' + res['公民身份号码']['words'] + '\n') f.write('性别:' + res['性别']['words'] + '\n') f.write('民族:' + res['民族']['words'] + '\n')
主函数
最后我们写一个主函数调用不同的功能函数就好了。
if __name__ == '__main__': idcard() general_word()123123
实现效果
这样我们的目标就完成了,我们来看看实现效果吧。首先我们看看文字识别的效果。
1
1
原始图片:
最终识别出来的效果
最终我们的识别仅将“API”识别为“AP”,少了一个字符“I”,正确率高达99%以上,一个字——强。
我们再来看看身份证的识别效果,原始图片如下(网络百度图片,如有侵权请联系作者删除):
经过我们的程序识别后,所有信息都正确识别出来了(其中身份证号码应该是因为假身份证号码识别规则不通过所有为空白了,菜鸟小白自己的身份证是完成识别出来的),正确率高达100%。