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