点击上方蓝字关注
前段时间在进行内部训练题库搭建时遇到一个棘手的问题,搭建题库的原始素材并不是WORD或EXCEL形式记录的内容,而是一张又一张的截图。
当看到这些截图的时候,内心是无比的崩溃。录入题库系统,需要将图片转换文字再录入进去,这个工作估计的手工敲进去了,想想这个工作量怕是要干到猴年马月了!
在无比奔溃的边缘时,突然想起了OCR技术。OCR的概念是在1929年由德国科学家Tausheck最先提出来的,后来美国科学家Handel也提出了利用技术对文字进行识别的想法。在网络上有大量提供OCR技术的企业,或许可以通过OCR技术来对图片中的文字进行提取,这样的话我的工作就剩下复制粘贴了!
至于选择谁提供的OCR接口(API),这个其实都无所谓,原本我的需求简单并不复杂。由于在百度搜索OCR排名显示第一的为“百度智能云”,那就暂时选百度吧,毕竟就人家后面有个“名企”标识。
百度智能云提供的文字识别技术,可以多场景、多语种、高精度的文字检测与识别服务,多项ICDAR指标居世界第一;广泛适用于远程身份认证、财税报销、文档电子化等场景,为企业降本增效;提供稳定易用的在线API、离线SDK、软件部署包多种服务形式。
对于当前我的需求,可以通过Python来调用“百度智能云”提供的在线API来实现,为了提高对图片中文字识别的精确度,采用“通用文字识别(高精度版)”。如何通过Python实现,下发直接给大家提供源代码,对于源代码中修改的部分进行重点注释。
import base64
import requests
API_KEY = 'key' # 自行获取补充
SECRET_KEY = 'key' # 自行获取补充
OCR_URL = "URL" # OCR接口,请求URL参数,根据官方API文档修改补充。
TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token' # access_token获取接口,授权服务地址。
def fetch_token():
# 获取token
params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
try:
f = requests.post(TOKEN_URL, params, timeout=5)
if f.status_code == 200:
result = f.json()
if 'access_token' in result.keys() and 'scope' in result.keys():
if not 'brain_all_scope' in result['scope'].split(' '):
return None, 'please ensure has check the ability'
return result['access_token'], ''
else:
return None, '请输入正确的 API_KEY 和 SECRET_KEY'
else:
return None, '请求token失败: code {}'.format(f.status_code)
except BaseException as err:
return None, '请求token失败: {}'.format(err)
def read_file(image_path):
f = None
try:
f = open(image_path, 'rb') # 二进制读取图片信息
return f.read(), ''
except BaseException as e:
return None, '文件({0})读取失败: {1}'.format(image_path, e)
finally:
if f:
f.close()
def pic2text(img_path):
def request_orc(img_base, token):
"""
调用百度OCR接口,图片识别文字
:param img_base: 图片的base64转码后的字符
:param token: fetch_token返回的token
:return: 返回一个识别后的文本字典
"""
try:
req = requests.post(
OCR_URL + "?access_token=" + token,
data={'image': img_base},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if req.status_code == 200:
result = req.json()
if 'words_result' in result.keys():
return req.json()["words_result"], ''
elif 'error_msg' in result.keys():
return None, '图片识别失败: {}'.format(req.json()["error_msg"])
else:
return None, '图片识别失败: code {}'.format(req.status_code)
except BaseException as err:
return None, '图片识别失败: {}'.format(err)
file_content, file_error = read_file(img_path)
if file_content:
token, token_err = fetch_token()
if token:
results, result_err = request_orc(base64.b64encode(file_content), token)
if result_err: # 打印失败信息
print(result_err)
for result in results: # 打印处理结果
print(result)
if __name__ == '__main__':
pic2text(img_path='你自己图片所在路径') # 输入自己图片所在位置
先来一起看看执行后的结果,左边为识别结果,右边为原始图片,有没有觉得OCR就是这么丝滑好用。
现在对代码中需要重点关注并修改的部分,来进行一下说明。重点关注:'API_KEY ' 'SECRET_KEY' 'OCR_URL' 'img_path'
API_KEY = 'key' # 自行获取补充
SECRET_KEY = 'key' # 自行获取补充
OCR_URL = "URL" # OCR接口,请求URL参数,根据官方API文档修改补充。
if __name__ == '__main__':
pic2text(img_path='你自己图片所在路径') # 输入自己图片所在位置
API_KEY和SECRET_KEY是需要通过个人账号来进行获取的,请先登录百度智能云官网,并点击创建应用。
按照提示步骤进行补充,如果没有进行免费额度领取可以按照提示进行领取。应用归属选择个人,进行应用描述补充后进行提交。
提交后完成后,可在管理应用中看到创建的应用名称。API Key及代码中需要补充的API_KEY,Secret Key及代码中需要补充的SECRET_KEY。
对于API接口的获取,需要自行通过API文档来查看。API接口的选择,根据所使用服务类型来选择。由于我免费领取定的额度中包含“通用文字识别(高精度版)”,所以下图选择了对应服务类型的API接口,请求URL及代码中需要补充的OCR_URL。
最后是img_path,对于img_path想要给大家强调如何写自己图片所在位置的路径。对于这个问题其实就是Python中什么是文件路径,如何书写文件路径。在Window下python读取数据路径可以有三种表示方式分别为:转义、声明字符串、正斜杠,我们来分别看看如何表示。
转义方式,需要两个反斜杠。
if __name__ == '__main__':
pic2text(img_path='c:\a.png') # 反斜杠必须要有两个。因为每个反斜杠需要由另一个反斜杠字符来转义。
声明字符串,表示不需要转义。
if __name__ == '__main__':
pic2text(img_path= r'c:a.png') # 不需要转义
正斜杠表示路径,与linux一样,没有转义的误解。
if __name__ == '__main__':
pic2text(img_path='c:/a.png') #没有转义的误解
原文始发于微信公众号(弥天安全实验室):如何进行图片文字识别
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论