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

目录

服务化部署

postman调用

java调用

题外话


服务化部署

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

https://github.com/PaddlePaddle/PaddleOCR/tree/main/deploy/fastdeploy/serving/fastdeploy_serving

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

一、如果跟我一样选择的是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)

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
当容器化的Java服务调用外部会员服务出现故障时,以下是一般的排查流程和解决方法: 1. 确认故障范围:首先确定是整个微服务还是特定的接口或功能出现了问题。检查其他外部服务是否正常,以确定是否是与会员服务相关的问题。 2. 查看日志和异常信息:检查微服务的日志文件,查找与会员服务相关的异常信息或错误日志。关注是否有连接超时、连接断开、请求失败等异常。 3. 检查网络连接:确保微服务与会员服务之间的网络连接正常,检查网络配置、防火墙设置、DNS解析等。可以尝试通过Ping命令或Telnet命令来测试网络连通性。 4. 检查服务配置:确保微服务的配置文件中包含正确的会员服务地址、端口号等信息。检查是否有任何配置错误或不一致。 5. 排查依赖库和版本:检查微服务的依赖库和版本是否与会员服务兼容。可能存在版本冲突或依赖库缺失的问题。 6. 进行故障模拟和重现:尝试在开发环境或测试环境中重现故障场景,并进行故障模拟。这有助于更好地定位问题并找到解决方案。 7. 与会员服务团队沟通:如果以上排查方法无法解决问题,建议与会员服务的团队进行沟通,并提供相关的日志、异常信息和重现步骤。他们可能能够提供更具体的支持和解决方案。 8. 修复和优化:根据问题的具体原因,进行相应的修复和优化。可能需要更新代码、修复bug、优化网络连接或调整配置等。 9. 重新测试和部署:在修复问题后,重新测试微服务与会员服务之间的连接和功能。确保修复后的系统正常运行,并进行部署到生产环境。 以上是一般的故障排查流程和解决方法。确保在处理故障时记录相关的信息,以便进行后续分析和改进。另外,持续监控和健康检查也是预防故障的重要手段,可以及时发现并解决潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值