介绍一个轻量的OCR工具,本地识别,支持网络部署

今天在小众软件上看到一个新的 github 项目介绍

试用了一下发现效果不错,平时也经常用到 ocr ,但是都是在线的,如果有敏感信息不太好使用在线 ocr 工具,这个正好解决了我的问题。下面给出安装教程和一些坑的解决方法。

安装

环境要求

我是在自己的CentOS云服务器上部署的。理论上所有Linux通用。

要求:

1. python 3.6 (3.6坑最少,后面遇到的坑基本都是python版本过高带来的)
2. opencv-python (最新版本即可)
3. "Development Tools"
4. pytorch (最新版本即可,有GPU就安装GPU版本,云服务器一般都没有)

克隆代码

git clone https://github.com/ouyanghuiyu/chineseocr_lite --depth=1
cd chineseocr_lite

国内的 jj 下载 github 上的文件非常慢。加一个 –depth=1 可以只下载最新文件,不需要历史版本信息,大大减少了下载大小。国外 jj 请随意。

编译

编译软件环境

首先要安装编译所需要的软件

yum groupinstall "Development Tools"
## 其他Linux发行版的开发者工具安装请自行百度。
python3 -m pip install opencv-python-headless  
## 没有gui界面的请安装headless版本,否则会报错。有GUI的去掉-headless安装即可
python3 -m pip install torch==1.4.0+cpu torchvision==0.5.0+cpu -f https://download.pytorch.org/whl/torch_stable.html 
## 截止2020-03-23日我安装的最新版本,也可以自行去官网获取最新版本下载链接

gcc 版本问题

如果你使用的是CentOS或者 gcc 版本为低版本(如4.8,可以使用gcc -v 查看版本号),需要将gcc升级到更高版本再进行下一步编译,否则会报错。具体操作请看这里

python相关

安装 python3 可以看我之前的文章

安装运行所需要的包:

python3 -m pip install -r requirements.txt

开始编译

和官网的教程无异:

cd chineseocr_lite
cd psenet/pse
rm -rf pse.so 
make

使用

如果上面编译没有红色报错,那么就可以使用了。

开放端口

使用之前请确保开启了外网访问你指定端口的权限。

测试能否运行

开放端口后就可以测试

cd chineseocr_lite ## 进入chineseocr目录
python app.py 8080 ## 8080端口号,可以设置任意端口,国内服务器请避开80 443 8080端口

此时访问 http://你的ip:8080/ocr 出现下列画面即可:

注册成为服务,长期运行

找到 python3 位置

which python3

记录上面的地址,待会会用到

记录程序目录

在chineseocr_lite 目录下执行

pwd
## 后面加上/app.py

测试一下能否运行:

/usr/local/bin/python3 /root/chineseocr_lite/app.py 8026

注册为服务

nano /etc/systemd/system/chineseocr_lite.service

粘贴如下内容,然后ctrl+o保存,ctrl+x退出:

[Unit]           
Description=ChineseOCR Lite
After=network.target

[Service]
Type=simple
WorkingDirectory=/root/chineseocr_lite  ## 改为你的程序目录
ExecStart=/usr/local/bin/python3 /root/chineseocr_lite/app.py 8026  # 修改为刚刚测试的代码
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存后执行如下代码,查看运行状态:

systemctl start chineseocr_lite
systemctl status chineseocr_lite
systemctl enable chineseocr_lite

此时访问之前的地址,应该就可以启动了,同时这个服务也会开机启动。

配合nginx或者caddy使用

只需要将上面的

/usr/local/bin/python3 /root/chineseocr_lite/app.py 8026
## 改为
/usr/local/bin/python3 /root/chineseocr_lite/app.py 127.0.0.1:8026

然后在nginx或者caddy中代理为本地端口即可:

以caddy为例:

https://ocr.pakro.top {
  gzip
  tls 你的邮件地址
  proxy / localhost:8026 {
    websocket
    header_upstream -Origin
  }
}

然后访问 https://ocr.pakro.top/ocr 即可(这个地址不可访问)

坑,及如何解决

如果 安装的不是python3.6版本而是跟我一样是更高版本比如3.8版本,那么你有可能会遇到如下几个问题,主要还是因为web没有支持3.6以上版本造成的,所以最好的方法是安装python3.6版本。

RuntimeError: generator raised StopIteration

修改 /usr/local/lib/python3.8/site-packages/web/utils.py 文件

找到错误代码行数,将

yield next(seq)

修改为:

try:
    yield next(seq)
except StopIteration:
    return

/usr/local/lib/python3.8/site-packages/web/debugerror.py:214 - execution of ‘Constant’ statements is denied

修改 chineseocr_lite 目录下的app.py 文件,添加如下两句

from web.template import ALLOWED_AST_NODES
ALLOWED_AST_NODES.append('Constant')

AttributeError: ‘StaticApp’ object has no attribute ‘directory’

修改 /usr/local/lib/python3.8/site-packages/web/httpserver.py (修改为你的版本,或者看错误信息,有给出文件位置)

找到

self.start_response = start_response
## 在下一行添加
self.directory = os.getcwd()

Segmentation fault

gcc版本过低的错误,升级gcc版本即可,具体请参考:升级gcc

注意事项

这个项目仍在开发中,有许多调试代码。建议不要将服务随意的暴露在公网中,或者不要传播,否则会有被入侵的风险。