README.md 3.7 KB
Newer Older
1 2 3
# 服务端预测部署

`PaddleDetection`训练出来的模型可以使用[Serving](https://github.com/PaddlePaddle/Serving) 部署在服务端。  
C
cnn 已提交
4
本教程以在COCO数据集上用`configs/yolov3/yolov3_darknet53_270e_coco.yml`算法训练的模型进行部署。  
5
预训练模型权重文件为[yolov3_darknet53_270e_coco.pdparams](https://paddledet.bj.bcebos.com/models/yolov3_darknet53_270e_coco.pdparams)
6 7 8

## 1. 首先验证模型
```
9
python tools/infer.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml --infer_img=demo/000000014439.jpg -o use_gpu=True weights=https://paddledet.bj.bcebos.com/models/yolov3_darknet53_270e_coco.pdparams --infer_img=demo/000000014439.jpg
10 11 12
```

## 2. 安装 paddle serving
C
cnn 已提交
13
请参考[PaddleServing](https://github.com/PaddlePaddle/Serving/tree/v0.5.0) 中安装教程安装
14 15

## 3. 导出模型
W
wangguanzhong 已提交
16
PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.0/docs/advanced_tutorials/deploy/EXPORT_MODEL.md)
17 18

```
C
cnn 已提交
19
python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml -o weights=weights/yolov3_darknet53_270e_coco.pdparams --export_serving_model=True
20 21
```

C
cnn 已提交
22
以上命令会在`output_inference/`文件夹下生成一个`yolov3_darknet53_270e_coco`文件夹:
23
```
C
cnn 已提交
24 25
output_inference
│   ├── yolov3_darknet53_270e_coco
26
│   │   ├── infer_cfg.yml
C
cnn 已提交
27 28 29
│   │   ├── model.pdiparams
│   │   ├── model.pdiparams.info
│   │   ├── model.pdmodel
30 31 32 33
│   │   ├── serving_client
│   │   │   ├── serving_client_conf.prototxt
│   │   │   ├── serving_client_conf.stream.prototxt
│   │   ├── serving_server
C
cnn 已提交
34 35 36 37
│   │   │   ├── __model__
│   │   │   ├── __params__
│   │   │   ├── serving_server_conf.prototxt
│   │   │   ├── serving_server_conf.stream.prototxt
38 39 40 41 42 43
│   │   │   ├── ...
```

`serving_client`文件夹下`serving_client_conf.prototxt`详细说明了模型输入输出信息
`serving_client_conf.prototxt`文件内容为:
```
C
cnn 已提交
44 45 46 47 48 49 50 51
lient_conf.prototxt
feed_var {
  name: "im_shape"
  alias_name: "im_shape"
  is_lod_tensor: false
  feed_type: 1
  shape: 2
}
52 53 54 55 56 57 58 59 60 61
feed_var {
  name: "image"
  alias_name: "image"
  is_lod_tensor: false
  feed_type: 1
  shape: 3
  shape: 608
  shape: 608
}
feed_var {
C
cnn 已提交
62 63
  name: "scale_factor"
  alias_name: "scale_factor"
64
  is_lod_tensor: false
C
cnn 已提交
65
  feed_type: 1
66 67 68
  shape: 2
}
fetch_var {
C
cnn 已提交
69 70
  name: "save_infer_model/scale_0.tmp_1"
  alias_name: "save_infer_model/scale_0.tmp_1"
71 72 73 74
  is_lod_tensor: true
  fetch_type: 1
  shape: -1
}
C
cnn 已提交
75 76 77 78 79 80 81
fetch_var {
  name: "save_infer_model/scale_1.tmp_1"
  alias_name: "save_infer_model/scale_1.tmp_1"
  is_lod_tensor: true
  fetch_type: 2
  shape: -1
}
82 83 84 85 86
```

## 4. 启动PaddleServing服务

```
C
cnn 已提交
87
cd output_inference/yolov3_darknet53_270e_coco/
88 89 90 91 92 93 94 95 96 97 98 99

# GPU
python -m paddle_serving_server_gpu.serve --model serving_server --port 9393 --gpu_ids 0

# CPU
python -m paddle_serving_server.serve --model serving_server --port 9393
```

## 5. 测试部署的服务
准备`label_list.txt`文件
```
# 进入到导出模型文件夹
C
cnn 已提交
100
cd output_inference/yolov3_darknet53_270e_coco/
101

C
cnn 已提交
102
# 将数据集对应的label_list.txt文件放到当前文件夹下
103 104 105
```

设置`prototxt`文件路径为`serving_client/serving_client_conf.prototxt`
C
cnn 已提交
106
设置`fetch``fetch=["save_infer_model/scale_0.tmp_1"])`
107 108 109 110

测试
```
# 进入目录
C
cnn 已提交
111
cd output_inference/yolov3_darknet53_270e_coco/
112

C
cnn 已提交
113 114
# 测试代码 test_client.py 会自动创建output文件夹,并在output下生成`bbox.json`和`000000014439.jpg`两个文件
python ../../deploy/serving/test_client.py ../../demo/000000014439.jpg
115
```