Python示例
示例目录结构
1edgeboard-191:~/root/workspace/PaddleLiteDemo# ls
2C++ README.md configs Python res
C++ : C++语言编写的demo 源码
python : python语言编写的demo 源码
configs : 存放了示例运行需要的配置文件
res: 存放了模型相关文件和图片文件
系统配置文件描述
configs目录中已经默认添加每个 模型对应4种不同 输入源的配置
1 configs ✗ tree
2.
3├── classification
4│ ├── Inceptionv2
5│ ├── Inceptionv3
6│ ├── mobilenetv1
7│ └── resnet50
8│ ├── image.json
9│ ├── multi_channel_camera.json
10│ ├── rtspcamera.json
11│ └── usbcamera.json
12├── detection
13│ ├── mobilenet-ssd
14│ ├── mobilenet-ssd-640
15│ ├── mobilenet-yolov3
16│ ├── vgg-ssd
17│ └── yolov3
18│ ├── image.json
19│ ├── multi_channel_camera.json
20│ ├── rtspcamera.json
21│ └── usb_camera.json
22└── segmentation
23 └── deeplabv3
24 ├── image.json
25 ├── multi_channel_camera.json
26 ├── rtspcamera.json
27 └── usbcamera.json
28
2913 directories, 12 files
json配置文件格式如下:
1{
2 "model_config": "../../res/modles/detection/yolov3",
3 "input": {
4 "type": "usb_camera",
5 "path": "/dev/video2"
6 },
7 "debug": {
8 "display_enable": true,
9 "predict_log_enable": true,
10 "predict_time_log_enable": true
11 }
12}
配置文件参数说明:
model_config : 模型的目录,相对于 PaddleLiteDemo/C++/build 目录,各个示例支持的模型见目录
type: 输入源的类型,可选项目,支持的value有:image、usb_camera
path: 输入源对应的 设备节点或url 或 图片的名字
注意:Python示例只支持image和usb_camera的type,不支持rtsp_camera和multichannel_camera,故不支持使用Python示例接入网络摄像头推理。
| type | path | 备注 | 支持的设备 |
|---|---|---|---|
| image | ../../res/models/XXX | 使用图片作为输入源 | ALL |
| usb_camera | /dev/video0 | USB摄像头 | FZ3X/5X |
| usb_camera | /dev/video2 | USB摄像头 | FZ9D |
注意:
display_enable: 显示器显示开关,当没有显示器时可以设置为 false
predict_log_enable : 预测的结果通过命令行打印的开关
predict_time_log_enable: 模型预测单帧耗时的打印开关(不包括图像处理时间)
模型配置文件描述
模型配置文件位于res/model每个模型文件夹下
1{
2 "network_type":"YOLOV3",
3
4 "model_file_name":"model",
5 "params_file_name":"params",
6
7 "labels_file_name":"label_list.txt",
8
9 "format":"RGB",
10 "input_width":608,
11 "input_height":608,
12
13 "mean":[123.675, 116.28, 103.53],
14 "scale":[0.0171248, 0.017507, 0.0174292],
15 "threshold":0.3
16}
参数说明:
模型类型:
- 非融合模型:
model_file_name : 指定模型文件的名字
params_file_name : 指定模型参数文件的名字
- 融合模型:
model_dir : 指定 模型与参数的目录
Python示例运行
执行目录
1cd /root/workspace/PaddleLiteDemo/Python
执行
classification.py 分类示例
detection.py 检测示例
以检测为例:
1cd /root/workspace/PaddleLiteDemo/Python
2python3 detection.py ../configs/detection/yolov3/usb_camera.json
Python接口
总体介绍
Python接口是对1.8.1预测库的python封装,方便在python中导入和使用预测库,进而完成模型部署。 正确的升级软核到1.8.1后,对应的python接口库会被安装在/usr/lib/python3.5/site-packages/
注意 python接口库被安装在python3环境下,请使用python3。
组成文件
1 configs ? tree
2.
3|——paddlelite.cpython-35m-aarch64-linux-gnu.so
4|——edgeboard
5 |——__init__.py
6 |——predictor.py
7 |——preprocess.py
8
91 directories, 4 files
各个文件功能简介
- paddlelite.cpython-35m-aarch64-linux-gnu.so是对预测库的外部接口的pybind封装
- edgeboard/predictor.py是对预测库执行器的封装,包含模型初始化,数据读入,数据预测和结果导出
- edgeboard/preprocess.py是对fpga预处理功能的python封装。这里提供了基于fpga的预处理接口
predictor API功能简介
1class PaddleLitePredictor(object):
2 """ 这个类是对pybind封装的Predictor的进一步封装 """
3
4 def __init__(self):
5 self.predictor = None
6
7 def set_model_file(self, path):
8 """配置模型文件的路径,一般都是"model"或者"__model__" """
9
10
11 def set_param_file(self, path):
12 """配置模型文件的路径,一般都是"params"或者"__params__" """
13
14 def set_model_dir(self, path):
15 """配置模型文件的目录"""
16
17 def load(self):
18 """根据上面三个模型路径相关的api设置,初始化C++侧的predictor并将模型装载到内存"""
19
20 def get_input(self, index):
21 """获取到predictor的第index位置处的输入空tensor,预处理后的结果最终会拷贝到这个tensor中"""
22
23 def set_input(self, data, index):
24 """将预处理后的输入数据numpy.array设置到predictor的第index个输入tensor中"""
25
26 def run(self):
27 """完成一次模型推理"""
28
29 def get_output(self, index):
30 """取出第index位置的输出结果"""
preprocess API功能简介
1class ImageTransformer(object):
2 """这个类是对fpga预处理功能的封装,包括resize,格式转换和均值方差操作"""
3
4 def __init__(self, image, mean, scale, dst_shape, dst_format, src_format="BGR"):
5 """初始化预处理参数"""
6
7
8 def set_mean_scale(self, mean, scale):
9 """
10 out = (x / 255 - mean) * scale
11 """
12
13 def read_image(self, image):
14 """读入原图"""
15
16 def set_dst_format(self, dst_format):
17 """
18 默认原图是BGR, 如果需要转RGB,要在这里设置
19 """
20
21 def set_src_format(self, src_format):
22 """
23 默认是BGR
24 """
25
26 def set_shape_config(self, src_shape, dst_shape):
27 """
28 fpga的预处理只支持到1080p,如果输入尺寸超过这个限制,只能先做cpu resize
29 """
30
31 def transforms(self, input_tensor):
32 """
33 从predictor中拿到输入tensor,将预处理后的结果写入这个tensor
34 """
