PaddleOCR将推理模型部署在web上(一)
-
首先引用一个开源项目: PaddleOCR-Flask-deploy
之后按照需要导入所有依赖包
觉得有启发可以给这个作者一个star
- caches:上传过来识别的图片
- post
- test-post.py:服务请求代码
- demo.jpg:测试图片
- templates:前端界面
- server.py:server端
根据自己模型修改server.py
此处使用的自己训练的模型,可根据需要自行修改
该我自己项目使用test-post.py
并没有成功,获取不到文件。所以自己新建了前端文件,使用网页form表单提交图片文件上传。
添加file网页,使用模型推理
file网页代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/ocr" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">上传</button>
</form>
</body>
</html>
必须添加 enctype="multipart/form-data"
修改路由,我的server.py如下
:
import base64
import os
import cv2
import time
import yaml
import uuid
import json
from datetime import timedelta
from PIL import Image
from flask import Flask, render_template, request, jsonify
from werkzeug.utils import secure_filename
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from paddleocr import PaddleOCR,draw_ocr
from werkzeug import run_simple
from werkzeug.datastructures import FileStorage
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(hours=1)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
app.config['CACHES_FOLDER'] = 'D:/PythonProject/PaddleOCR-Flask-deploy-main/caches/'
def allowed_file(fname):
return '.' in fname and fname.rsplit('.', 1)[1].lower() in ['png', 'jpg', 'jpeg']
@app.route("/")
def index():
return render_template('index.html')
@app.route("/file")
def upfile():
return render_template('file.html')
@app.route('/ocr', methods=['POST', 'GET'])
def detect():
file = request.files['file']
# file = file_1.read()
# file = base64.b64encode(file).decode()
# a = FileStorage(request.files.get('file'))
# b = a.stream.readlines()
print("1===========================", file)
if file and allowed_file(file.filename):
ext = file.filename.rsplit('.', 1)[1]
random_name = '{}.{}'.format(uuid.uuid4().hex, ext)
# save_path = os.path.join('./caches/', secure_filename(random_name))
save_path = os.path.join(app.config['CACHES_FOLDER'], secure_filename(random_name))
print("2==========================", save_path,"------------",type(save_path))
file.save(save_path)
# time-1
time.sleep(0.1)
t1 = time.time()
img = cv2.imread(save_path)
# img = Image.open(save_path).convert('RGB')
print("3==========================",img)
img_result = ocr.ocr(img, cls=False)
print(img_result)
# time-2
t2 = time.time()
'''
识别结果将以列表返回在img_result,根据具体需求进行改写
'''
results = []
for i in range(len(img_result)):
results.append(img_result[i][1][0])
return jsonify({
'服务状态': 'success',
'识别结果': results,
'识别时间': '{:.4f}s'.format(t2-t1)
})
return jsonify({'服务状态': 'faild'})
if __name__ == '__main__':
ocr = PaddleOCR(det_model_dir='inference/db_ABC/',rec_model_dir='inference/rec_ca/', lang='en',use_gpu= False)# 查看README的参数说明
app.run(host='127.0.0.1', port=8090, debug=True, threaded=True, processes=1)
'''
app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。
1.threaded : 多线程支持,默认为False,即不开启多线程;
2.processes:进程数量,默认为1.
'''
这里注意一个坑!!! 49行
file.save(save_path)
其中的save_path
我修改为绝对路径才成功,具体问题请看这两个链接
启动服务器,并运行网页
运行server.py
:
网页输入http://127.0.0.1:8090/file
选图片后上传成功,识别结果没出来,我发现如果使用自定义模型,需要将模型路径修改为绝对路径!!!
我将项目主要部分复制到本地PaddleOCR项目下,并修改模型路径为绝对路径
之后同样的操作,运行便可以了!!
我对Html做了修改识别效果如下:
废了好大一段事,这个部署方案应该算简单了