服务化部署
部署这块大部分按着官方文档来做就差不多
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)
版权归原作者 zhouyiminga 所有, 如有侵权,请联系我们删除。