基于Flask+PaddleOCR实现的通用OCR服务

PaddleOCR是一个用于文字识别的开源工具库,它基于深度学习技术,提供了预训练模型以简化开发者的工作。该项目包括Flask接口,支持通过Docker一键部署,能处理本地和远程图片的识别。用户可以通过API接口进行文字检测和识别。
摘要由CSDN通过智能技术生成

什么是PaddleOCR

PaddleOCR 是一个开源项目,旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。是基于深度学习技术实现的,所以使用时需要训练好的权重文件,但这个不需要我们担心,官方已为我们提供了。

在这里插入图片描述
项目Github地址: PaddleOCR地址

安装PaddleOCR

# requirements.txt
paddlehub==2.2.0
paddlepaddle==2.3.1
# 安装
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

代码实现

paddleocr实现文字识别核心代码

def ocr_img(images: list, remote=False):
    """
    识别多张图片,如果remote=True,则下载远程图片,如果remote=False,则直接将图片对象传入
    :param images: 图片列表
    :param remote: 释放远程
    :return:
    """
    try:
        result = []
        for i in range(0, len(images), 5):
            _img_paths = images[i: 1 + 5]
            ocr_model = get_ocr_model()
            print('ocr_model',ocr_model)
            img_paths = []
            if remote:
                for url in _img_paths:
                    img_name = download_img(url)
                    if not img_name:
                        continue
                    img_paths.append(img_name)
            else:
                for img in images:
                    img_name = str(int(time.time())) + '.jpg'
                    save_img(img_name, img)
                    img_paths.append(img_name)
            imgs = []
            for img in img_paths:
                img_name = handle_img(img)
                # 兼容中文路径
                # img = cv2.imdecode(np.fromfile(os.path.join(images_path, img_name), dtype=np.uint8), -1)
                img = cv2.imread(os.path.join(images_path, img_name))
                imgs.append(img)
            result.extend(ocr_model.recognize_text(images=imgs))
        return result
    except Exception as e:
        logger.error(f"OCR Model处理失败, error: {e}", exc_info=True)
        return []

def get_ocr_model():
    """手动GC,控制model使用内存"""

    global OCR_MODEL_USER_TIMES
    global OCRModel
    module_name = "chinese_ocr_db_crnn_server"
    # 使用10次,就释放模型
    if OCR_MODEL_USER_TIMES < 10:
        if not OCRModel:
            OCRModel = hub.Module(name=module_name)
        OCR_MODEL_USER_TIMES += 1
    else:
        del OCRModel
        gc.collect()
        OCRModel = hub.Module(name=module_name)
        OCR_MODEL_USER_TIMES = 0
    return OCRModel

flask对外提供的文字识别接口,支持文件和远程链接

@app.route('/ocr/img',methods=['POST','OPTIONS'])
def post():
    img_url = get_params('url')
    img = get_files('img')
    result = []
    if img_url:
        result = ocr_img(images=[img_url, ], remote=True)
    elif img:
        img = img.stream.read()
        result = ocr_img(images=[img, ], remote=False)
    else:
        result = AjaxResult(400,'','url与img必须传一个').data
        return jsonify(result)
    data = []
    for res in result:
        data.append(res['data'])

    return jsonify(AjaxResult(200,data,'success').data)

使用方法

识别上传的图片
在这里插入图片描述
识别远程图片
在这里插入图片描述

识别网络图片 json
{
    "url": "https://files.mdnice.com/user/4437/e2c791e3-a3d5-4d5b-9fb3-d6fe4a0d15d9.png"
}
识别上传的图片 form-data
img: formData()
返回值
{
    "code": 200,
    "msg": "success",
    "data": [
        [
            {
                "confidence": 0.9655303955078125,
                "text": "UBDS",
                "text_box_position": [
                    [
                        4,
                        1
                    ],
                    [
                        120,
                        1
                    ],
                    [
                        120,
                        28
                    ],
                    [
                        4,
                        28
                    ]
                ]
            }
        ]
    ]
}

下载

本资源对PaddleOCR进行了封装,使用Flask对外提供接口,可使用docker-compose一键部署。
基于Flask+PaddleOCR实现的通用OCR服务

【资源说明】 基于FlaskPaddleOCR进行部署项目源码+项目操作说明(方便调用).zip ## 目录说明 ``` - caches:上传过来识别的图片 - post - test-post.py:服务请求代码 - demo.jpg:测试图片 - templates:前端界面 - server.py:server端 ``` ## 本地使用 1. csdn下载本项目代码; 2. 安装好本地需要的环境(`paddlepaddle`、`paddleocr`、以及[requirements.txt](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/requirements.txt)); 3. 根据需求,修改`server.py`第97行`IP`(如果本地测试,建议`127.0.0.1`,如果云端部署,建议`0.0.0.0`); 4. 在此文件夹下启用服务: ``` python server.py ''' * Debugger is active! * Debugger PIN: 109-572-001 * Running on http://127.0.0.1:8090/ (Press CTRL+C to quit) ''' ``` 4. 根据输出访问:`http://ip:8090/` ,如果页面可以访问,即表示服务正常启动,可以做请求; ![](./images/2.jpg) 5. 进入`post`文件夹下,修改第4行`url`为上述输出`url`,修改第5行请求的图片名称,终端运行: ``` python test-post.py ''' { "服务状态": "success", "识别时间": "3.2900s", "识别结果": [ "健康宝", "2022年06月02日", "19:38:23", "未见异常②", "④核酸", "阴性", "时间", "#疫苗", "查看", "名", "姓", "李*", "身份证号", "61***", "**28", "查询时间", "06-0214:30", "失效时间", "06-0224:00", "返回首页", ] } ''' ``` ## 云端部署 1. 修改代码`IP`; 2. 放行服务服务端口,如:8090; > 在一台2核2G的服务器上,服务结果可在2s内返回。 ## 参数说明 - `use_angle_cls true`设置使用方向分类器识别180度旋转文字; - `use_gpu false`设置不使用GPU; - 单独使用检测:设置`rec`为`false`; - 单独使用识别:设置`det`为`false`; - paddleocr默认使用PP-OCRv3模型(`ocr_version=PP-OCRv3`),如需使用其他版本可通过设置参数`ocr_version`,具体版本说明如下: | 版本名称 | 版本说明 | | -------- | -------------------------------------------------- | | PP-OCRv3 | 支持中、英文检测和识别,方向分类器,支持多语种识别 | | PP-OCRv2 | 支持中英文的检测和识别,方向分类器,多语言暂未更新 | | PP-OCR | 支持中、英文检测和识别,方向分类器,支持多语种识别 | - PaddleOCR目前支持80个语种,可以通过修改`lang`参数进行切换,对于英文模型,指定`lang=en`,常用的多语言简写包括: | 语种 | 缩写 | | 语种 | 缩写 | | 语种 | 缩写 | | -------- | ----------- | ---- | -------- | ---- 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值