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】四个文件复制到自己的目录中,则直接可被成功调用。