【PaddleOCR】Flask+SpringCloud+Nacos+PaddleOCR的图片识别案例,使用Feign调用

【PaddleOCR】Flask+SpringCloud+Nacos 的图片识别案例



前言

例如:最近一直在玩百度的飞桨中的 PaddleOCR ,想想是否可以让其作为一个服务来单独运行,为别的业务做辅助。由于现在都是微服务进行管理,和服务之间的调用。所以进行了如下的一些编码工作。


提示:以下是本篇文章正文内容,下面案例可供参考

一、PaddleOCR是什么?

首先拆解两个词的含义 Paddle (船桨) ,其实和本文没有大致关系,只不过是百度一个深度学习的平台。儿这个名字的来源也别有用意:
Paddle 是 Parallel Distributed Deep Learning 的缩写,中文名字是并行分布式深度学习。paddle 的原意是“用浆划动”,所以 logo 也是两个划船的小人,也就是等待众人划桨的中国 AI 大船。

OCR:光学字符识别(Optical Character Recognition, OCR)是指对文本材料的图像文件进行分析识别处理,以获取文字和版本信息的过程。也就是说将图象中的文字进行识别,并返回文本形式的内容。例如(该预测效果基于PaddleHub一键OCR中文识别效果展示):
PaddleOCR 给出的轻量级的一些原理以及解释:PaddleOCR
详细看下面这个链接
但是官方的一些案例都是一些在线的方案,而且是由PaddleHub进行使用的。但是没有“接地气”的使用方式。(有没有 不使用官方的PaddleHub 进行部署的方式来自己搞一个OCR 识别服务呢?)
我就是做了一个这样的项目,感兴趣的同学可以看看,当然只是实现了基础的功能,后续还要去整合OpenCV 进行图片的矢量处理什么的,让图片有更精确的识别。

二、使用步骤

使用步骤的前提:

需要安装PadleOcr的组件,这里可以去查看这个博客 安装PaddleOCR

项目的大致结构如下:
项目采用Python 的一个Web 框架,Flask 进行服务发现和服务注册的
在这里插入图片描述

app/app.py 项目的入口启动入口文件
register/register.py 定时去保持Nacod 的服务心跳以及注册
route/demo.py 是本次项目的演示案例
servcie/ocr.py 是本次识别的PaddleOCR 的识别业务代码

本项目的使用前台需要准备Nacos服务中心进行注册:需要使用本项目实例的需要启动一个2.x.x版本的Naocs

下面依次把代码取出进行解释:

代码如下(示例):

启动服务:

import threading

from python.ocr.route.demo import server
from python.ocr.register.server import service_register,service_beat


# 发布http服务,并且注册到nocos
if __name__ == "__main__":
    service_register()
    # 5秒以后,异步执行service_beat()方法
    threading.Timer(5, service_beat).start()
    server.run(port=8085, debug=True)

使用Flask 进行Nacos服务注册

import time

import requests


# nacos服务注册
def service_register():
    url = "http://192.168.55.76:8848/nacos/v1/ns/instance?serviceName=theta-ocr-server&ip=127.0.0.1&port=8085&namespaceId=59656ea3-0252-4b9c-b9d2-3ae3eab5f631"
    res = requests.post(url)

    print("向nacos注册中心,发起服务注册请求,注册响应状态: {}".format(res.status_code))


# 服务检测 定时任务进行服务续期心跳
def service_beat():
    while True:
        url = "http://192.168.55.76:8848/nacos/v1/ns/instance/beat?serviceName=theta-ocr-server&ip=127.0.0.1&port=8085&namespaceId=59656ea3-0252-4b9c-b9d2-3ae3eab5f631"
        res = requests.put(url)
        print("已注册服务,执行心跳服务,续期服务响应状态: {}".format(res.status_code))
        time.sleep(5)

下面是请求服务的示例,实际由FeignClent调用

from flask import Flask, jsonify, request
from werkzeug.utils import secure_filename
from python.ocr.service.ocr import open_file

import os

# Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的,官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flask
server = Flask(__name__)
# 处理乱码
server.config['JSON_AS_ASCII'] = False

#测试代码
@server.route('/simulation/analysis/<name>', methods=['get'])
def demo_restful_request(name):
    # 处理业务逻辑
    # name = request.args['name']
    result = {"code": "200", "msg": "SUCCES", "data": {"name": name, "age": 25, "job": "python"}}
    return jsonify(result)

#测试代码
@server.route('/simulation/analysis', methods=['get'])
def demo_rest_get_request():
    # 处理业务逻辑
    name = request.args['name']
    result = {"code": "200", "msg": "SUCCES", "data": {"name": name, "age": 25, "job": "python"}}
    return jsonify(result)



@server.route('/ocr/test', methods=['post'])
def demo_rest_post_request():
    f = request.files.get("file")
    basepath = os.path.dirname(__file__)
    upload_path = os.path.join(basepath, 'static',secure_filename(f.filename))
    f.save(upload_path)
    return jsonify(open_file(upload_path))

PaddleOCR 核心代码使用paddleocr

from paddleocr import PaddleOCR

def open_file(file_path):
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    print(file_path)
    # 输出结果保存路径
    result = ocr.ocr(file_path, cls=True)
    return result

启动以后Nacos 的服务列表中出现了一个ocr服务,并且为了防止服务下线,flask 需要不停的去执行心跳服务,保证服务可用,以下日志只为了案例延时使用。
在这里插入图片描述

在这里插入图片描述

这说明ocr服务以及注册到了Nacos 上,接下来就可以使用 使用Java 代码进行一个服务调用,进行图片文字识别了。
这里我已我自己启动一个consumer,服务为例进行演示。

示例代码结构如下,其中consumer 模拟了服务调用者,进行Flask实现的OCR服务调用。
在这里插入图片描述

代码如下:

package com.momo.theta.controller;

import com.momo.theta.feign.OcrFeign;
import com.momo.theta.feign.UserFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@RestController
@RequestMapping("ocrTest")
public class OcrTestController {

    @Autowired
    private OcrFeign ocrFeign;


    /**
     * 上传图片文件
     *
     * @param file
     * @return
     */
    @PostMapping(value = "/tbk/feedback/upload")
    String uploadImage(@RequestParam("file") MultipartFile file){
        log.info("传输文件的名字:{}",file.getOriginalFilename());
        return ocrFeign.ocr(file);
    }

}

其中OcrFeign 中的代码如下:

package com.momo.theta.feign;

import com.momo.theta.api.OcrService;
import org.springframework.cloud.openfeign.FeignClient;


/**
 * @author momo
 */
@FeignClient(name = "theta-ocr-server")
public interface OcrFeign extends OcrService {}

当我们去调用 /tbk/feedback/upload 这个接口的时候,实际会把上传的图片传入到OCR服务进行文字识别,然后返回识别结果
如果我已下面图片为例:由于CSDN会加水印,请学习的同学自己进行查找图片使用。
请添加图片描述

详细结果如下
在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Flask+SpringCloud+Nacos+PaddleOCR的图片识别案例,接下来需要整合OpenCV 进图片,腐化,精准识别的操作,譬如目前流行的“车牌识别”等等。。。
当然 此案例的代码均已经整合到本人一个项目中去,并且已经在Github公开,原文中的代码均可以在此项目中查看。点击Theta 获取源码

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于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、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
Flask 中实现 Vue 图片上传功能,可以使用 FlaskFlask-Uploads 扩展,它可以方便的处理文件上传。下面是一个使用 Flask-Uploads 实现 Vue 图片上传功能的代码示例: 1. 安装 Flask-Uploads 扩展: ``` pip install flask-uploads ``` 2. 在 Flask 中配置上传文件存储位置: ```python from flask import Flask from flask_uploads import UploadSet, IMAGES, configure_uploads app = Flask(__name__) app.config['UPLOADED_PHOTOS_DEST'] = 'static/uploads/photos' photos = UploadSet('photos', IMAGES) configure_uploads(app, photos) ``` 3. 在 Vue 中添加文件上传组件: ```html <template> <div> <input type="file" @change="onFileChange"> <button @click="upload">上传</button> </div> </template> <script> export default { data() { return { file: null, url: null } }, methods: { onFileChange(event) { this.file = event.target.files[0] }, upload() { let formData = new FormData() formData.append('photo', this.file) axios.post('/upload', formData).then(response => { this.url = response.data.url }) } } } </script> ``` 4. 在 Flask 中添加上传文件的路由: ```python from flask import request, jsonify from app import app, photos @app.route('/upload', methods=['POST']) def upload(): if 'photo' in request.files: filename = photos.save(request.files['photo']) url = photos.url(filename) return jsonify({'url': url}) return '', 400 ``` 在这个例子中,我们使用Flask-Uploads 扩展来处理文件上传并且将上传的文件保存在 `static/uploads/photos` 目录下。在 Vue 中,我们使用 `input` 标签和 `FormData` 对象来上传文件,并在上传成功后将文件的 URL 显示出来。在 Flask 中,我们定义了一个路由 `/upload`,用于接收上传的文件,通过 Flask-Uploads 扩展将文件保存到本地,并返回文件的 URL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值