PaddleOCR将自定义训练的推理模型部署在web上(一)

PaddleOCR将推理模型部署在web上(一)

  • 首先引用一个开源项目: PaddleOCR-Flask-deploy

之后按照需要导入所有依赖包
PaddleOCR将自定义训练的推理模型部署在web上(一)_第1张图片
觉得有启发可以给这个作者一个star

- caches:上传过来识别的图片
- post
	- test-post.py:服务请求代码
	- demo.jpg:测试图片
- templates:前端界面
- server.py:server端

我自己修改的项目上传在gitee

根据自己模型修改server.py

在这里插入图片描述
此处使用的自己训练的模型,可根据需要自行修改
该我自己项目使用test-post.py并没有成功,获取不到文件。所以自己新建了前端文件,使用网页form表单提交图片文件上传

添加file网页,使用模型推理

PaddleOCR将自定义训练的推理模型部署在web上(一)_第2张图片
file网页代码如下:

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
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我修改为绝对路径才成功,具体问题请看这两个链接

  1. 记录一个Flask文件上传的小坑
  2. flask中file.save小坑

启动服务器,并运行网页

运行server.py:
PaddleOCR将自定义训练的推理模型部署在web上(一)_第3张图片网页输入http://127.0.0.1:8090/file
PaddleOCR将自定义训练的推理模型部署在web上(一)_第4张图片
选图片后上传成功,识别结果没出来,我发现如果使用自定义模型,需要将模型路径修改为绝对路径!!!
PaddleOCR将自定义训练的推理模型部署在web上(一)_第5张图片
我将项目主要部分复制到本地PaddleOCR项目下,并修改模型路径为绝对路径

PaddleOCR将自定义训练的推理模型部署在web上(一)_第6张图片
PaddleOCR将自定义训练的推理模型部署在web上(一)_第7张图片
之后同样的操作,运行便可以了!!

我对Html做了修改识别效果如下:

PaddleOCR将自定义训练的推理模型部署在web上(一)_第8张图片
废了好大一段事,这个部署方案应该算简单了

你可能感兴趣的:(PaddleOCR,前端,flask,python,web)