提交 50216bdb 编写于 作者: F FlyingQianMM

fix conflicts

---
name: 1. 数据类问题
about: 数据标注、格式转换等问题
---
说明数据类型(图像分类、目标检测、实例分割或语义分割)
---
name: 2. 模型训练
about: 模型训练中的问题
---
如模型训练出错,建议贴上模型训练代码,以便开发人员分析,并快速响应
---
name: 3. 模型部署
about: 模型部署相关问题,包括C++、Python、Paddle Lite等
---
说明您的部署环境,部署需求,模型类型和应用场景等,便于开发人员快速响应。
---
name: 4. PaddleX GUI使用问题
about: Paddle GUI客户端使用问题
---
PaddleX GUI: https://www.paddlepaddle.org.cn/paddle/paddleX
---
name: 5. 其它类型问题
about: 所有问题都可以在这里提
---
...@@ -50,7 +50,9 @@ endmacro() ...@@ -50,7 +50,9 @@ endmacro()
if (WITH_ENCRYPTION) if (WITH_ENCRYPTION)
add_definitions( -DWITH_ENCRYPTION=${WITH_ENCRYPTION}) if (NOT (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64"))
add_definitions( -DWITH_ENCRYPTION=${WITH_ENCRYPTION})
endif()
endif() endif()
if (WITH_MKL) if (WITH_MKL)
...@@ -268,9 +270,11 @@ endif() ...@@ -268,9 +270,11 @@ endif()
if(WITH_ENCRYPTION) if(WITH_ENCRYPTION)
if(NOT WIN32) if(NOT WIN32)
if (NOT (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64"))
include_directories("${ENCRYPTION_DIR}/include") include_directories("${ENCRYPTION_DIR}/include")
link_directories("${ENCRYPTION_DIR}/lib") link_directories("${ENCRYPTION_DIR}/lib")
set(DEPS ${DEPS} ${ENCRYPTION_DIR}/lib/libpmodel-decrypt${CMAKE_SHARED_LIBRARY_SUFFIX}) set(DEPS ${DEPS} ${ENCRYPTION_DIR}/lib/libpmodel-decrypt${CMAKE_SHARED_LIBRARY_SUFFIX})
endif()
else() else()
include_directories("${ENCRYPTION_DIR}/include") include_directories("${ENCRYPTION_DIR}/include")
link_directories("${ENCRYPTION_DIR}/lib") link_directories("${ENCRYPTION_DIR}/lib")
...@@ -335,7 +339,6 @@ if (WIN32 AND WITH_MKL) ...@@ -335,7 +339,6 @@ if (WIN32 AND WITH_MKL)
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./paddlex_inference/Release/mkldnn.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./paddlex_inference/Release/mkldnn.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll
) )
add_custom_command(TARGET video_classifier POST_BUILD add_custom_command(TARGET video_classifier POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./paddlex_inference/Release/mklml.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./paddlex_inference/Release/mklml.dll
...@@ -357,7 +360,6 @@ if (WIN32 AND WITH_MKL) ...@@ -357,7 +360,6 @@ if (WIN32 AND WITH_MKL)
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./paddlex_inference/Release/mkldnn.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./paddlex_inference/Release/mkldnn.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll
) )
# for encryption # for encryption
if (EXISTS "${ENCRYPTION_DIR}/lib/pmodel-decrypt.dll") if (EXISTS "${ENCRYPTION_DIR}/lib/pmodel-decrypt.dll")
......
...@@ -175,7 +175,7 @@ class Model { ...@@ -175,7 +175,7 @@ class Model {
* @return true if predict successfully * @return true if predict successfully
* */ * */
bool predict(const std::vector<cv::Mat> &im_batch, bool predict(const std::vector<cv::Mat> &im_batch,
std::vector<DetResult> *result, std::vector<DetResult> *results,
int thread_num = 1); int thread_num = 1);
/* /*
...@@ -201,7 +201,7 @@ class Model { ...@@ -201,7 +201,7 @@ class Model {
* @return true if predict successfully * @return true if predict successfully
* */ * */
bool predict(const std::vector<cv::Mat> &im_batch, bool predict(const std::vector<cv::Mat> &im_batch,
std::vector<SegResult> *result, std::vector<SegResult> *results,
int thread_num = 1); int thread_num = 1);
// model type, include 3 type: classifier, detector, segmenter // model type, include 3 type: classifier, detector, segmenter
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#else // Linux/Unix #else // Linux/Unix
#include <dirent.h> #include <dirent.h>
// #include <sys/io.h> // #include <sys/io.h>
#ifdef __arm__ // for arm #if defined(__arm__) || defined(__aarch64__) // for arm
#include <aarch64-linux-gpu/sys/stat.h> #include <aarch64-linux-gpu/sys/stat.h>
#include <aarch64-linux-gpu/sys/types.h> #include <aarch64-linux-gpu/sys/types.h>
#else #else
......
# download pre-compiled opencv lib
OPENCV_URL=https://bj.bcebos.com/paddlex/deploy/tools/opencv3_aarch.tgz
if [ ! -d "./deps/opencv3" ]; then
mkdir -p deps
cd deps
wget -c ${OPENCV_URL}
tar xvfz opencv3_aarch.tgz
rm -rf opencv3_aarch.tgz
cd ..
fi
...@@ -14,14 +14,7 @@ WITH_STATIC_LIB=OFF ...@@ -14,14 +14,7 @@ WITH_STATIC_LIB=OFF
# CUDA 的 lib 路径 # CUDA 的 lib 路径
CUDA_LIB=/usr/local/cuda/lib64 CUDA_LIB=/usr/local/cuda/lib64
# CUDNN 的 lib 路径 # CUDNN 的 lib 路径
CUDNN_LIB=/usr/local/cuda/lib64 CUDNN_LIB=/usr/lib/aarch64-linux-gnu
# 是否加载加密后的模型
WITH_ENCRYPTION=OFF
# OPENCV 路径, 如果使用自带预编译版本可不修改
sh $(pwd)/scripts/jetson_bootstrap.sh # 下载预编译版本的opencv
OPENCV_DIR=$(pwd)/deps/opencv3
# 以下无需改动 # 以下无需改动
rm -rf build rm -rf build
...@@ -31,12 +24,9 @@ cmake .. \ ...@@ -31,12 +24,9 @@ cmake .. \
-DWITH_GPU=${WITH_GPU} \ -DWITH_GPU=${WITH_GPU} \
-DWITH_MKL=${WITH_MKL} \ -DWITH_MKL=${WITH_MKL} \
-DWITH_TENSORRT=${WITH_TENSORRT} \ -DWITH_TENSORRT=${WITH_TENSORRT} \
-DWITH_ENCRYPTION=${WITH_ENCRYPTION} \
-DTENSORRT_DIR=${TENSORRT_DIR} \ -DTENSORRT_DIR=${TENSORRT_DIR} \
-DPADDLE_DIR=${PADDLE_DIR} \ -DPADDLE_DIR=${PADDLE_DIR} \
-DWITH_STATIC_LIB=${WITH_STATIC_LIB} \ -DWITH_STATIC_LIB=${WITH_STATIC_LIB} \
-DCUDA_LIB=${CUDA_LIB} \ -DCUDA_LIB=${CUDA_LIB} \
-DCUDNN_LIB=${CUDNN_LIB} \ -DCUDNN_LIB=${CUDNN_LIB}
-DENCRYPTION_DIR=${ENCRYPTION_DIR} \
-DOPENCV_DIR=${OPENCV_DIR}
make make
...@@ -225,6 +225,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -225,6 +225,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
outputs_.resize(size); outputs_.resize(size);
output_tensor->copy_to_cpu(outputs_.data()); output_tensor->copy_to_cpu(outputs_.data());
// 对模型输出结果进行后处理 // 对模型输出结果进行后处理
(*results).clear();
(*results).resize(batch_size);
int single_batch_size = size / batch_size; int single_batch_size = size / batch_size;
for (int i = 0; i < batch_size; ++i) { for (int i = 0; i < batch_size; ++i) {
auto start_ptr = std::begin(outputs_); auto start_ptr = std::begin(outputs_);
...@@ -343,7 +345,7 @@ bool Model::predict(const cv::Mat& im, DetResult* result) { ...@@ -343,7 +345,7 @@ bool Model::predict(const cv::Mat& im, DetResult* result) {
} }
bool Model::predict(const std::vector<cv::Mat>& im_batch, bool Model::predict(const std::vector<cv::Mat>& im_batch,
std::vector<DetResult>* result, std::vector<DetResult>* results,
int thread_num) { int thread_num) {
for (auto& inputs : inputs_batch_) { for (auto& inputs : inputs_batch_) {
inputs.clear(); inputs.clear();
...@@ -467,6 +469,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -467,6 +469,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
auto lod_vector = output_box_tensor->lod(); auto lod_vector = output_box_tensor->lod();
int num_boxes = size / 6; int num_boxes = size / 6;
// 解析预测框box // 解析预测框box
(*results).clear();
(*results).resize(batch_size);
for (int i = 0; i < lod_vector[0].size() - 1; ++i) { for (int i = 0; i < lod_vector[0].size() - 1; ++i) {
for (int j = lod_vector[0][i]; j < lod_vector[0][i + 1]; ++j) { for (int j = lod_vector[0][i]; j < lod_vector[0][i + 1]; ++j) {
Box box; Box box;
...@@ -480,7 +484,7 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -480,7 +484,7 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
float w = xmax - xmin + 1; float w = xmax - xmin + 1;
float h = ymax - ymin + 1; float h = ymax - ymin + 1;
box.coordinate = {xmin, ymin, w, h}; box.coordinate = {xmin, ymin, w, h};
(*result)[i].boxes.push_back(std::move(box)); (*results)[i].boxes.push_back(std::move(box));
} }
} }
...@@ -499,9 +503,9 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -499,9 +503,9 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
output_mask_tensor->copy_to_cpu(output_mask.data()); output_mask_tensor->copy_to_cpu(output_mask.data());
int mask_idx = 0; int mask_idx = 0;
for (int i = 0; i < lod_vector[0].size() - 1; ++i) { for (int i = 0; i < lod_vector[0].size() - 1; ++i) {
(*result)[i].mask_resolution = output_mask_shape[2]; (*results)[i].mask_resolution = output_mask_shape[2];
for (int j = 0; j < (*result)[i].boxes.size(); ++j) { for (int j = 0; j < (*results)[i].boxes.size(); ++j) {
Box* box = &(*result)[i].boxes[j]; Box* box = &(*results)[i].boxes[j];
int category_id = box->category_id; int category_id = box->category_id;
auto begin_mask = output_mask.begin() + auto begin_mask = output_mask.begin() +
(mask_idx * classes + category_id) * mask_pixels; (mask_idx * classes + category_id) * mask_pixels;
...@@ -624,7 +628,7 @@ bool Model::predict(const cv::Mat& im, SegResult* result) { ...@@ -624,7 +628,7 @@ bool Model::predict(const cv::Mat& im, SegResult* result) {
} }
bool Model::predict(const std::vector<cv::Mat>& im_batch, bool Model::predict(const std::vector<cv::Mat>& im_batch,
std::vector<SegResult>* result, std::vector<SegResult>* results,
int thread_num) { int thread_num) {
for (auto& inputs : inputs_batch_) { for (auto& inputs : inputs_batch_) {
inputs.clear(); inputs.clear();
...@@ -647,8 +651,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -647,8 +651,8 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
} }
int batch_size = im_batch.size(); int batch_size = im_batch.size();
(*result).clear(); (*results).clear();
(*result).resize(batch_size); (*results).resize(batch_size);
int h = inputs_batch_[0].new_im_size_[0]; int h = inputs_batch_[0].new_im_size_[0];
int w = inputs_batch_[0].new_im_size_[1]; int w = inputs_batch_[0].new_im_size_[1];
auto im_tensor = predictor_->GetInputTensor("image"); auto im_tensor = predictor_->GetInputTensor("image");
...@@ -680,14 +684,14 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -680,14 +684,14 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
int single_batch_size = size / batch_size; int single_batch_size = size / batch_size;
for (int i = 0; i < batch_size; ++i) { for (int i = 0; i < batch_size; ++i) {
(*result)[i].label_map.data.resize(single_batch_size); (*results)[i].label_map.data.resize(single_batch_size);
(*result)[i].label_map.shape.push_back(1); (*results)[i].label_map.shape.push_back(1);
for (int j = 1; j < output_label_shape.size(); ++j) { for (int j = 1; j < output_label_shape.size(); ++j) {
(*result)[i].label_map.shape.push_back(output_label_shape[j]); (*results)[i].label_map.shape.push_back(output_label_shape[j]);
} }
std::copy(output_labels_iter + i * single_batch_size, std::copy(output_labels_iter + i * single_batch_size,
output_labels_iter + (i + 1) * single_batch_size, output_labels_iter + (i + 1) * single_batch_size,
(*result)[i].label_map.data.data()); (*results)[i].label_map.data.data());
} }
// 获取预测置信度scoremap // 获取预测置信度scoremap
...@@ -704,29 +708,29 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -704,29 +708,29 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
int single_batch_score_size = size / batch_size; int single_batch_score_size = size / batch_size;
for (int i = 0; i < batch_size; ++i) { for (int i = 0; i < batch_size; ++i) {
(*result)[i].score_map.data.resize(single_batch_score_size); (*results)[i].score_map.data.resize(single_batch_score_size);
(*result)[i].score_map.shape.push_back(1); (*results)[i].score_map.shape.push_back(1);
for (int j = 1; j < output_score_shape.size(); ++j) { for (int j = 1; j < output_score_shape.size(); ++j) {
(*result)[i].score_map.shape.push_back(output_score_shape[j]); (*results)[i].score_map.shape.push_back(output_score_shape[j]);
} }
std::copy(output_scores_iter + i * single_batch_score_size, std::copy(output_scores_iter + i * single_batch_score_size,
output_scores_iter + (i + 1) * single_batch_score_size, output_scores_iter + (i + 1) * single_batch_score_size,
(*result)[i].score_map.data.data()); (*results)[i].score_map.data.data());
} }
// 解析输出结果到原图大小 // 解析输出结果到原图大小
for (int i = 0; i < batch_size; ++i) { for (int i = 0; i < batch_size; ++i) {
std::vector<uint8_t> label_map((*result)[i].label_map.data.begin(), std::vector<uint8_t> label_map((*results)[i].label_map.data.begin(),
(*result)[i].label_map.data.end()); (*results)[i].label_map.data.end());
cv::Mat mask_label((*result)[i].label_map.shape[1], cv::Mat mask_label((*results)[i].label_map.shape[1],
(*result)[i].label_map.shape[2], (*results)[i].label_map.shape[2],
CV_8UC1, CV_8UC1,
label_map.data()); label_map.data());
cv::Mat mask_score((*result)[i].score_map.shape[2], cv::Mat mask_score((*results)[i].score_map.shape[2],
(*result)[i].score_map.shape[3], (*results)[i].score_map.shape[3],
CV_32FC1, CV_32FC1,
(*result)[i].score_map.data.data()); (*results)[i].score_map.data.data());
int idx = 1; int idx = 1;
int len_postprocess = inputs_batch_[i].im_size_before_resize_.size(); int len_postprocess = inputs_batch_[i].im_size_before_resize_.size();
for (std::vector<std::string>::reverse_iterator iter = for (std::vector<std::string>::reverse_iterator iter =
...@@ -762,12 +766,12 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch, ...@@ -762,12 +766,12 @@ bool Model::predict(const std::vector<cv::Mat>& im_batch,
} }
++idx; ++idx;
} }
(*result)[i].label_map.data.assign(mask_label.begin<uint8_t>(), (*results)[i].label_map.data.assign(mask_label.begin<uint8_t>(),
mask_label.end<uint8_t>()); mask_label.end<uint8_t>());
(*result)[i].label_map.shape = {mask_label.rows, mask_label.cols}; (*results)[i].label_map.shape = {mask_label.rows, mask_label.cols};
(*result)[i].score_map.data.assign(mask_score.begin<float>(), (*results)[i].score_map.data.assign(mask_score.begin<float>(),
mask_score.end<float>()); mask_score.end<float>());
(*result)[i].score_map.shape = {mask_score.rows, mask_score.cols}; (*results)[i].score_map.shape = {mask_score.rows, mask_score.cols};
} }
return true; return true;
} }
......
## <a name="2">PaddleX GUI安装</a> ## PaddleX GUI安装
PaddleX GUI是提升项目开发效率的核心模块,开发者可快速完成深度学习模型全流程开发。我们诚挚地邀请您前往 [官网](https://www.paddlepaddle.org.cn/paddle/paddleX)下载试用PaddleX GUI可视化前端,并获得您宝贵的意见或开源项目贡献。 PaddleX GUI是提升项目开发效率的核心模块,开发者可快速完成深度学习模型全流程开发。我们诚挚地邀请您前往 [官网](https://www.paddlepaddle.org.cn/paddle/paddleX)下载试用PaddleX GUI可视化前端,并获得您宝贵的意见或开源项目贡献。
#### <a name="1">安装推荐环境</a> ### 安装推荐环境
* **操作系统** * **操作系统**
* Windows7/8/10(推荐Windows 10); * Windows7/8/10(推荐Windows 10);
......
...@@ -3,40 +3,48 @@ PaddleX GUI ...@@ -3,40 +3,48 @@ PaddleX GUI
PaddleX GUI是基于PaddleX实现的可视化开发客户端。开发者以点选、键入的方式快速体验深度学习模型开发的全流程。不仅可以作为您提升深度学习模型开发效率的工具,更可以作为您们应用PaddleX API搭建专属的行业软件/应用的示例参照。 PaddleX GUI是基于PaddleX实现的可视化开发客户端。开发者以点选、键入的方式快速体验深度学习模型开发的全流程。不仅可以作为您提升深度学习模型开发效率的工具,更可以作为您们应用PaddleX API搭建专属的行业软件/应用的示例参照。
PaddleX GUI 当前提供Windows,Mac,Ubuntu三种版本一键绿色安装的方式。请至[飞桨官网](https://www.paddlepaddle.org.cn/)下载您需要的版本。 PaddleX GUI 当前提供Windows,Mac,Ubuntu三种版本一键绿色安装的方式。请至飞桨官网:https://www.paddlepaddle.org.cn/paddle/paddleX 下载您需要的版本。
功能简介 功能简介
--------------------------------------- ---------------------------------------
PaddleX GUI是PaddleX API的衍生品,它在集成API功能的基础上,额外提供了可视化分析、评估等附加功能,致力于为开发者带来极致顺畅的开发体验。其拥有以下独特的功能: PaddleX GUI是PaddleX API的衍生品,它在集成API功能的基础上,额外提供了可视化分析、评估等附加功能,致力于为开发者带来极致顺畅的开发体验。其拥有以下独特的功能:
- **全流程打通** 全流程打通
PaddleX GUI覆盖深度学习模型开发必经的**数据处理**、**超参配置**、**模型训练及优化**、**模型发布**全流程,无需开发一行代码,即可得到高性深度学习推理模型。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PaddleX GUI覆盖深度学习模型开发必经的 **数据处理** 、 **超参配置** 、 **模型训练及优化** 、 **模型发布** 全流程,无需开发一行代码,即可得到高性深度学习推理模型。
- **数据集智能分析** 数据集智能分析
详细的数据结构说明,并提供**数据标签自动校验**。支持**可视化数据预览**、**数据分布图表展示**、**一键数据集切分**等实用功能 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
详细的数据结构说明,并提供 **数据标签自动校验** 。支持 **可视化数据预览** 、 **数据分布图表展示** 、 **一键数据集切分** 等实用功能
- **自动超参推荐** 自动超参推荐
集成飞桨团队长时间产业实践经验,根据用户选择的模型类别、骨架网络等,提供多种针对性优化的**预训练模型**,并**提供推荐超参配置**,可**一键开启多种优化策略** >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
集成飞桨团队长时间产业实践经验,根据用户选择的模型类别、骨架网络等,提供多种针对性优化的 **预训练模型** ,并 **提供推荐超参配置** ,可 **一键开启多种优化策略**
- **可视化模型评估** 可视化模型评估
集成**可视化分析工具:VisualDL**, 以线性图表的形式展示acc、lr等关键参数在训练过程中的变化趋势。提供**混淆矩阵**等实用方法,帮助快速定位问题,加速调参。模型评估报告一键导出,方便项目复盘分析。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
集成 **可视化分析工具:VisualDL** , 以线性图表的形式展示acc、lr等关键参数在训练过程中的变化趋势。提供 **混淆矩阵** 等实用方法,帮助快速定位问题,加速调参。模型评估报告一键导出,方便项目复盘分析。
- **模型裁剪及量化** 模型裁剪及量化
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
一键启动模型裁剪、量化,在不同阶段为开发者提供模型优化的策略,满足不同环境对模型性能的需求。 一键启动模型裁剪、量化,在不同阶段为开发者提供模型优化的策略,满足不同环境对模型性能的需求。
- **预训练模型管理** 预训练模型管理
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
可对历史训练模型进行保存及管理,未进行裁剪的模型可以保存为预训练模型,在后续任务中使用。 可对历史训练模型进行保存及管理,未进行裁剪的模型可以保存为预训练模型,在后续任务中使用。
- **可视化模型测试** 可视化模型测试
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
客户端直接展示模型预测效果,无需上线即可进行效果评估 客户端直接展示模型预测效果,无需上线即可进行效果评估
- **模型多端部署** 模型多端部署
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
点选式选择模型发布平台、格式,一键导出预测模型,并匹配完善的模型预测部署说明文档,贴心助力产业端到端项目落地 点选式选择模型发布平台、格式,一键导出预测模型,并匹配完善的模型预测部署说明文档,贴心助力产业端到端项目落地
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:caption: 文档目录: :caption: 文档目录
download.md download.md
how_to_use.md how_to_use.md
......
...@@ -12,7 +12,7 @@ PaddleX目前提供了DeepLabv3p、UNet、HRNet和FastSCNN四种语义分割结 ...@@ -12,7 +12,7 @@ PaddleX目前提供了DeepLabv3p、UNet、HRNet和FastSCNN四种语义分割结
| :---------------- | :------- | :------- | :--------- | :--------- | :----- | | :---------------- | :------- | :------- | :--------- | :--------- | :----- |
| [DeepLabv3p-MobileNetV2-x0.25](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py) | - | 2.9MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | | [DeepLabv3p-MobileNetV2-x0.25](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py) | - | 2.9MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 |
| [DeepLabv3p-MobileNetV2-x1.0](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py) | 69.8% | 11MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | | [DeepLabv3p-MobileNetV2-x1.0](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py) | 69.8% | 11MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 |
| [DeepLabv3p-Xception65](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_xception65.pyy) | 79.3% | 158MB | - | - | 模型大,精度高,适用于服务端 | | [DeepLabv3p-Xception65](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/deeplabv3p_xception65.py) | 79.3% | 158MB | - | - | 模型大,精度高,适用于服务端 |
| [UNet](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/unet.py) | - | 52MB | - | - | 模型较大,精度高,适用于服务端 | | [UNet](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/unet.py) | - | 52MB | - | - | 模型较大,精度高,适用于服务端 |
| [HRNet](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/hrnet.py) | 79.4% | 37MB | - | - | 模型较小,模型精度高,适用于服务端部署 | | [HRNet](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/hrnet.py) | 79.4% | 37MB | - | - | 模型较小,模型精度高,适用于服务端部署 |
| [FastSCNN](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/fast_scnn.py) | - | 4.5MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | | [FastSCNN](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/fast_scnn.py) | - | 4.5MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 |
......
# 图像分类训练示例
本目录下为图像分类示例代码,用户在安装完PaddlePaddle和PaddleX即可直接进行训练。
- [PaddlePaddle安装](https://www.paddlepaddle.org.cn/install/quick)
- [PaddleX安装](https://paddlex.readthedocs.io/zh_CN/develop/install.html)
## 模型训练
如下所示,直接下载代码后运行即可,代码会自动下载训练数据
```
python mobilenetv3_small_ssld.py
```
## VisualDL可视化训练指标
在模型训练过程,在`train`函数中,将`use_vdl`设为True,则训练过程会自动将训练日志以VisualDL的格式打点在`save_dir`(用户自己指定的路径)下的`vdl_log`目录,用户可以使用如下命令启动VisualDL服务,查看可视化指标
```
visualdl --logdir output/mobilenetv3_small_ssld/vdl_log --port 8001
```
服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册