Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleX
提交
21c8666a
P
PaddleX
项目概览
PaddlePaddle
/
PaddleX
通知
138
Star
4
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
43
列表
看板
标记
里程碑
合并请求
5
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleX
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
43
Issue
43
列表
看板
标记
里程碑
合并请求
5
合并请求
5
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
21c8666a
编写于
5月 18, 2020
作者:
J
jiangjiajun
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add docs
上级
1a9d7455
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
413 addition
and
15 deletion
+413
-15
docs/datasets.md
docs/datasets.md
+204
-0
docs/quick_start.md
docs/quick_start.md
+24
-15
docs/tutorials/deploy/deploy.md
docs/tutorials/deploy/deploy.md
+33
-0
docs/tutorials/deploy/depoly_openvino.md
docs/tutorials/deploy/depoly_openvino.md
+103
-0
docs/tutorials/deploy/encryption.md
docs/tutorials/deploy/encryption.md
+49
-0
未找到文件。
docs/datasets.md
0 → 100644
浏览文件 @
21c8666a
# 数据集格式说明
---
## 图像分类ImageNet
图像分类ImageNet数据集包含对应多个标签的图像文件夹、标签文件及图像列表文件。
参考数据文件结构如下:
```
./dataset/ # 数据集根目录
|--labelA # 标签为labelA的图像目录
| |--a1.jpg
| |--...
| └--...
|
|--...
|
|--labelZ # 标签为labelZ的图像目录
| |--z1.jpg
| |--...
| └--...
|
|--train_list.txt # 训练文件列表文件
|
|--val_list.txt # 验证文件列表文件
|
└--labels.txt # 标签列表文件
```
其中,相应的文件名可根据需要自行定义。
`train_list.txt`
和
`val_list.txt`
文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为图像文件对应的标签id(从0开始)。如下所示:
```
labelA/a1.jpg 0
labelZ/z1.jpg 25
...
```
`labels.txt`
: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
```
labelA
labelB
...
```
[
点击这里
](
https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz
)
,下载蔬菜分类分类数据集
在PaddleX中,使用
`paddlex.cv.datasets.ImageNet`
(
[
API说明
](
./apis/datasets.html#imagenet
)
)加载分类数据集
## 目标检测VOC
目标检测VOC数据集包含图像文件夹、标注信息文件夹、标签文件及图像列表文件。
参考数据文件结构如下:
```
./dataset/ # 数据集根目录
|--JPEGImages # 图像目录
| |--xxx1.jpg
| |--...
| └--...
|
|--Annotations # 标注信息目录
| |--xxx1.xml
| |--...
| └--...
|
|--train_list.txt # 训练文件列表文件
|
|--val_list.txt # 验证文件列表文件
|
└--labels.txt # 标签列表文件
```
其中,相应的文件名可根据需要自行定义。
`train_list.txt`
和
`val_list.txt`
文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为标注文件相对于dataset的相对路径。如下所示:
```
JPEGImages/xxx1.jpg Annotations/xxx1.xml
JPEGImages/xxx2.jpg Annotations/xxx2.xml
...
```
`labels.txt`
: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
```
labelA
labelB
...
```
[
点击这里
](
https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz
)
,下载昆虫检测数据集
在PaddleX中,使用
`paddlex.cv.datasets.VOCDetection`
(
[
API说明
](
./apis/datasets.html#vocdetection
)
)加载目标检测VOC数据集
## 目标检测和实例分割COCO
目标检测和实例分割COCO数据集包含图像文件夹及图像标注信息文件。
参考数据文件结构如下:
```
./dataset/ # 数据集根目录
|--JPEGImages # 图像目录
| |--xxx1.jpg
| |--...
| └--...
|
|--train.json # 训练相关信息文件
|
└--val.json # 验证相关信息文件
```
其中,相应的文件名可根据需要自行定义。
`train.json`
和
`val.json`
存储与标注信息、图像文件相关的信息。如下所示:
```
{
"annotations": [
{
"iscrowd": 0,
"category_id": 1,
"id": 1,
"area": 33672.0,
"image_id": 1,
"bbox": [232, 32, 138, 244],
"segmentation": [[32, 168, 365, 117, ...]]
},
...
],
"images": [
{
"file_name": "xxx1.jpg",
"height": 512,
"id": 267,
"width": 612
},
...
]
"categories": [
{
"name": "labelA",
"id": 1,
"supercategory": "component"
}
]
}
```
每个字段的含义如下所示:
| 域名 | 字段名 | 含义 | 数据类型 | 备注 |
|:-----|:--------|:------------|------|:-----|
| annotations | id | 标注信息id | int | 从1开始 |
| annotations | iscrowd | 标注框是否为一组对象 | int | 只有0、1两种取值 |
| annotations | category_id | 标注框类别id | int | |
| annotations | area | 标注框的面积 | float | |
| annotations | image_id | 当前标注信息所在图像的id | int | |
| annotations | bbox | 标注框坐标 | list | 长度为4,分别代表x,y,w,h |
| annotations | segmentation | 标注区域坐标 | list | list中有至少1个list,每个list由每个小区域坐标点的横纵坐标(x,y)组成 |
| images | id | 图像id | int | 从1开始 |
| images | file_name | 图像文件名 | str | |
| images | height | 图像高度 | int | |
| images | width | 图像宽度 | int | |
| categories | id | 类别id | int | 从1开始 |
| categories | name | 类别标签名 | str | |
| categories | supercategory | 类别父类的标签名 | str | |
[
点击这里
](
https://bj.bcebos.com/paddlex/datasets/garbage_ins_det.tar.gz
)
,下载垃圾实例分割数据集
在PaddleX中,使用
`paddlex.cv.datasets.COCODetection`
(
[
API说明
](
./apis/datasets.html#cocodetection
)
)加载COCO格式数据集
## 语义分割数据
语义分割数据集包含原图、标注图及相应的文件列表文件。
参考数据文件结构如下:
```
./dataset/ # 数据集根目录
|--images # 原图目录
| |--xxx1.png
| |--...
| └--...
|
|--annotations # 标注图目录
| |--xxx1.png
| |--...
| └--...
|
|--train_list.txt # 训练文件列表文件
|
|--val_list.txt # 验证文件列表文件
|
└--labels.txt # 标签列表
```
其中,相应的文件名可根据需要自行定义。
`train_list.txt`
和
`val_list.txt`
文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为标注图像文件相对于dataset的相对路径。如下所示:
```
images/xxx1.png annotations/xxx1.png
images/xxx2.png annotations/xxx2.png
...
```
`labels.txt`
: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
```
labelA
labelB
...
```
标注图像为单通道图像,像素值即为对应的类别,像素标注类别需要从0开始递增,
例如0,1,2,3表示有4种类别,标注类别最多为256类。其中可以指定特定的像素值用于表示该值的像素不参与训练和评估(默认为255)。
[
点击这里
](
https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz
)
,下载视盘语义分割数据集
在PaddleX中,使用
`paddlex.cv.datasets.SegReader`
(
[
API说明
](
./apis/datasets.html#segreader
)
)加载语义分割数据集
docs/quick_start.md
100755 → 100644
浏览文件 @
21c8666a
...
...
@@ -17,16 +17,16 @@ tar xzvf vegetables_cls.tar.gz
## 3. 训练代码开发
PaddleX的所有模型训练和预测均只涉及到5个API接口,分别是
> - [transforms](apis/transforms/index) 图像数据处理
> - [datasets](apis/datasets.md) 数据集加载
> - [models](apis/models.md) 模型类型定义
> - [train](apis/models
.md
) 开始训练
> - [predict](apis/models
.md
) 模型预测
> - [transforms](apis/transforms/index
.html
) 图像数据处理
> - [datasets](apis/datasets
/classification
.md) 数据集加载
> - [models](apis/models
/classification
.md) 模型类型定义
> - [train](apis/models
/classification.html#train
) 开始训练
> - [predict](apis/models
/classification.html#predict
) 模型预测
在本示例,通过如下
`train.py`
代码进行训练, 训练环境为1张Tesla P40 GPU卡。
### 3.1 定义`transforms`数据处理流程
由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在
`train_transforms`
中加入了
[
RandomCrop
](
apis/transforms/cls_transforms.html#RandomCrop
)
和
[
RandomHorizontalFlip
](
apis/transforms/cls_transforms.html#RandomHorizontalFlip
)
两种数据增强方式
由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在
`train_transforms`
中加入了
[
RandomCrop
](
apis/transforms/cls_transforms.html#RandomCrop
)
和
[
RandomHorizontalFlip
](
apis/transforms/cls_transforms.html#RandomHorizontalFlip
)
两种数据增强方式
, 更多方法可以参考
[
数据增强文档
](
apis/transforms/augment.md
)
。
```
from paddlex.cls import transforms
train_transforms = transforms.Compose([
...
...
@@ -41,7 +41,8 @@ eval_transforms = transforms.Compose([
])
```
> 定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集
### 3.2 定义`dataset`加载数据集
定义数据集,
`pdx.datasets.ImageNet`
表示读取ImageNet格式的分类数据集, 更多数据集细节可以查阅
[
数据集格式说明
](
datasets.md
)
和
[
ImageNet接口文档
](
apis/datasets/classification.md
)
```
train_dataset = pdx.datasets.ImageNet(
data_dir='vegetables_cls',
...
...
@@ -55,11 +56,17 @@ eval_dataset = pdx.datasets.ImageNet(
label_list='vegetables_cls/labels.txt',
transforms=eval_transforms)
```
> 模型训练
### 3.3 定义分类模型
本文档中使用百度基于蒸馏方法得到的MobileNetV3预训练模型,模型结构与MobileNetV3一致,但精度更高。PaddleX内置了20多种分类模型,查阅
[
PaddleX模型库
](
appendix/model_zoo.md
)
了解更多分类模型。
```
num_classes = len(train_dataset.labels)
model
=
pdx
.
cls
.
MobileNetV2
(
num_classes
=
num_classes
)
model.pdx.cls.MobileNetV3_small_ssld(num_classes=num_classes)
```
### 3.4 定义训练参数
定义好模型后,即可直接调用
`train`
接口,定义训练时的参数,分类模型内置了
`piecewise_decay`
学习率衰减策略,相关参数见
[
分类train接口文档
](
apis/models/classification.html#train
)
。
```
model.train(num_epochs=10,
train_dataset=train_dataset,
train_batch_size=32,
...
...
@@ -70,19 +77,21 @@ model.train(num_epochs=10,
use_vdl=True)
```
##
3. 模型
训练
>
`train.py`与解压后的数据集目录`vegetables_cls`放在同一目录下,在此目录下运行`train.py`即可开始训练。如果您的电脑上有GPU,这将会在10分钟内训练完成,如果为CPU也大概会在30分钟内训练完毕。
##
4. 模型开始
训练
`train.py`
与解压后的数据集目录
`vegetables_cls`
放在同一目录下,在此目录下运行
`train.py`
即可开始训练。如果您的电脑上有GPU,这将会在10分钟内训练完成,如果为CPU也大概会在30分钟内训练完毕。
```
python train.py
```
## 4. 训练过程中查看训练指标
> 模型在训练过程中,所有的迭代信息将以标注输出流的形式,输出到命令执行的终端上,用户也可通过visualdl以可视化的方式查看训练指标的变化,通过如下方式启动visualdl后,在浏览器打开https://0.0.0.0:8001即可。
## 5. 训练过程中查看训练指标
模型在训练过程中,所有的迭代信息将以标注输出流的形式,输出到命令执行的终端上,用户也可通过visualdl以可视化的方式查看训练指标的变化,通过如下方式启动visualdl后,在浏览器打开https://0.0.0.0:8001 (或 https://localhost:8001)即可。
```
visualdl --logdir output/mobilenetv2/vdl_log --port 8000
```

## 5. 训练完成使用模型进行测试
> 如使用训练过程中第8轮保存的模型进行测试
## 6. 训练完成使用模型进行测试
如下代码使用训练过程中第8轮保存的模型进行测试。
```
import
paddlex
as
pdx
model
=
pdx
.
load_model
(
'output/mobilenetv2/epoch_8'
)
...
...
docs/tutorials/deploy/deploy.md
浏览文件 @
21c8666a
...
...
@@ -39,6 +39,39 @@ C++部署方案位于目录`deploy/cpp/`下,且独立于PaddleX其他模块。
-
Linux平台:
[
linux
](
deploy_cpp_linux.md
)
-
window平台:
[
windows
](
deploy_cpp_win_vs2019.md
)
### OpenVINO部署demo
OpenVINO部署demo位于目录
`deploy/openvino/`
下,且独立于PaddleX其他模块,该demo目前支持在 Linux 完成编译和部署运行。目前PaddleX到OpenVINO的部署流程如下:
graph LR
PaddleX --> ONNX --> OpenVINO IR --> OpenVINO Inference Engine
#### step1
PaddleX输出ONNX模型方法如下:
```
paddlex --export_onnx --model_dir=./xiaoduxiong_epoch_12 --save_dir=./onnx_model
```
|目前支持的模型|
|-----|
|ResNet18|
|ResNet34|
|ResNet50|
|ResNet101|
|ResNet50_vd|
|ResNet101_vd|
|ResNet50_vd_ssld|
|ResNet101_vd_ssld
|DarkNet53|
|MobileNetV1|
|MobileNetV2|
|DenseNet121|
|DenseNet161|
|DenseNet201|
得到ONNX模型后,OpenVINO的部署参考:
[
OpenVINO部署
](
deploy_openvino.md
)
### 预测性能对比
#### 测试环境
...
...
docs/tutorials/deploy/depoly_openvino.md
0 → 100644
浏览文件 @
21c8666a
# OpenVINO 分类demo编译
## 说明
本文档在
`Ubuntu`
使用
`GCC 4.8.5`
进行了验证,如果需要使用更多G++版本和平台的OpenVino编译,请参考:
[
OpenVINO
](
https://github.com/openvinotoolkit/openvino/blob/2020/build-instruction.md
)
。
## 验证环境
*
Ubuntu
* 16.04 (64-bit) with GCC*
4.8.5
*
CMake 3.12
*
Python 2.7 or higher
请确保系统已经安装好上述基本软件,
**下面所有示例以工作目录 `/root/projects/`演示**
。
`git clone https://github.com/PaddlePaddle/PaddleX.git`
**说明**
:其中
`C++`
预测代码在
`/root/projects/PaddleX/deploy/openvino`
目录,该目录不依赖任何
`PaddleX`
下其他目录。
### Step1: 软件依赖
-
openvino:
[
编译文档
](
https://github.com/openvinotoolkit/openvino/blob/2020/build-instruction.md#build-steps
)
-
gflags:
[
编译文档
](
https://gflags.github.io/gflags/#download
)
-
opencv:
[
编译文档
](
https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html
)
说明:/root/projects/PaddleX/deploy/openvino/scripts/bootstrap.sh提供了预编译版本下载,也可自行编译。
-
ngraph:
说明:openvino编译的过程中会生成ngraph的lib文件,位于{openvino根目录}/bin/intel64/Release/lib/下。
### Step2: 编译demo
编译
`cmake`
的命令在
`scripts/build.sh`
中,请根据Step1中编译软件的实际情况修改主要参数,其主要内容说明如下:
```
# openvino预编译库的路径
OPENVINO_DIR=/path/to/inference_engine/
# gflags预编译库的路径
GFLAGS_DIR=/path/to/gflags
# ngraph lib的路径,编译openvino时通常会生成
NGRAPH_LIB=/path/to/ngraph/lib/
# opencv预编译库的路径, 如果使用自带预编译版本可不修改
OPENCV_DIR=$(pwd)/deps/opencv3gcc4.8/
# 下载自带预编译版本
sh $(pwd)/scripts/bootstrap.sh
rm -rf build
mkdir -p build
cd build
cmake .. \
-DOPENCV_DIR=${OPENCV_DIR} \
-DGFLAGS_DIR=${GFLAGS_DIR} \
-DOPENVINO_DIR=${OPENVINO_DIR} \
-DNGRAPH_LIB=${NGRAPH_LIB}
make
```
修改脚本设置好主要参数后,执行
`build`
脚本:
```
shell
sh ./scripts/build.sh
```
### Step3: 模型转换
将
[](
)生成的onnx文件转换为OpencVINO支持的格式,请参考:[Model
Optimizer文档](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html)
### Step4: 预测
编译成功后,预测demo的可执行程序分别为
`build/classifer`
,其主要命令参数说明如下:
| 参数 | 说明 |
| ---- | ---- |
| --model_dir | Model Optimizer生成的.xml文件路径,请保证Model Optimizer生成的三个文件在同一路径下|
| --image | 要预测的图片文件路径 |
| --image_list | 按行存储图片路径的.txt文件 |
| --device | 运行的平台, 默认值为"CPU" |
## 样例
可使用
[
小度熊识别模型
](
deploy.md#导出inference模型
)
中导出的
`inference_model`
和测试图片进行预测。
`样例一`
:
测试图片
`/path/to/xiaoduxiong.jpeg`
```
shell
./build/classifier
--model_dir
=
/path/to/inference_model
--image
=
/path/to/xiaoduxiong.jpeg
```
`样例二`
:
预测多个图片
`/path/to/image_list.txt`
,image_list.txt内容的格式如下:
```
/path/to/images/xiaoduxiong1.jpeg
/path/to/images/xiaoduxiong2.jpeg
...
/path/to/images/xiaoduxiongn.jpeg
```
```
shell
./build/classifier
--model_dir
=
/path/to/models/inference_model
--image_list
=
/root/projects/images_list.txt -
```
docs/tutorials/deploy/encryption.md
0 → 100644
浏览文件 @
21c8666a
# Paddle模型加密方案
飞桨团队推出模型加密方案,使用业内主流的AES加密技术对最终模型进行加密。飞桨用户可以通过PaddleX导出模型后,使用该方案对模型进行加密,预测时使用解密SDK进行模型解密并完成推理,大大提升AI应用安全性和开发效率。
## 1. 方案介绍
### 1.1 工具组成
[
链接
](
http://wiki.baidu.com/pages/viewpage.action?pageId=1128566963
)
下载并解压后,目录包含内容为:
```
paddle_model_encrypt
├── include # 头文件:paddle_model_decrypt.h(解密)和paddle_model_encrypt.h(加密)
|
├── lib # libpmodel-encrypt.so和libpmodel-decrypt.so动态库
|
└── tool # paddle_encrypt_tool
```
### 1.2 二进制工具
#### 1.2.1 生成密钥
产生随机密钥信息(用于AES加解密使用)(32字节key + 16字节iv, 注意这里产生的key是经过base64编码后的,这样可以扩充选取key的范围)
```
paddle_encrypt_tool -g
```
#### 1.2.1 文件加密
```
paddle_encrypt_tool -e -key keydata -infile infile -outfile outfile
```
#### 1.3 SDK
```
// 加密API
int paddle_encrypt_model(const char* keydata, const char* infile, const char* outfile);
// 加载加密模型API:
int paddle_security_load_model(
paddle::AnalysisConfig *config,
const char *key,
const char *model_file,
const char *param_file);
```
## 2. PaddleX C++加密部署
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录