PaddleOCR服务化部署(WINDOW10)

PaddleOCR服务化部署(WINDOW10)

走自己的路,让别人有路可走;学别人走路,让自己走得更稳。

参考官方文档部署往往发生一些不可预期的问题,本文仅限本人在windows10环境下部署CPU版本的PaddleOCR实操过程记录。

PaddleOCR:release/2.2分支

PaddlePaddle 2+

1.Python环境准备

python安装过程略(本文基于Python 3.8.5)

2.paddle环境准备**WINDOWS只能使用0.5.0版本的CPU模式**

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddle-serving-server
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddle-serving-app
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddle-serving-client

此处可能发生错误,查看python支持的版本,在whl下载链接下载对应的whl文件即可。

以上安装也可一条命令安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U paddle_serving_server paddle_serving_client paddle_serving_app paddlepaddle

3.下载PaddleOCR代码

git clone https://github.com/PaddlePaddle/PaddleOCR

4.模型转换

分别下载文本检测模型和文本识别模型

https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar

powershell中用tar命令解压:

tar xf ch_ppocr_mobile_v2.0_det_infer.tar
tar xf ch_ppocr_mobile_v2.0_rec_infer.tar

注:此处一定要用tar命令,否则解压结果不正确,后续模型转换会提示找不到ch_ppocr_mobile_v2.0_rec_infer目录。将这些解压后的文件夹移动到xx/PaddleOCR/inference目录下。

转换检测模型:

cd PaddleOCR\inference
python -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_det_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --serving_server ./ppocr_det_mobile_2.0_serving --serving_client ./ppocr_det_mobile_2.0_client

转换识别模型:

cd PaddleOCR\inference
python -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_rec_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --serving_server ./ppocr_rec_mobile_2.0_serving/ --serving_client ./ppocr_rec_mobile_2.0_client/

转换好后会生成四个文件夹:

ppocr_det_mobile_2.0_client
ppocr_det_mobile_2.0_serving
ppocr_rec_mobile_2.0_client
ppocr_rec_mobile_2.0_serving

把这4个文件移入PaddleOCR源码的PaddleOCR\deploy\pdserving目录,即与win目录同级。否则后面运行的时候会发生错误:

FileNotFoundError: [Errno 2] No such file or directory: '../ppocr_rec_mobile_2.0_serving/serving_server_conf.prototxt'

最终目录结构如图(目录中的格式可参考官方文档):

5.启动服务

进入PaddleOCR的源码目录:xx/PaddleOCR/deploy/pdserving/win

执行命令:

python ocr_web_server.py cpu

显示成功如下:

web service address:

http://10.41.114.98:8282/ocr/prediction

This API will be deprecated later. Please do not use it

6.python识别验证

python ocr_web_client.py

此处如果发生错误:

ImportError: cannot import name 'ContextVar' from 'werkzeug.local'

考虑flask的版本兼容性,本人环境里已有flask 2.0.1,降级到与Paddle匹配的1.1.2即可解决。

最终验证结果:

{'result': {'res': ['登机牌', 'BOARDING', 'PASS', '序号SERIALNO.', '舱位CLASS', '座位号SEATNO', '航班FLIGHT', '日期DATE', '12F', '035', 'W', 'A', 'MU2379', '03D-O', '登机口GATE', '始发地FROM', '登机时间BDT', '目的地TO', '小', 'TAIYUAN', 'Gi', 'FUZHOU', '身份识别IDNO', '姓名NAME', 'ZHANGQTWET', '票号TKTNO', '张祺伟', '票价FARE', '一', '781369923848911', '登机口于起飞前10分钟关闭GATESCLOSE10MINUTESBEFOREDEPARTURETIME']}}
{'result': {'res': ['Meters/bonwe', '洗涤说明', '国景费造漆温度30℃', '不可漂白', '文', '', '悬挂晾干', '1', '熨斗底板最高温度110°℃', '常规干洗', '注意事项']}}

7、命令行识别验证

curl -H "Content-Type:application/json" -X POST --data "{\"feed\": [{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAHkAAAAnCAYAAAArfufOAAAEvElEQVR4nO1bMWsbSRT+clyv4sAWGAS5wpUN8UGuSmlQEBHpsp0LgZy4cOkuwhHqrDKFkERcpMqWQZcgkRQurrJBNifjwo3BYEcSpNAv2Huzu5JWu7Pe2dWubDLzNV7P7r5987733rx5Yz8yCFD4pfHbfSugkDwUyRJAkSwBFMkSQJEsARTJEkCRLAEUyRJAkSwBFMkSQJEsAbwkn+nQdqo4PBN4W+jZATrlKrTydww5d4dfGyRDx7mgwg8Vsc+D2bbZE/tuwHO/x6WTL/o9/NsHVvPrWIoqg024fj2XGtnXeyg8mf7OjLPbGoWWs5rfQiW3LPSs8DfSG3i/vzljn/MTmm/3mhznAqWahjXee2QXS/4FOdc6/xmMSe5/R6l8ikvHjU69io7QVJzPplDY30Y27VC2xeRmUGKGsclyGzwQTzToNb+bLFN8xCG8hgpGxt+AHvRwuNPGVSj5wd84b1ZRufWOrxX3oNv2quw0PHY19WGOz3EQNyyS05uo1DatkTBEBD1LzqN3WRSJGtImrM+uvQ4jHZhzvyYbfwZWZm4wO7UpsMiBBBw7wXRNitQpisnTdn2dpYd/zHQzIm+twiJ2D++7LM0lp9kU1/Z3xbHquPam49FUHs279DS8Rn4pvlLm6cnR/6/n0IvrM0O+JIdJ11ycHVkRyYnEqewMCvkU0ErNpDSrQEthJfEoni9dL+W2oeesazPtdmflMcLCwinTg4jLnS/JYdK1B2yNd4671nyn7CiGeHjo4bjrd08gWyTszAmkaztNU9oooW0VFeM1P4YqOV7Ml64nOLuYZL1jiujjp84AiVZ4xYn40zXbMrFKl9aFYbMdXbOFIJ7qmm13VtMpXPavcXVLP+sNrFDRuBGvspERf7pmUbtvXfKaH8EY4PSECo/0n9H31YuEuYPI4Fl+hMtWBtq+BrDoLOtUb4QR5NxZ3I3AAHRtq5JvhojCs26H3fNGwfzpmvUBkN+iqP08GVsrbqHQPAJuwkheRpZ2Flnf+1MnCNOQYXg4JDv36gvDnOmaMplZURfJ4F+dN4iwomYVld2YCi97t5LNb+CqdYTznKjeNsm8vVm0jhe4+7RIsCP7cdju2AIxvB1Rxtk2je2/NMVReE27Wy9ymxje0DvNnrCdTZLv3JvdF/o/zdT9OFaZ7vbtKHS6RusjNLNRY3XkConv5b3drSW2HFDq1poQIvrOdG15mbs3OkevOP0HrWmzhZqfg7EoYVHwd5xRfC9LwjwYr8PMoZzZgK3fz3FDy4cI0dzzZOvYjAgGpV4OkRuUQvWXP7FLz2g7DXQEKkIT6WUzMjsnQUdodruTnGIRFTZzZt6R6Xjc75g0UZjHuHYw1Xg9/HUUahTRt+1ADh5N/xfKUcKHWVcnKZBzAsXLBKINEXsbgIhHgjxMq1KriOq4xof9AZbSnKrVpTNve2nVNSlPWzP0UaPjW8Lty8k7Poc6jOTBl7rx6s2B8eHUiI4f34y3JOPtl/5kqNc4MF69+2YM5hAbL/pG+92BOVennqFgz9M9L8uGn4xewJgbUxv9Z3xgct/UjfaPaKqNeXR/0xHJCr8q1N94SQBFsgRQJEsARbIEUCRLAEWyBFAkSwBFsgT4HxQ8/CE4B3ErAAAAAElFTkSuQmCC\"}], \"fetch\": [\"save_infer_model/scale_0.tmp_1\"]}" http://wqy88.top:8282/ocr/prediction

最终验证结果,需要进一步加工成中文使用:

{"result":{"res":["\u5176\u4ed6\u5de5\u5177\u76f8"]}}

8、autojs识别验证

function paddle_ocr_api(img) {
    var url = "http://wqy88.top:8282/ocr/prediction";
    var headers = {'Content-Type': 'application/json;charset=utf8'};
    var imag64 = images.toBase64(img);
    var data = {"feed": [{"image": imag64}], "fetch": ["save_infer_model/scale_0.tmp_1"]};
    var response = http.postJson(url, data, {headers : headers});
    var results = response.body.json();
    var res = results.result.res;
    var question = new Array();
    //var title = '';
    //var opt = new Array();
    for(var i=0; i<res.length; i++){
        var fir = res[i].substr(0,1), //第一个字符
        sec = res[i].substr(1,1); //第二个字符
        //if(parseFloat(fir).toString() != "NaN" && sec=='.') title = res[i].slice(2);
        //if(((fir>='A'&&fir<='Z')||(fir>='a'&&fir<='z')) && sec=='.') opt.push(res[i].slice(2));
        if(parseFloat(fir).toString() != "NaN" && sec=='.') question.push(res[i].slice(2));
        if(((fir>='A'&&fir<='Z')||(fir>='a'&&fir<='z')) && sec=='.') question.push(res[i].slice(2));
    }
    return question;
}
var res = yashu_ocr_api(img);
console.log(res);

最终验证结果类似:

['Meters/bonwe', '洗涤说明', '国景费造漆温度30℃', '不可漂白', '文', '', '悬挂晾干', '1', '熨斗底板最高温度110°℃', '常规干洗', '注意事项']

9、易语言识别验证

.版本 2
.支持库 spec
.子程序 功能_网页访问, 文本型, , 本命令由【精易网页调试助手】生成,请配合精易模块使用。
.局部变量 网址, 文本型
.局部变量 方式, 整数型
.局部变量 提交数据, 文本型
.局部变量 提交协议头, 文本型
.局部变量 是否重定向, 逻辑型
.局部变量 结果, 文本型
.局部变量 JSON, 类_json
网址 = “http://wqy88.top:8282/ocr/prediction”
方式 = 1
' 提交数据 = “{” + #引号 + “feed” + #引号 + “: [{” + #引号 + “image” + #引号 + “: ” + #引号 + “iVBORw0KGgoAAAANSUhEUgAAAHkAAAAnCAYAAAArfufOAAAEvElEQVR4nO1bMWsbSRT+clyv4sAWGAS5wpUN8UGuSmlQEBHpsp0LgZy4cOkuwhHqrDKFkERcpMqWQZcgkRQurrJBNifjwo3BYEcSpNAv2Huzu5JWu7Pe2dWubDLzNV7P7r5987733rx5Yz8yCFD4pfHbfSugkDwUyRJAkSwBFMkSQJEsARTJEkCRLAEUyRJAkSwBFMkSQJEsAbwkn+nQdqo4PBN4W+jZATrlKrTydww5d4dfGyRDx7mgwg8Vsc+D2bbZE/tuwHO/x6WTL/o9/NsHVvPrWIoqg024fj2XGtnXeyg8mf7OjLPbGoWWs5rfQiW3LPSs8DfSG3i/vzljn/MTmm/3mhznAqWahjXee2QXS/4FOdc6/xmMSe5/R6l8ikvHjU69io7QVJzPplDY30Y27VC2xeRmUGKGsclyGzwQTzToNb+bLFN8xCG8hgpGxt+AHvRwuNPGVSj5wd84b1ZRufWOrxX3oNv2quw0PHY19WGOz3EQNyyS05uo1DatkTBEBD1LzqN3WRSJGtImrM+uvQ4jHZhzvyYbfwZWZm4wO7UpsMiBBBw7wXRNitQpisnTdn2dpYd/zHQzIm+twiJ2D++7LM0lp9kU1/Z3xbHquPam49FUHs279DS8Rn4pvlLm6cnR/6/n0IvrM0O+JIdJ11ycHVkRyYnEqewMCvkU0ErNpDSrQEthJfEoni9dL+W2oeesazPtdmflMcLCwinTg4jLnS/JYdK1B2yNd4671nyn7CiGeHjo4bjrd08gWyTszAmkaztNU9oooW0VFeM1P4YqOV7Ml64nOLuYZL1jiujjp84AiVZ4xYn40zXbMrFKl9aFYbMdXbOFIJ7qmm13VtMpXPavcXVLP+sNrFDRuBGvspERf7pmUbtvXfKaH8EY4PSECo/0n9H31YuEuYPI4Fl+hMtWBtq+BrDoLOtUb4QR5NxZ3I3AAHRtq5JvhojCs26H3fNGwfzpmvUBkN+iqP08GVsrbqHQPAJuwkheRpZ2Flnf+1MnCNOQYXg4JDv36gvDnOmaMplZURfJ4F+dN4iwomYVld2YCi97t5LNb+CqdYTznKjeNsm8vVm0jhe4+7RIsCP7cdju2AIxvB1Rxtk2je2/NMVReE27Wy9ymxje0DvNnrCdTZLv3JvdF/o/zdT9OFaZ7vbtKHS6RusjNLNRY3XkConv5b3drSW2HFDq1poQIvrOdG15mbs3OkevOP0HrWmzhZqfg7EoYVHwd5xRfC9LwjwYr8PMoZzZgK3fz3FDy4cI0dzzZOvYjAgGpV4OkRuUQvWXP7FLz2g7DXQEKkIT6WUzMjsnQUdodruTnGIRFTZzZt6R6Xjc75g0UZjHuHYw1Xg9/HUUahTRt+1ADh5N/xfKUcKHWVcnKZBzAsXLBKINEXsbgIhHgjxMq1KriOq4xof9AZbSnKrVpTNve2nVNSlPWzP0UaPjW8Lty8k7Poc6jOTBl7rx6s2B8eHUiI4f34y3JOPtl/5kqNc4MF69+2YM5hAbL/pG+92BOVennqFgz9M9L8uGn4xewJgbUxv9Z3xgct/UjfaPaKqNeXR/0xHJCr8q1N94SQBFsgRQJEsARbIEUCRLAEWyBFAkSwBFsgT4HxQ8/CE4B3ErAAAAAElFTkSuQmCC” + #引号 + “}], ” + #引号 + “fetch” + #引号 + “: [” + #引号 + “save_infer_model/scale_0.tmp_1” + #引号 + “]}”
提交数据 = #常量1
提交协议头 = “Content-Type:application/json”
是否重定向 = 真
结果 = 网页_访问S (网址, 方式, 提交数据, , , 提交协议头, , 是否重定向, , , , , , , , , , )
JSON.解析 (结果)
调试输出 (JSON.取属性 (“result.res”).取数据文本 ())
返回 (结果)

最终验证结果:

["其他工具相","第二个"]

10、其他易语言识别,未测试

.

版本 2
.支持库 spec
.局部变量 base64, 文本型
.局部变量 Str, 文本型
.局部变量 post, 文本型
base64 = 到文本 (编码_BASE64编码A (#图片1, ))
post = “{\'images\': [\'” + base64 + “\']}”
post = 子文本替换 (post, “'”, #引号, , , 真)
post = 子文本替换 (post, “\”, “”, , , 真)
Str = 编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://127.0.0.1:8868/predict/ocr_system”, 1, post, , , “Content-Type:application/json”, , , , , , , , , , , , , )))
调试输出 (Str)

这里的协议头 是必须要带上  勿忘  

11、其他说明

pip3 install paddleocr 如果不能成功,则可以在PaddleOCR根目录下运行py文件,因为此目录下有paddleocr.py文件,可以直接被调用,且此目录下的tools、ppocr、ppstructure这三个目录都是必须的,可以直接将【paddleocr.py、tools、ppocr、ppstructure】四个文件复制到自己的目录中,则直接可被成功调用。

参考地址一

参考地址二

参考地址三