Python——调用百度云API实现图文识别

这是奔跑的键盘侠的第117篇文章

前几天写的一篇《按键精灵二三事系列第九篇——图文识别+发邮件》,有小伙伴留言说,可以直接调用百度云平台AI的OCR图文识别接口,不用自己单独做字库。于是就抽空研究了一下下,结果……

谈虎色变,我发现这个功能,网上很多帖子都用到了山海插件,关于插件、API调用,按键精灵其实有个不太好的地方:一旦涉及调用第三方和创建对象类的问题,语法都很晦涩,对业余选手来讲及其为难。

不想花费精力研究新的插件,就改用轻车熟路的python来写一下调用百度云平台的api接口吧。

1

代码实现

首先要去百度云平台注册个账号,然后去后台界面查看2个key值

(API KEY ,SECRET KEY),如下图

#!/usr/bin/env python3.6
# _*_ coding:utf-8 _*_
# __author__: Ed Frey
# DATE: 2019/8/8
import urllib.parse,urllib.request
import base64
import os

def get_token(api_key,secret_key):
    '''
    to get the access_token from baidu AI account information
    :param api_key: API KEY from baidu AI account information
    :param secret_key: SECRET KEY from baidu AI account information
    :return:access_token
    '''
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s'%(api_key,secret_key)
    request = urllib.request.Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urllib.request.urlopen(request)
    content = response.read()
    if (content):
        return eval(content)["access_token"]
    return []
def ocr(access_token,path):
    '''
    to get words from path's picture
    :param access_token: get it from fuction "get_token(api_key,secret_key)"
    :param path: the picture's path
    :return: a list of words
    '''
    if access_token is None:
        return None
    if not os.path.isfile(path):
        return None
    url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=%s'%(access_token)
    with open(path,"rb") as f:
        img = base64.b64encode(f.read())
        
    params = {"image": img}
    params = urllib.parse.urlencode(params).encode("UTF8")
    request = urllib.request.Request(url, params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib.request.urlopen(request)
    content = response.read()
    # print(content)
    words_info = eval(content)["words_result"]
    # print(words_info)
    words = []
    for word in words_info:
        words.append(word["words"])
    return words

if __name__ == "__main__":
    api_key = "XXXXXXXXXXXX"
    secret_key = "XXXXXXXXXXXXXXXXXXX"
    path = r"C:\XXXXXX\test.jpg"
    
    access_token = get_token(api_key,secret_key)
    ocr_test = ocr(access_token,path)
至于测试结果:我就百度截了个图,来小试牛刀。
运行结果如下:

"C:\ProgramFiles\Python36\python.exe" C:/Users/XXXXXXXXX/get_baidu_ai-token.py

['圈吗hon量化分析介绍奔跑的×+', '☆自Phon量化分析介绍奔跑的键盘侠', '百度Pyon量化分析介绍奔跑的键盘侠', '百度一下', '网页资讯视频图片知道文库贴吧采购地图更多》', '百度为您找到相关结果约16.000个', 'Python-量化分析个绍(八)-云+社区-腾讯云', 'Python-—量化分析介绍(八) Ed Frey发表于奔跑的键盘侠0 My SQL数据库新用户这个模', '块是为后面做铺垫的接下来在数据处理分析时,会时不时的从数据集中提取所', 'htps/ loud tencent com/deve..-V3-百度快照', 'Python-量化分析介绍(七)-云+社区-腾讯云', 'README} My Quant v#量化分析程序目录_init奔跑的键盘侠37篇文', '章13人订阅 Python量化分析介绍(六) Python量化', 'htps/ cloud tencent com/deve..-V3-百度快照', 'Python.——三级菜单字曲+文件读写)-奔跑的键盘侠', '2018年8月4日- Python-三级菜单字典+文件读写)作者奔跑的键盘侠/公众', '号 runningkeyboard.001按键精灵简介1002如何使用网络上免费的脚本资源003亂标连点器', 'jinciwei. cn/b3442..-百度快照', 'Python基础语法之— callable(obiec- yuanCruise=CSDN博客', '2017年8月6日- Python callable0函数用法实例分析本文实例讲述了 Python callable(函数用', '法。分享.【 darknet】添加新层详细版qu931110我转发的你没看到键盘侠', 'C) CSDN技术社区-百度快照', '丛 Python开始学编程PDF超清版- Python量化投资', '2019年7月5日-改编自 Vamei博客的《 Python快速教程》。本书以 Python为样本不仅介绍了', '编程的基本目录第1章用编程改造世界第2章先做键盘侠第3章过程大于结果', 'A Python量化投资-百度快照']

ocr函数中的content的格式大概是下面这么个样子:
{
"log_id": XXXXXXX,
"words_result_num": XX,
"words_result":
[
      {"words": " XXXXXX"},
      {"words": "XXXXX"}
   ]
}
所有后面有进行格式处理,和字符串拼接。
如果换成标准大小字体的图片,其实识别图文准确率很高的,毕竟这么大一个平台开发的功能。

2

其实我不推荐使用百度API

首先不说他收费的问题,如果是普通图文不涉及隐私内容的,用一下其实也挺好用的,每天免费次数对普通用户来讲也足够了。

如涉及机密信息、商业信息,安全性还是要放在首位。毕竟有些知名平台泄露用户信息什么的,不管是漏洞还是人为恶意,总是不让人省心的。

所以,可以尝试自己去搭建一个字库。像我,平时要提取识别的内容有限,常用的百十个文字而已,是可以自己动手做一个字库,毕竟安全第一,就算某天网络异常或者百度宕机,也丝毫不受影响。如果目标文字属于标准字体,大漠插件也有标准字体的字库直接使用。

好了,今天就讲这么多。

原文发布于微信公众号 - 奔跑的键盘侠(runningkeyboardhero)

原文发表时间:2019-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券