基于百度的paddle实现的图片识别文字,参考以下文章整理出linux环境下的paddle部署
PaddleOCR在windows中的使用_from paddle.fluid.layers import rnncell, lstmcell,-CSDN博客
一、下载PaddleOCR
可以先在window中下载,在github或者gitee上面可以下载相关的解压包,下载地址:PaddleOCR下载
下载好后解压PaddleOCR,看到一个deploy目录,进去
deploy下有部署文档说明
进入ocr_system
打开params.py查看
下载模型,下载地址:模型下载
下载好之后,在对应的PaddleOCR解压缩包的目录下新建inference文件夹,如下图所示,并将下载好的模型,放到这里,然后解压缩
打开检查params.py路径是否一致
打开config.json文件,改成false后保存,安装的是CPU版的PaddlePaddle所以这里的true需要改成false
完成之后放入Linux下
二、安装python环境
使用paddlepaddle需要先安装python环境,可以通过anaconda一键安装python环境
anaconda下载地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
开始anaconda安装python环境
sh Anaconda3-2021.11-Linux-x86_64.sh
按照安装提示安装,遇到查看许可时可输入q来退出
继续直到完成安装
手动将conda加入环境变量
vim ~/.bashrc
在第一行输入:
export PATH="root/anaconda3/bin:$PATH"
刷新环境变量
source ~/.bash_profile
验证是否能识别conda命令
conda info --envs
显示当前有base环境,则conda已加入环境变量
二、创建conda环境
创建paddle_env的运行环境
conda create --name paddle_env python=3.8 --channel
Index of /anaconda/pkgs/free/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
等待安装完成,系统会创建1个名为paddle_env、python版本为3.8的可执行环境
激活刚创建的paddle_env环境
conda activate paddle_env
- 安装paddlehub及其依赖库
安装paddle
# 默认安装CPU版本
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安装完paddle后在PaddleOCR路径下通过命令进行相关模块的安装
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
当出现Successfully installed …就说明安装成功了
安装Hub Serving
pip install paddlehub -i https://mirror.baidu.com/pypi/simple
不要关闭窗口,也不要对窗口进行任何操作,直到出现,出现Successfully installed。。。这个说明安装成功
配置好了之后,进入对应的虚拟环境,然后输入hub出现下图所示的内容
安装服务模块
# 安装检测服务模块:
hub install deploy/hubserving/ocr_det/
# 安装分类服务模块:
hub install deploy/hubserving/ocr_cls/
#安装识别服务模块:
hub install deploy/hubserving/ocr_rec/
# 安装检测+识别串联服务模块:
hub install deploy/hubserving/ocr_system/
四、启动服务
#配置文件启动
hub serving start -c deploy/hubserving/ocr_system/config.json
#后台启动
hub serving start -m ocr_system -p 8866 --use_multiprocess --workers=3 &
–use_multiprocess 代表启动多线程
–workers 代表线程数 一般为2*cpu-1
#关闭服务
hub serving stop -p 8866
访问接口:http://ip:端口/predict/ocr_system
测试服务是否启动成功
官方给出了两种模式,一是命令行执行,一是代码执行
命令:在/home/user/images目录下放入一张命名为test.png的图片,进入PaddleOCR-release-2.7/tools目录下执行命令:
python test_hubserving.py --server_url=http://127.0.0.1:8866/predict/ocr_system --image_dir=/home/user/images/test.png
代码:新建文件test.py,写入代码,注意代码中的地址要与图片存放地址一致
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
data = cv2.imencode('.png', image)[1]
return base64.b64encode(data.tobytes()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("./test.png"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ocr_system"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
在test.py目录下执行命令
python test.py
输出识别的文字说明成功。
五、java调用
private String getOrc(MultipartFile file) throws IOException {
try {
StringBuilder result = new StringBuilder();
HttpHeaders headers = new HttpHeaders();
//设置请求头格式
headers.setContentType(MediaType.APPLICATION_JSON);
//构建请求参数
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
InputStream imagePath = new FileInputStream(ToFile.multipartFiletoFile(file));
//添加请求参数images,并将Base64编码的图片传入
map.add("images", ImageToBase64(imagePath));
//构建请求
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
RestTemplate restTemplate = new RestTemplate();
//发送请求, springboot内置的restTemplate
Map json = restTemplate.postForEntity("http://192.168.1.5:8866/predict/ocr_system", request, Map.class).getBody();
System.out.println(json);
List<List<Map>> jsons = (List<List<Map>>) json.get("results");
System.out.println(jsons);
for (int i = 0; i < jsons.get(0).size(); i++) {
//System.out.println("当前的文字是:" + jsons.get(0).get(i).get("text"));
// 这里光靠这个trim()有些空格是去除不掉的,所以还需要使用替换这个,双重保险
result.append(jsons.get(0).get(i).get("text").toString().trim().replace(" ", ""));
}
String trim = result.toString().trim();
return trim;
}catch (RestClientException e) {
log.error("请启动识别服务部署!!!");
e.printStackTrace();
throw new InternalServerException("验证服务错误");
// Map<String, String> maps = new HashMap<>();
// maps.put("names", "");
}
}
private String ImageToBase64(InputStream imgPath) {
byte[] data = null;
// 读取图片字节数组
//Read the image byte array
try {
InputStream in = imgPath;
System.out.println(imgPath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
//Base64 encoding of byte array
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
//Returns a Base64 encoded byte array string
//System.out.println("图片转换Base64:" + encoder.encode(Objects.requireNonNull(data)));
return encoder.encode(Objects.requireNonNull(data));
}