0


PaddleOCR 使用 FastDeploy 服务化部署及postman、java调用服务的方法

服务化部署

部署这块大部分按着官方文档来做就差不多

PaddleOCR/deploy/fastdeploy/serving/fastdeploy_serving at dygraph · PaddlePaddle/PaddleOCR · GitHub

提一下两个需要注意的点。

一、如果跟我一样选择的是cpu的版本,那么修改config.pbtxt配置文件时不仅得按官方说的需要修改kind: KIND_GPU为kind: KIND_CPU,还需要把后面的gpus: [0]这块也删掉

instance_group [
  {
    # The number of instances is 1
    count: 1
    # Use GPU, CPU inference option is:KIND_CPU
    kind: KIND_GPU
    # The instance is deployed on the 0th GPU card
    gpus: [0]
  }
]

改为
instance_group [
  {
    # The number of instances is 1
    count: 1
    # Use GPU, CPU inference option is:KIND_CPU
    kind: KIND_CPU
  }
]

二、还是如果跟我一样使用的是cpu的版本,截至目前最新的fastdeploy:1.0.4-cpu-only-21.10版本,它默认的paddle推理引擎是有问题的,识别不出内容,需要更换其它支持cpu的引擎,比如OpenVINO 、ONNXRuntime。在config.pbtxt中做修改

optimization {
  execution_accelerators {
    # GPU推理配置, 配合KIND_GPU使用
    gpu_execution_accelerator : [
      {
        name : "paddle"
        # 设置推理并行计算线程数为4
        parameters { key: "cpu_threads" value: "4" }
        # 开启mkldnn加速,设置为0关闭mkldnn
        parameters { key: "use_mkldnn" value: "1" }
      }
    ]
  }
}
改为(记得把“gpu_execution_accelerator”改为“cpu_execution_accelerator”)
optimization {
  execution_accelerators {
  cpu_execution_accelerator : [ {
    name: "openvino",
    # set cpu threads
    parameters { key: "cpu_threads" value: "4" }
  }]
}}

出来以下信息就差不多是服务已经起来了

postman调用

这块我看文档是一头雾水,看不出怎么用postman和java去调用这个FastDeploy服务。摸索了好久总算调用成功了,赶紧来总结一下。

postman方面

请求路径就是"服务ip:端口/v2/models/pp_ocr/versions/1/infer"

请求体格式如下;outputs是指需要返回什么信息,如果只想要识别文本内容可以只保留{"name": "rec_texts" }。

{
  "inputs": [
    {
      "name": "INPUT",
      "shape": [1, {图片的宽度}, {图片的高度}, 3],
      "datatype": "UINT8",
      "data": {三维数组}    }
  ],
  "outputs": [
    {
      "name": "rec_texts"
    },
    {
      "name": "rec_scores"
    },
    {
      "name": "det_bboxes"
    }
  ]
}

这三维数组是图片的rgb信息,获取图片三维数组方法可以用下面的工具类来获取(我找chatgpt要的代码)。

    /**
     * 返回图片的RGB三维数组
     * @param path 图片路径
     * @return
     * @throws IOException
     */
    public static int[][][] readImagePath(String path) throws IOException {
        BufferedImage image = ImageIO.read(new File(path));
        int height = image.getHeight();
        int width = image.getWidth();
        int[][][] rgbArray = new int[height][width][3];
        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                int pixel = image.getRGB(col, row);
                rgbArray[row][col][0] = (pixel >> 16) & 0xff; // R
                rgbArray[row][col][1] = (pixel >> 8) & 0xff; // G
                rgbArray[row][col][2] = pixel & 0xff; // B
            }
        }
        return rgbArray;
    }

java调用

生成json部分

    /**
     * 生成json对象,懒得搞一堆对应的类了
     * @param imgHeight
     * @param imgWidth
     * @param rgbArray
     * @return
     */
    public static JSONObject generateJson(int imgHeight, int imgWidth, Integer[][][] rgbArray) {
        JSONObject jsonObject = new JSONObject();
        JSONArray inputArray = new JSONArray();
        JSONObject inputObject = new JSONObject();
        JSONArray shapeArray = new JSONArray();
        shapeArray.add(1);
        shapeArray.add(imgHeight);
        shapeArray.add(imgWidth);
        shapeArray.add(3);
        JSONArray dataArray=new JSONArray();
        JSONArray datajsonArray = JSONArray.parseArray(JSONArray.toJSONString(rgbArray));
        dataArray.add(datajsonArray);
        inputObject.put("name", "INPUT");
        inputObject.put("shape", shapeArray);
        inputObject.put("datatype", "UINT8");
        inputObject.put("data", dataArray);
        inputArray.add(inputObject);
        jsonObject.put("inputs", inputArray);
        JSONArray outputArray = new JSONArray();
        JSONObject outputObject1 = new JSONObject();
        outputObject1.put("name", "rec_texts");
        outputArray.add(outputObject1);
        jsonObject.put("outputs", outputArray);
        return jsonObject;
    }

OKHttp发送请求部分

    /**
     * 连接新方式部署的ocr服务
     *
     * @param jsonParamStr
     * @return
     */
    public static String fastDeployConnect(String jsonParamStr) throws IOException {

        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, jsonParamStr);

        Request request = new Request.Builder()
                .url("http://{ip}:{端口}/v2/models/pp_ocr/versions/1/infer")
                .post(body)
                .build();

        try (Response response = HTTP_CLIENT.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException(exMessage);
            }
            String str = response.body().string();

            return str;
        } catch (IOException e) {
            throw e;
        }
    }

题外话

我在使用中发现了这fastdeploy服务有几率传图片识别文字报错 module 'numpy' has no attribute 'astype'。

0904 11:59:10.734353 1515 pb_stub.cc:402] Failed to process the request(s) for model 'det_postprocess_0', message: AttributeError: module 'numpy' has no attribute 'astype'

At:
  /usr/local/lib/python3.8/dist-packages/numpy/__init__.py(284): __getattr__
  /opt/tritonserver/FastDeploy/examples/vision/ocr/PP-OCR/serving/fastdeploy_serving/models/det_postprocess/1/model.py(196): execute

初步排查是models/det_postprocess/1/model.py文件里的execute方法写错代码,我将倒数第二行修改为了倒数第一行,问题暂时解决。如果github有大佬指导更正确的修改方式再回来修改。

                for index in range(len(image_list)):
                    if cls_labels[index] == 1 and cls_scores[
                            index] > self.cls_threshold:
                        image_list[index] = cv2.rotate(
                            image_list[index].astype(np.float32), 1)
                        #image_list[index] = np.astype(np.uint8)
                        image_list[index] = image_list[index].astype(np.uint8)
标签: paddle

本文转载自: https://blog.csdn.net/qq_30946821/article/details/131408693
版权归原作者 zhouyiminga 所有, 如有侵权,请联系我们删除。

“PaddleOCR 使用 FastDeploy 服务化部署及postman、java调用服务的方法”的评论:

还没有评论