OCR 服务的用途日渐广泛,比如常见的 身份证识别,车牌号识别,又比如通过拍商品照片,获取照片中商品的一些关键字直接去搜索相关商品等用途

而市面上,很多大厂也提供了 OCR 服务,其中功能(精确度选择,文字位置信息选择)和体验(准确度,识别速度)都不错的有 百度云,并且百度提供每天的免费使用额度,日常使用下基本等于免费使用了。

那如果我们自己想在本地做 OCR 部署的话,就需要自己写服务程序了(百度的OCR服务本地化部署得20w+),而 github ,nuget 上有不少的OCR相关项目:
tesseract:免费,而且速度也不错,但是自带的中文数据模型文件的准确性略低,如果想要提高准确率,需要自己去训练模型
IronOcr:收费,速度也不错,但对中文的识别的准确率不是很好
EasyOCR,免费,速度如果是GPU计算的话很快,而且准确率极高,CPU速度则慢很多
等…
EasyOCR(github) 的优点是,配置和使用都比较简单,并且支持识别的语言较多,识别率也高,不过有几点需要注意:

1.开发环境有一定要求,最好是需要 Linux + Python3.6 +(Windows Server 也可以,不过会折腾一些)

2.如果不使用 GPU CUDA 加速,图片识别的速度会非常非常非常非常慢(平均相差20倍的速度),所以建议使用GPU服务器作为生成环境去使用

根据官方文档安装

pip install easyocr //建议升级到最新版本的 pip 再进行安装

Linux 下几乎能一步到位,Windows下会出现版本不一致问题,需要先安装 torch 和 torchvision,再进行 easyocr 的安装
(torch 和 torchvision 可前往 https://pytorch.org/get-started/locally/ 生成对应的 pip 命令)

Demo:

import easyocr
import os
import time
from datetime import datetime
#cpu计算
reader = easyocr.Reader(['ch_sim','en'],False) #False为不使用GPU
starttime=datetime.now()
print('start')
//decoder 为引擎,detail 为是否显示位置信息 batch_size 设置越大,占用内存越高,识别速度越快
result = reader.readtext(image='test.jpg',decoder='greedy',batch_size=20,detail=0) 
endtime=datetime.now()
print('cpu need time',(endtime-starttime).seconds,'s')
#gpu计算
reader = easyocr.Reader(['ch_sim','en'])  
starttime=datetime.now()
print('start')
result = reader.readtext(image='test.jpg',decoder='greedy',batch_size=20,detail=0)
endtime=datetime.now()
print('gpu need time',(endtime-starttime).seconds,'s')
print(result)

首次运行会下载对应的文本数据模型,如果其中报错的话,将对应缺少的组件进行 yum 安装一下即可(如果需要使用 GPU加速,需要安装对应显卡的驱动,如 NVIDIA-driver 和 NVIDIA-cuda,我是直接使用阿里云的 GPU服务器,并自动安装了该驱动)

服务器配置为:
CPU:Intel Platinum 8163 处理器,四核心
内存:15G
GPU:NVIDIA T4 GPU 16G显存

下面是测试运行结果:(测试结果仅供参考,实际和拍照角度,清晰度,文字布局复杂度等有关)

结论:可以看出,CPU 计算的速度完全无法直视,所以能 GPU 还是 GPU ,不然无法在生产环境中使用(不过GPU服务器也很贵,所以实际生产环境中,如果没特殊要求,还是用第三方比较划算)

 

附带图片处理时候的性能监控,其中 CPU 出现峰驼的时候是使用 CPU 去计算,显存出现峰驼的时候是使用 GPU 去计算,不过厉害的是,GPU 占用率一直都很低