zoukankan      html  css  js  c++  java
  • python基于万象优图识别图片中的中文

    最近一直在研究光学字符识别,即OCR。最开始在谷爹那里了解到了开源的Tesseract,可以拿来识别简单的英文和数字。但是识别中文的准确率并不高。

    然后从Tesseract到Tesseract.js,经过多次尝试研究,最后发现腾讯爹的万象优图识别率是最高的。趁现在是公测免费期,赶紧尝试了一把。

    下面来说一说我是怎么用python实现中文识别的。

    首先百度万象优图登录吧,腾讯的。。。你们懂得。。。。进去后,创建一个bucket,然后可以选择上传图片

     

     

    这些准备工作做好以后,就开始写代码吧

    首先如果是识别身份证,名片,标签等图片的话,强烈建议直接使用万象优图提供python sdk,详情请见https://cloud.tencent.com/document/product/460/7991

     

    我们这里,是做图片通用印刷体识别,所以就只有被迫用万象优图提供的API:(原本我是更喜欢用SDK的,因为简单,但是目前SDK不支持)

     

    万象优图OCR接口采用http协议,支持指定图片URL和 上传本地图片文件两种方式。

    根据用户提供的图片,返回识别出的字段信息。

    接口:http://recognition.image.myqcloud.com/ocr/general

     

    这里有三点需要注意:

    (1) 每个请求的包体大小限制为6MB。

    (2) 所有接口都为POST方法。

    (3) 不支持 .gif这类的多帧动图。

     

    然后我用可以使用requests模块来发http请求。

    这里最麻烦的就是要定制请求头,不然腾讯云是解析不到的,笔者才疏学浅在这里研究了一下午才正确定制出了请求头。。。。

    先来看看请求头的规则:

    参数名描述
    Host recognition.image.myqcloud.com 服务器域名
    Content-Length 包体总长度 整个请求包体内容的总长度,单位:字节(Byte)
    Content-Type Application/json或者Multipart/form-data 根据不同接口选择
    Authorization 鉴权签名 用于鉴权的签名,使用多次有效签名。详情

     

    这里的难点就是这个鉴权签名,直接点击表格里面的详情去看吧,我这里不做复制粘贴。

    关于请求参数:

    使用image则使用 multipart/form-data格式

    不使用image则使用 application/json格式

    参数名是否必须类型参数说明
    appid 必须 string 项目ID
    bucket 必须 string 空间名称
    image 可选 binary 图片内容
    url 可选 string 图片的url,image和url只提供一个即可,如果都提供,只使用url

    好了,现在开始正式开始吧

    先写一下请求头涉及到的变量

    然后依次把他们拼接起来

    我这里采用的是单次

     

    然后再根据要求进行 HMAC-SHA1加密

    这里强调一下,官方的说法是

    根据我的研究,转换出来的不是二进制,然后我还特意去转成了二进制。。。。。。发现其实根本不用,转出来的在pycharm里面是个乱码,可以直接用的

    最后,加密的数据和之前的拼接数据再拼在一起做base64转码

    这样签名就完成了,后面的基本不难,主要就是签名这里有坑,下面直接上代码:

    # coding=utf-8
    # /usr/bin/python
    # coding=utf-8
    # create by 15025463191 2017/10/11
    
    import requests
    import hmac
    import hashlib
    import base64
    import time
    import random
    import re
    
    appid = "1254602529"
    bucket = "imgregnise"
    secret_id = "AKIDZx72kFVBPRF4324234234o8C1auynPezyl"  #我更改了,不要复制我的
    secret_key = "h9NUN1RbZIm11mJbUt2v32432Zx"  #我更改了,不要复制我的
    expired = time.time() + 2592000
    onceExpired = 0
    current = time.time()
    rdm = ''.join(random.choice("0123456789") for i in range(10))
    userid = "0"
    fileid = "tencentyunSignTest"
    
    info = "a=" + appid + "&b=" + bucket + "&k=" + secret_id + "&e=" + str(expired) + "&t=" + str(current) + "&r=" + str(
        rdm) + "&u=0&f="
    
    signindex = hmac.new(secret_key, info, hashlib.sha1).digest()  # HMAC-SHA1加密
    sign = base64.b64encode(signindex + info)  # base64转码
    
    url = "http://recognition.image.myqcloud.com/ocr/general"
    headers = {'Host': 'recognition.image.myqcloud.com',
               "Content-Length": "187",
               "Content-Type": "application/json",
               "Authorization": sign
               }
    
    payload = {
        "appid": appid,
        "bucket": bucket,
        "url": "http://imgregnise-1254602529.picsh.myqcloud.com/123456.png"
    }
    
    r = requests.post(url, json=payload, headers=headers)
    responseinfo = r.content
    
    r_index = r'itemstring":"(.*?)"'  # 做一个正则匹配
    result = re.findall(r_index, responseinfo)
    for i in result:
        print i

    我这里用图片试验了一次,准备率还是很高的,就是中间少了一个“餐。”

    但是这样的识别率已经是很高了

     最后预祝各种识别成功!

  • 相关阅读:
    LeNet && ModernCNN
    Fundamentals of Convolutional Neural Networks
    机器及其相关技术介绍
    学而后思,方能发展;思而立行,终将卓越
    贪心的区间问题
    基环树
    模板类
    存储问题
    大佬们的技巧
    exgcd
  • 原文地址:https://www.cnblogs.com/semishigure/p/7690789.html
Copyright © 2011-2022 走看看