提交 e5f779de 编写于 作者: H hanbuhe

merge conflicts

上级 8d3d2e58
...@@ -22,9 +22,6 @@ if (WITH_PADDLE_MOBILE) ...@@ -22,9 +22,6 @@ if (WITH_PADDLE_MOBILE)
return() return()
endif(WITH_PADDLE_MOBILE) endif(WITH_PADDLE_MOBILE)
# set(CMAKE_BUILD_TYPE DEBUG)
set(PADDLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(PADDLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(PADDLE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(PADDLE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
......
...@@ -90,7 +90,7 @@ ios-detection_demo/detection_demo/ViewController.mm ...@@ -90,7 +90,7 @@ ios-detection_demo/detection_demo/ViewController.mm
## 代码讲解 (如何使用Paddle-Lite C++ API 执行预测) ## 代码讲解 (如何使用Paddle-Lite C++ API 执行预测)
IOS 示例基于C++ API 开发,调用Paddle-Lite C++ API包括以下五步。更详细的API 描述参考: [Paddle-Lite C++ API](https://paddle-lite.readthedocs.io/zh/latest/api_reference/java_api_doc.html) IOS 示例基于C++ API 开发,调用Paddle-Lite C++ API包括以下五步。更详细的API 描述参考: [Paddle-Lite C++ API](https://paddle-lite.readthedocs.io/zh/latest/api_reference/cxx_api_doc.html)
```c++ ```c++
#include <iostream> #include <iostream>
......
# Linux(ARM) Demo
## 多种应用场景
我们提供Paddle-Lite示例工程[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo),其中包含[Android](https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-android-demo)[iOS](https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-ios-demo)[Armlinux](https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-armlinux-demo)平台的示例工程。Linux(ARM) demo涵盖[图像分类](https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-android-demo/image_classification_demo)[目标检测](https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-android-demo/object_detection_demo)2个应用场景。
### 1. 图像分类
Paddle-Lite提供的图像分类demo ,在移动端上提供了实时的物体识别能力,可以应用到生产线自动分拣或质检、识别医疗图像、辅助医生肉眼诊断等场景。在移动端预测的效果图如下:
<p align="center"><img width="250" height="250" src="https://paddlelite-data.bj.bcebos.com/doc_images/Android_iOS_demo/demo/tabby_cat.jpg"/>&#8194;&#8194;&#8194;&#8194;&#8194;<img width="250" height="250" src="https://paddlelite-data.bj.bcebos.com/doc_images/Android_iOS_demo/demo/tabby_cat2.jpg"/></p>
### 2. 物体检测
Paddle-Lite提供的物体检测demo ,在移动端上提供了检测多个物体的位置、名称、位置及数量的能力。可以应用到视频监控(是否有违规物体或行为)、工业质检(微小瑕疵的数量和位置)、医疗诊断(细胞计数、中药识别)等场景。在移动端预测的效果图如下:
<p align="center"><img width="250" height="250" src="https://paddlelite-data.bj.bcebos.com/doc_images/Android_iOS_demo/demo/dog.jpg"/>&#8194;&#8194;&#8194;&#8194;&#8194;<img width="250" height="250" src="https://paddlelite-data.bj.bcebos.com/doc_images/Android_iOS_demo/demo/dog2.jpg"/></p>
## Linux(ARM) demo部署方法
下面我们以**目标检测(object_detection_demo)**为例讲解如何部署iOS工程。
**目的**:将基于Paddle-Lite的预测库部署到Linux(ARM)设备,实现物体检测的目标。
**需要的环境**:Linux(ARM)设备、下载到本地的[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo)工程
**部署步骤**
1、 目标检测的Linux(ARM)示例位于 `Paddle-Lite-Demo\PaddleLite-armlinux-demo\object_detection_demo`
2、终端中执行 `download_models_and_libs.sh` 脚本自动下载模型和Paddle-Lite预测库
```shell
cd PaddleLite-armlinux-demo # 1. 终端中进入 Paddle-Lite-Demo\PaddleLite-armlinux-demo
sh download_models_and_libs.sh # 2. 执行脚本下载依赖项 (需要联网)
```
下载完成后会出现提示: `Download successful!`
3、终端中执行 `download_models_and_libs.sh` 脚本自动下载模型和Paddle-Lite预测库
```shell
cd object_detection_demo # 1. 终端中进入
sh run.sh # 2. 执行脚本编译并执行物体检测demo,输出预测数据和运行时间
```
demo结果如下:
<img width="836" alt="image" src="https://user-images.githubusercontent.com/50474132/82852558-da228580-9f35-11ea-837c-e4d71066da57.png">
## 使用C++接口预测
Linux(ARM) demo 示例基于C++ API 开发,调用Paddle-Lite C++ API包括以下五步。更详细的API 描述参考: [Paddle-Lite C++ API](https://paddle-lite.readthedocs.io/zh/latest/api_reference/cxx_api_doc.html)
```c++
#include <iostream>
// 引入C++ API
#include "paddle_lite/paddle_api.h"
#include "paddle_lite/paddle_use_ops.h"
#include "paddle_lite/paddle_use_kernels.h"
// 1. 设置MobileConfig
MobileConfig config;
config.set_model_from_file(<modelPath>); // 设置NaiveBuffer格式模型路径
config.set_power_mode(LITE_POWER_NO_BIND); // 设置CPU运行模式
config.set_threads(4); // 设置工作线程数
// 2. 创建PaddlePredictor
std::shared_ptr<PaddlePredictor> predictor = CreatePaddlePredictor<MobileConfig>(config);
// 3. 设置输入数据
std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
input_tensor->Resize({1, 3, 224, 224});
auto* data = input_tensor->mutable_data<float>();
for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) {
data[i] = 1;
}
// 4. 执行预测
predictor->run();
// 5. 获取输出数据
std::unique_ptr<const Tensor> output_tensor(std::move(predictor->GetOutput(0)));
std::cout << "Output shape " << output_tensor->shape()[1] << std::endl;
for (int i = 0; i < ShapeProduction(output_tensor->shape()); i += 100) {
std::cout << "Output[" << i << "]: " << output_tensor->data<float>()[i]
<< std::endl;
}
```
## 使用Python接口预测
1. Python预测库编译参考[编译Linux](../user_guides/Compile/Linux),建议在开发版上编译。
2. [Paddle-Lite Python API](https://paddle-lite.readthedocs.io/zh/latest/api_reference/python_api_doc.html)
3. 代码参考,[Python预测](python_demo)
文件模式从 100755 更改为 100644
...@@ -44,6 +44,7 @@ USE_MIR_PASS(type_layout_cast_pass); ...@@ -44,6 +44,7 @@ USE_MIR_PASS(type_layout_cast_pass);
USE_MIR_PASS(type_layout_cast_preprocess_pass); USE_MIR_PASS(type_layout_cast_preprocess_pass);
USE_MIR_PASS(memory_optimize_pass); USE_MIR_PASS(memory_optimize_pass);
USE_MIR_PASS(kernel_place_correct_pass) USE_MIR_PASS(kernel_place_correct_pass)
USE_MIR_PASS(multi_stream_analysis_pass); USE_MIR_PASS(multi_stream_analysis_pass);
USE_MIR_PASS(elementwise_mul_constant_eliminate_pass) USE_MIR_PASS(elementwise_mul_constant_eliminate_pass)
USE_MIR_PASS(npu_subgraph_pass); USE_MIR_PASS(npu_subgraph_pass);
......
...@@ -76,30 +76,55 @@ void pooling1x1s2p0_max(const float* din, ...@@ -76,30 +76,55 @@ void pooling1x1s2p0_max(const float* din,
int pad_bottom, int pad_bottom,
int pad_right); int pad_right);
void pooling2x2s2_max(const float* din, void pooling2x2s2p0_max(const float* din,
float* dout, float* dout,
int num, int num,
int chout, int chout,
int hout, int hout,
int wout, int wout,
int chin, int chin,
int hin, int hin,
int win, int win,
int pad_bottom, int pad_bottom,
int pad_right); int pad_right);
void pooling2x2s2_avg(const float* din, void pooling2x2s2p0_avg(const float* din,
float* dout, float* dout,
int num, int num,
int chout, int chout,
int hout, int hout,
int wout, int wout,
int chin, int chin,
int hin, int hin,
int win, int win,
bool exclusive, bool exclusive,
int pad_bottom, int pad_bottom,
int pad_right); int pad_right);
void pooling2x2s2p1_max(const float* din,
float* dout,
int num,
int chout,
int hout,
int wout,
int chin,
int hin,
int win,
int pad_bottom,
int pad_right);
void pooling2x2s2p1_avg(const float* din,
float* dout,
int num,
int chout,
int hout,
int wout,
int chin,
int hin,
int win,
bool exclusive,
int pad_bottom,
int pad_right);
void pooling3x3s1p1_max(const float* din, void pooling3x3s1p1_max(const float* din,
float* dout, float* dout,
......
...@@ -204,7 +204,8 @@ int get_device_info(const struct DeviceInfo &args) { ...@@ -204,7 +204,8 @@ int get_device_info(const struct DeviceInfo &args) {
int perform_bypass(const struct BypassArgs &args) { int perform_bypass(const struct BypassArgs &args) {
int ret = -1; int ret = -1;
int size = args.image.channels * args.image.width * args.image.height; int size = args.image.channels * args.image.width * args.image.height;
int max_size = 1 << 20;
int max_size = 1 << 21;
float times = 1.0 * size / max_size; float times = 1.0 * size / max_size;
int count = static_cast<int>(times); int count = static_cast<int>(times);
......
...@@ -241,13 +241,10 @@ void PriorBoxPE::compute_prior_box() { ...@@ -241,13 +241,10 @@ void PriorBoxPE::compute_prior_box() {
} }
boxes.flush(); boxes.flush();
// boxes.syncToCPU(); boxes.syncToCPU();
variances.flush(); variances.flush();
output_boxes->copyFrom(&boxes); output_boxes->copyFrom(&boxes);
output_variances->copyFrom(&variances); output_variances->copyFrom(&variances);
output_boxes->invalidate();
output_variances->invalidate();
} }
void PriorBoxPE::apply() {} void PriorBoxPE::apply() {}
...@@ -256,9 +253,8 @@ bool PriorBoxPE::dispatch() { ...@@ -256,9 +253,8 @@ bool PriorBoxPE::dispatch() {
if (cachedBoxes_ == nullptr) { if (cachedBoxes_ == nullptr) {
cachedBoxes_ = new Tensor(); cachedBoxes_ = new Tensor();
cachedVariances_ = new Tensor(); cachedVariances_ = new Tensor();
cachedBoxes_->mutableData<float16>(FP16, param_.outputBoxes->shape()); cachedBoxes_->mutableData<float>(FP32, param_.outputBoxes->shape());
cachedVariances_->mutableData<float16>(FP16, cachedVariances_->mutableData<float>(FP32, param_.outputVariances->shape());
param_.outputVariances->shape());
cachedBoxes_->setDataLocation(CPU); cachedBoxes_->setDataLocation(CPU);
cachedVariances_->setDataLocation(CPU); cachedVariances_->setDataLocation(CPU);
compute_prior_box(); compute_prior_box();
......
...@@ -36,7 +36,6 @@ class ScalePE : public PE { ...@@ -36,7 +36,6 @@ class ScalePE : public PE {
} }
inline int lcm(int a, int b) { return a * b / gcd(a, b); } inline int lcm(int a, int b) { return a * b / gcd(a, b); }
bool init() { bool init() {
Tensor* output = param_.output; Tensor* output = param_.output;
output->setAligned(true); output->setAligned(true);
......
...@@ -164,11 +164,6 @@ class StaticKernelPickPass : public mir::StmtPass { ...@@ -164,11 +164,6 @@ class StaticKernelPickPass : public mir::StmtPass {
// might have different data layout. // might have different data layout.
// TODO(Superjomn) reconsider the idea of taking the data layout as a kernel // TODO(Superjomn) reconsider the idea of taking the data layout as a kernel
// specification. // specification.
if (kernel.place().target == TARGET(kFPGA)) {
final_score = 1000;
}
return final_score; return final_score;
} }
......
...@@ -20,9 +20,6 @@ from __future__ import division ...@@ -20,9 +20,6 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import sys
sys.path.append('../../python/lib')
from paddlelite.lite import * from paddlelite.lite import *
# Command arguments # Command arguments
...@@ -42,8 +39,8 @@ def RunModel(args): ...@@ -42,8 +39,8 @@ def RunModel(args):
config.set_param_file(args.param_file) config.set_param_file(args.param_file)
else: else:
config.set_model_dir(args.model_dir) config.set_model_dir(args.model_dir)
# For x86, you can set places = [Place(TargetType.X86, PrecisionType.FP32)] # For arm platform (armlinux), you can set places = [Place(TargetType.ARM, PrecisionType.FP32)]
places = [Place(TargetType.ARM, PrecisionType.FP32)] places = [Place(TargetType.X86, PrecisionType.FP32)]
config.set_valid_places(places) config.set_valid_places(places)
# 2. Create paddle predictor # 2. Create paddle predictor
......
...@@ -20,8 +20,6 @@ from __future__ import division ...@@ -20,8 +20,6 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import sys
sys.path.append('../../python/lib')
from paddlelite.lite import * from paddlelite.lite import *
...@@ -33,7 +31,7 @@ parser.add_argument( ...@@ -33,7 +31,7 @@ parser.add_argument(
def RunModel(args): def RunModel(args):
# 1. Set config information # 1. Set config information
config = MobileConfig() config = MobileConfig()
config.set_model_dir(args.model_dir) config.set_model_from_file(args.model_dir)
# 2. Create paddle predictor # 2. Create paddle predictor
predictor = create_paddle_predictor(config) predictor = create_paddle_predictor(config)
......
...@@ -62,10 +62,6 @@ void CastCompute::Run() { ...@@ -62,10 +62,6 @@ void CastCompute::Run() {
int32_t* out_data = param.Out->mutable_data<int32_t>(); int32_t* out_data = param.Out->mutable_data<int32_t>();
std::transform( std::transform(
x_data_begin, x_data_end, out_data, TransOp<int64_t, int32_t>); x_data_begin, x_data_end, out_data, TransOp<int64_t, int32_t>);
} else if (param.in_dtype == 3 && param.out_dtype == 5) {
const auto* x_data = param.X->data<float>();
auto* o_data = param.Out->mutable_data<float>();
memcpy(o_data, x_data, sizeof(float) * param.X->numel());
} else { } else {
LOG(FATAL) << "other has not been implemented"; LOG(FATAL) << "other has not been implemented";
} }
......
...@@ -34,7 +34,7 @@ void LookupTableCompute::Run() { ...@@ -34,7 +34,7 @@ void LookupTableCompute::Run() {
auto table_dim = w->dims(); auto table_dim = w->dims();
int64_t ids_numel = ids->numel(); int64_t ids_numel = ids->numel();
auto ids_data = ids->data<float>(); auto ids_data = ids->data<int64_t>();
int64_t row_number = table_dim[0]; int64_t row_number = table_dim[0];
int64_t row_width = table_dim[1]; int64_t row_width = table_dim[1];
...@@ -73,6 +73,7 @@ REGISTER_LITE_KERNEL(lookup_table, ...@@ -73,6 +73,7 @@ REGISTER_LITE_KERNEL(lookup_table,
.BindInput("Ids", {LiteType::GetTensorTy(TARGET(kARM), PRECISION(kInt64))}) .BindInput("Ids", {LiteType::GetTensorTy(TARGET(kARM), PRECISION(kInt64))})
.BindOutput("Out", {LiteType::GetTensorTy(TARGET(kARM))}) .BindOutput("Out", {LiteType::GetTensorTy(TARGET(kARM))})
.Finalize(); .Finalize();
REGISTER_LITE_KERNEL(lookup_table_v2, REGISTER_LITE_KERNEL(lookup_table_v2,
kARM, kARM,
kAny, kAny,
......
...@@ -58,6 +58,7 @@ void PoolCompute::Run() { ...@@ -58,6 +58,7 @@ void PoolCompute::Run() {
bool global_pooling = (paddings[0] == 0) && (ksize[0] == in_dims[2]) && bool global_pooling = (paddings[0] == 0) && (ksize[0] == in_dims[2]) &&
(ksize[1] == in_dims[3]) && kps_equal && pads_equal; (ksize[1] == in_dims[3]) && kps_equal && pads_equal;
global_pooling = param.global_pooling || global_pooling; global_pooling = param.global_pooling || global_pooling;
if (global_pooling) { if (global_pooling) {
for (size_t i = 0; i < ksize.size(); ++i) { for (size_t i = 0; i < ksize.size(); ++i) {
paddings[2 * i] = 0; paddings[2 * i] = 0;
...@@ -107,35 +108,65 @@ void PoolCompute::Run() { ...@@ -107,35 +108,65 @@ void PoolCompute::Run() {
} else if (ksize[0] == 2 && strides[0] == 2 && paddings[0] == 0 && } else if (ksize[0] == 2 && strides[0] == 2 && paddings[0] == 0 &&
kps_equal) { kps_equal) {
if (pooling_type == "max") { if (pooling_type == "max") {
lite::arm::math::pooling2x2s2_max(din, lite::arm::math::pooling2x2s2p0_max(din,
dout, dout,
out_dims[0], out_dims[0],
out_dims[1], out_dims[1],
out_dims[2], out_dims[2],
out_dims[3], out_dims[3],
in_dims[1], in_dims[1],
in_dims[2], in_dims[2],
in_dims[3], in_dims[3],
paddings[1], paddings[1],
paddings[3]); paddings[3]);
return; return;
} else if (pooling_type == "avg") { } else if (pooling_type == "avg") {
lite::arm::math::pooling2x2s2_avg(din, lite::arm::math::pooling2x2s2p0_avg(din,
dout, dout,
out_dims[0], out_dims[0],
out_dims[1], out_dims[1],
out_dims[2], out_dims[2],
out_dims[3], out_dims[3],
in_dims[1], in_dims[1],
in_dims[2], in_dims[2],
in_dims[3], in_dims[3],
exclusive, exclusive,
paddings[1], paddings[1],
paddings[3]); paddings[3]);
return; return;
} }
} else if (ksize[0] == 3 && strides[0] == 1 && paddings[0] == 1 && } else if (ksize[0] == 2 && strides[0] == 2 && paddings[0] == 1 &&
kps_equal) { kps_equal) {
if (pooling_type == "max") {
lite::arm::math::pooling2x2s2p1_max(din,
dout,
out_dims[0],
out_dims[1],
out_dims[2],
out_dims[3],
in_dims[1],
in_dims[2],
in_dims[3],
paddings[1],
paddings[3]);
return;
} else if (pooling_type == "avg") {
lite::arm::math::pooling2x2s2p1_avg(din,
dout,
out_dims[0],
out_dims[1],
out_dims[2],
out_dims[3],
in_dims[1],
in_dims[2],
in_dims[3],
exclusive,
paddings[1],
paddings[3]);
return;
}
} else if (ksize[0] == 3 && strides[0] == 1 && paddings[0] == 1 &&
pads_equal && kps_equal) {
if (pooling_type == "max") { if (pooling_type == "max") {
lite::arm::math::pooling3x3s1p1_max(din, lite::arm::math::pooling3x3s1p1_max(din,
dout, dout,
...@@ -165,7 +196,7 @@ void PoolCompute::Run() { ...@@ -165,7 +196,7 @@ void PoolCompute::Run() {
return; return;
} }
} else if (ksize[0] == 3 && strides[0] == 1 && paddings[0] == 0 && } else if (ksize[0] == 3 && strides[0] == 1 && paddings[0] == 0 &&
kps_equal) { pads_equal && kps_equal) {
if (pooling_type == "max") { if (pooling_type == "max") {
lite::arm::math::pooling3x3s1p0_max(din, lite::arm::math::pooling3x3s1p0_max(din,
dout, dout,
...@@ -195,7 +226,7 @@ void PoolCompute::Run() { ...@@ -195,7 +226,7 @@ void PoolCompute::Run() {
return; return;
} }
} else if (ksize[0] == 3 && strides[0] == 2 && paddings[0] == 0 && } else if (ksize[0] == 3 && strides[0] == 2 && paddings[0] == 0 &&
kps_equal) { pads_equal && kps_equal) {
if (pooling_type == "max") { if (pooling_type == "max") {
lite::arm::math::pooling3x3s2p0_max(din, lite::arm::math::pooling3x3s2p0_max(din,
dout, dout,
...@@ -225,7 +256,7 @@ void PoolCompute::Run() { ...@@ -225,7 +256,7 @@ void PoolCompute::Run() {
return; return;
} }
} else if (ksize[0] == 3 && strides[0] == 2 && paddings[0] == 1 && } else if (ksize[0] == 3 && strides[0] == 2 && paddings[0] == 1 &&
kps_equal) { pads_equal && kps_equal) {
if (pooling_type == "max") { if (pooling_type == "max") {
lite::arm::math::pooling3x3s2p1_max(din, lite::arm::math::pooling3x3s2p1_max(din,
dout, dout,
......
...@@ -132,26 +132,3 @@ REGISTER_LITE_KERNEL(prior_box, ...@@ -132,26 +132,3 @@ REGISTER_LITE_KERNEL(prior_box,
.BindOutput("Variances", {LiteType::GetTensorTy(TARGET(kARM))}) .BindOutput("Variances", {LiteType::GetTensorTy(TARGET(kARM))})
.Finalize(); .Finalize();
// REGISTER_LITE_KERNEL(prior_box,
// kFPGA,
// kFP16,
// kNHWC,
// paddle::lite::kernels::fpga::PriorBoxCompute,
// def)
// .BindInput("Input",
// {LiteType::GetTensorTy(TARGET(kFPGA),
// PRECISION(kFP16),
// DATALAYOUT(kNHWC))})
// .BindInput("Image",
// {LiteType::GetTensorTy(TARGET(kFPGA),
// PRECISION(kFP16),
// DATALAYOUT(kNHWC))})
// .BindOutput("Boxes",
// {LiteType::GetTensorTy(TARGET(kFPGA),
// PRECISION(kFP16),
// DATALAYOUT(kNHWC))})
// .BindOutput("Variances",
// {LiteType::GetTensorTy(TARGET(kFPGA),
// PRECISION(kFP16),
// DATALAYOUT(kNHWC))})
// .Finalize();
...@@ -428,14 +428,8 @@ REGISTER_LITE_KERNEL(multiclass_nms, ...@@ -428,14 +428,8 @@ REGISTER_LITE_KERNEL(multiclass_nms,
kNCHW, kNCHW,
paddle::lite::kernels::host::MulticlassNmsCompute, paddle::lite::kernels::host::MulticlassNmsCompute,
def) def)
.BindInput("BBoxes", .BindInput("BBoxes", {LiteType::GetTensorTy(TARGET(kHost))})
{LiteType::GetTensorTy(TARGET(kHost), .BindInput("Scores", {LiteType::GetTensorTy(TARGET(kHost))})
PRECISION(kAny),
DATALAYOUT(kAny))})
.BindInput("Scores",
{LiteType::GetTensorTy(TARGET(kHost),
PRECISION(kAny),
DATALAYOUT(kAny))})
.BindOutput("Out", {LiteType::GetTensorTy(TARGET(kHost))}) .BindOutput("Out", {LiteType::GetTensorTy(TARGET(kHost))})
.Finalize(); .Finalize();
......
...@@ -46,21 +46,17 @@ REGISTER_LITE_KERNEL(reshape, ...@@ -46,21 +46,17 @@ REGISTER_LITE_KERNEL(reshape,
paddle::lite::kernels::host::ReshapeCompute, paddle::lite::kernels::host::ReshapeCompute,
def) def)
.BindInput("X", .BindInput("X",
{LiteType::GetTensorTy(TARGET(kHost), {LiteType::GetTensorTy(
PRECISION(kAny), TARGET(kHost), PRECISION(kAny), DATALAYOUT(kAny), -1)})
DATALAYOUT(kAny))})
.BindInput("ShapeTensor", .BindInput("ShapeTensor",
{LiteType::GetTensorTy(TARGET(kHost), {LiteType::GetTensorTy(
PRECISION(kAny), TARGET(kHost), PRECISION(kAny), DATALAYOUT(kAny), -1)})
DATALAYOUT(kAny))})
.BindInput("Shape", .BindInput("Shape",
{LiteType::GetTensorTy(TARGET(kHost), {LiteType::GetTensorTy(
PRECISION(kAny), TARGET(kHost), PRECISION(kAny), DATALAYOUT(kAny), -1)})
DATALAYOUT(kAny))})
.BindOutput("Out", .BindOutput("Out",
{LiteType::GetTensorTy(TARGET(kHost), {LiteType::GetTensorTy(
PRECISION(kAny), TARGET(kHost), PRECISION(kAny), DATALAYOUT(kAny), -1)})
DATALAYOUT(kAny))})
.Finalize(); .Finalize();
REGISTER_LITE_KERNEL(reshape2, REGISTER_LITE_KERNEL(reshape2,
......
...@@ -289,6 +289,17 @@ function build_test_server { ...@@ -289,6 +289,17 @@ function build_test_server {
test_model_optimize_tool_compile test_model_optimize_tool_compile
} }
# Build the code and run lite server tests. This is executed in the CI system.
function build_test_coverage {
mkdir -p ./build
cd ./build
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD/third_party/install/mklml/lib"
cmake_x86_for_CI
build
test_server
}
# The CUDA version of CI is cuda_10.1.243_418.87.00_linux. # The CUDA version of CI is cuda_10.1.243_418.87.00_linux.
# The cuDNN version is cudnn-10.1-linux-x64-v7.5.0.56. # The cuDNN version is cudnn-10.1-linux-x64-v7.5.0.56.
function build_test_cuda_server { function build_test_cuda_server {
...@@ -1136,7 +1147,7 @@ function main { ...@@ -1136,7 +1147,7 @@ function main {
shift shift
;; ;;
build_check_coverage) build_check_coverage)
build_test_server build_test_coverage
check_coverage check_coverage
shift shift
;; ;;
......
...@@ -678,15 +678,9 @@ void resize(const uint8_t* src, ...@@ -678,15 +678,9 @@ void resize(const uint8_t* src,
} else if (srcFormat == NV12 || srcFormat == NV21) { } else if (srcFormat == NV12 || srcFormat == NV21) {
nv21_resize(src, dst, srcw, srch, dstw, dsth); nv21_resize(src, dst, srcw, srch, dstw, dsth);
return; return;
num = 1;
int hout = static_cast<int>(0.5 * dsth);
dsth += hout;
} else if (srcFormat == BGR || srcFormat == RGB) { } else if (srcFormat == BGR || srcFormat == RGB) {
bgr_resize(src, dst, srcw, srch, dstw, dsth); bgr_resize(src, dst, srcw, srch, dstw, dsth);
return; return;
w_in = srcw * 3;
w_out = dstw * 3;
num = 3;
} else if (srcFormat == BGRA || srcFormat == RGBA) { } else if (srcFormat == BGRA || srcFormat == RGBA) {
w_in = srcw * 4; w_in = srcw * 4;
w_out = dstw * 4; w_out = dstw * 4;
......
...@@ -29,6 +29,7 @@ namespace zynqmp { ...@@ -29,6 +29,7 @@ namespace zynqmp {
class ConvPE : public PE { class ConvPE : public PE {
public: public:
bool init() { bool init() {
std::cout << "Conv init" << std::endl;
return true; return true;
} }
......
...@@ -10,8 +10,7 @@ import sys ...@@ -10,8 +10,7 @@ import sys
from github import Github from github import Github
token = os.getenv('GITHUB_API_TOKEN', 'e51cb020919a6eef689257966e8fb6477981788a') token = os.getenv('GITHUB_API_TOKEN')
def get_pull(pull_id): def get_pull(pull_id):
""" """
......
et -xe #!/bin/bash
# The git version of CI is 2.7.4. This script is not compatible with git version 1.7.1.
set -xe
PADDLE_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}")/../../" && pwd )" PADDLE_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}")/../../" && pwd )"
...@@ -26,7 +28,6 @@ function gen_full_html_report() { ...@@ -26,7 +28,6 @@ function gen_full_html_report() {
'/Paddle-Lite/lite/kernels/*' \ '/Paddle-Lite/lite/kernels/*' \
'/Paddle-Lite/lite/model_parser/*' \ '/Paddle-Lite/lite/model_parser/*' \
'/Paddle-Lite/lite/opreators/*' \ '/Paddle-Lite/lite/opreators/*' \
'/Paddle-Lite/lite/tests/*' \
'/Paddle-Lite/lite/tools/*' \ '/Paddle-Lite/lite/tools/*' \
'/Paddle-Lite/lite/utils/*' \ '/Paddle-Lite/lite/utils/*' \
-o coverage-full.tmp \ -o coverage-full.tmp \
...@@ -35,7 +36,21 @@ function gen_full_html_report() { ...@@ -35,7 +36,21 @@ function gen_full_html_report() {
mv -f coverage-full.tmp coverage-full.info mv -f coverage-full.tmp coverage-full.info
lcov --remove coverage-full.info \ lcov --remove coverage-full.info \
'/Paddle-Lite/lite/demo*' \ '/Paddle-Lite/lite/tests/*' \
'/Paddle-Lite/lite/demo/*' \
'/Paddle-Lite/lite/fluid/*_test*' \
'/Paddle-Lite/lite/model_parser/*_test*' \
'/Paddle-Lite/lite/kernels/*/*test*' \
'/Paddle-Lite/lite/kernels/*/bridges/*test*' \
'/Paddle-Lite/lite/utils/*_test*' \
'/Paddle-Lite/lite/api/*test*' \
'/Paddle-Lite/lite/core/*_test*' \
'/Paddle-Lite/lite/core/*/*test*' \
'/Paddle-Lite/lite/core/mir/*/*_test*' \
'/Paddle-Lite/lite/core/mir/*_test*' \
'/Paddle-Lite/lite/backends/x86/*/*test*' \
'/Paddle-Lite/lite/backends/opencl/*test*' \
'/Paddle-Lite/lite/operators/*test*' \
-o coverage-full.tmp \ -o coverage-full.tmp \
--rc lcov_branch_coverage=0 --rc lcov_branch_coverage=0
...@@ -48,7 +63,7 @@ gen_full_html_report || true ...@@ -48,7 +63,7 @@ gen_full_html_report || true
function gen_diff_html_report() { function gen_diff_html_report() {
if [ "${GIT_PR_ID}" != "" ]; then if [ "${GIT_PR_ID}" != "" ]; then
COVERAGE_DIFF_PATTERN="`python ${PADDLE_ROOT}/tools/coverage/pull_request.py files ${GIT_PR_ID}`" COVERAGE_DIFF_PATTERN="`python ${PADDLE_ROOT}/tools/coverage/pull_request.py files ${GIT_PR_ID}`"
sleep 5
python ${PADDLE_ROOT}/tools/coverage/pull_request.py diff ${GIT_PR_ID} > git-diff.out python ${PADDLE_ROOT}/tools/coverage/pull_request.py diff ${GIT_PR_ID} > git-diff.out
fi fi
...@@ -57,6 +72,7 @@ function gen_diff_html_report() { ...@@ -57,6 +72,7 @@ function gen_diff_html_report() {
-o coverage-diff.info \ -o coverage-diff.info \
--rc lcov_branch_coverage=0 --rc lcov_branch_coverage=0
sleep 5
python ${PADDLE_ROOT}/tools/coverage/coverage_diff.py coverage-diff.info git-diff.out > coverage-diff.tmp python ${PADDLE_ROOT}/tools/coverage/coverage_diff.py coverage-diff.info git-diff.out > coverage-diff.tmp
mv -f coverage-diff.tmp coverage-diff.info mv -f coverage-diff.tmp coverage-diff.info
......
...@@ -11,8 +11,7 @@ import os ...@@ -11,8 +11,7 @@ import os
from github import Github from github import Github
token = os.getenv('GITHUB_API_TOKEN', 'e51cb020919a6eef689257966e8fb6477981788a') token = os.getenv('GITHUB_API_TOKEN')
def get_pull(pull_id): def get_pull(pull_id):
""" """
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册