【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 获取源码