您现在的位置是:首页 >技术杂谈 >【PaddleOCR】Flask+SpringCloud+Nacos+PaddleOCR的图片识别案例,使用Feign调用网站首页技术杂谈

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

%7_life 2023-06-26 08:00:02
简介【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 获取源码

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。