诚意满满的水贴, 谁看了不迷糊啊

接了个需求, 需要分析对话中出现的图片, 是否包含某些关键字以便屏蔽或者...巴拉巴拉的什么玩意儿的吧. 调研了几个ocr, 看起来百度这个paddleocr比较受推崇, 而且中文识别率看起来还不错. 所以, 先试试水咯~

因为是调研阶段, 老板说让我自己捯饬捯饬, 试试稳定性. 就不去嚯嚯我们的小服务器了. 本地搞, 但是看起来依赖的东西过多, 不想污染我的电脑. 那就好说了...docker走起.

众所周知, 百度的文档也是x, 一言难尽. 装了一早上. 当然, 也有我本身就不熟悉docker的原因

写下来的目的是为了以后...八成也用不上...好吧, 我承认, 我为了水活跃

下面进入备忘录正文:


环境准备

1. 拉取镜像 CPU. 自己也没有GPU啊. 这么奢侈

docker pull registry.baidubce.com/paddlepaddle/paddle:2.5.1

2. 本机切换到工作目录, 主要为了挂载目录

cd /data

3.启动容器, 并进去

docker run --name paddle_ocr --net=bridge -p 9998:9998 -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.5.1 /bin/bash

# --network=bridge 设置宿主网路
# -p 9998:9998 映射端口. ocr的端口默认9998, 自己也可以在改, 改完记得最后的config里处理下
# --name paddle_ocr:设定 Docker 的名称,paddle_ocr 是自己设置的名称;
# -it:容器和本机交互式运行;
# -v $PWD:/paddle:指定将当前路径(PWD 变量会展开为当前路径的绝对路径)挂载到容器内部的 /paddle 目录;(相当于 /opt/ppocr 挂载到容器内)
# registry.baidubce.com/paddlepaddle/paddle:2.5.1:指定需要使用的 image 名称,可以通过docker images命令查看;/bin/bash 是在 Docker 中要执行的命令

4.安装OCR

# 升级 pip 
pip install -U pip

# 容器中已经包含了 paddlepaddle 2.2.2
pip list

# 拉取 PaddleOCR 代码
git clone https://gitee.com/paddlepaddle/PaddleOCR.git

# 切换进入 PaddleOCR 目录
cd PaddleOCR

# 安装运行所需要的whl包
pip3 install -r requirements.txt -i https://mirror.baidu.com/pypi/simple

tips: python 工具管理

#如果遇到问题,尝试使用pip-review:pip-review是一个可以帮助你管理Python包依赖的工具。你可以使用以下命令安装它:
pip install pip-review

# 然后自动更新包和依赖
pip-review --auto


5.准备PaddleServing运行时环境

Tips: serving环境参考

# 切进部署目录
cd /home/PaddleOCR/deploy/pdserving

# 安装serving,用于启动服务

pip3 install https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server-0.8.3-py3-none-any.whl

# 安装client,用于向服务发送请求
pip3 install https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.8.3-cp37-none-any.whl

# 安装serving-app
pip3 install https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_app-0.8.3-py3-none-any.whl

6.模型转换

# 使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。

# 下载并解压 OCR 文本检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar -O ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar

# 下载并解压 OCR 文本识别模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar -O ch_PP-OCRv3_rec_infer.tar &&  tar -xf ch_PP-OCRv3_rec_infer.tar

# 接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。
# 转换检测模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_det_infer/ \
                                         --model_filename inference.pdmodel          \
                                         --params_filename inference.pdiparams       \
                                         --serving_server ./ppocr_det_v3_serving/ \
                                         --serving_client ./ppocr_det_v3_client/

# 转换识别模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_rec_infer/ \
                                         --model_filename inference.pdmodel          \
                                         --params_filename inference.pdiparams       \
                                         --serving_server ./ppocr_rec_v3_serving/  \
                                         --serving_client ./ppocr_rec_v3_client/

检测模型转换完成后,会在当前文件夹多出ppocr_det_v3_serving 和ppocr_det_v3_client的文件夹(识别模型同理),具备如下格式:

|- ppocr_det_v3_serving/
  |- __model__  
  |- __params__
  |- serving_server_conf.prototxt  
  |- serving_server_conf.stream.prototxt

|- ppocr_det_v3_client
  |- serving_client_conf.prototxt  
  |- serving_client_conf.stream.prototxt

7. Paddle Serving pipeline部署

  1. 确认工作目录
# pdserver目录包含启动pipeline服务和发送预测请求的代码,包括

__init__.py
config.yml            # 启动服务的配置文件
ocr_reader.py         # OCR模型预处理和后处理的代码实现
pipeline_http_client.py   # 发送pipeline预测请求的脚本
web_service.py        # 启动pipeline服务端的脚本
  1. 启动服务
# 启动前需要检查设置 config中的GPU和CPU设置, 线程可以暂时不用理会

vim config.yml

# set op.det.devices = "" 不写使用cpu  rec同理

# 启动服务,运行日志保存在log.txt
python3 web_service.py --config=config.yml &>log.txt &

# 查看启动日志
tail -f log.txt

赠送Java部分测试代码

/**
 * ocr 请求对象
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OcrParam {
    private List<String> key;
    private List<String> value;
}

本机装好的地址是 http://127.0.0.1:9998/ocr/prediction 图片需要base64

    /**
     * 获取OCR识别对象
     *
     * @param imgs
     * @return
     */
    private static String reqOcr(List<String> imgs, String ocrServer) {
        OcrParam data = new OcrParam();
        List<String> keyList = new ArrayList<>();
        keyList.add("image");
        data.setKey(keyList);

        data.setValue(imgs);
        return HttpUtil.post(ocrServer, JSON.toJSONString(data));
    }

    /**
     * 转base64图片
     *
     * @param imgPath
     * @return
     */
    private static 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编码过的字节数组字符串
        return encoder.encode(Objects.requireNonNull(data));
    }
   
  • java

    166 引用
  • 后端

    66 引用
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

    29 引用
  • 今天玩点啥

    98 引用