diff --git a/src/framework/executor.cpp b/src/framework/executor.cpp index 06e19ea093b639eb150c42fa113d7279cb458342..89253188951e8bc8268999c15298ceeb2ae0d69f 100644 --- a/src/framework/executor.cpp +++ b/src/framework/executor.cpp @@ -465,11 +465,12 @@ void Executor::FeedData(const Tensor &t) { template void Executor::FeedData(const std::vector &v) { auto input_size = v.size(); - auto vars = program_.scope->VarContain("feed"); + int index = 0; + auto vars = program_.scope->VarContain("feed", &index); PADDLE_MOBILE_ENFORCE(input_size == vars.size(), "input data number not correct"); for (int i = 0; i < input_size; i++) { - auto var = vars[i]; + auto var = program_.scope->Var("feed", i + index); auto feed_tensor = var->template GetMutable(); feed_tensor->external_data = v[i]; } @@ -478,11 +479,12 @@ void Executor::FeedData(const std::vector &v) { template void Executor::FeedTensorData(const vector &v) { auto input_size = v.size(); - auto vars = program_.scope->VarContain("feed"); + int index = 0; + auto vars = program_.scope->VarContain("feed", &index); PADDLE_MOBILE_ENFORCE(input_size == vars.size(), "input data number not correct"); for (int i = 0; i < input_size; i++) { - auto var = vars[i]; + auto var = program_.scope->Var("feed", i + index); auto feed_tensor = var->template GetMutable(); feed_tensor->ShareDataWith(v[i]); } @@ -492,12 +494,13 @@ template void Executor::GetResults(std::vector *v) { auto output_size = v->size(); PADDLE_MOBILE_ENFORCE(output_size > 0, "Empty output"); - auto vars = program_.scope->VarContain("fetch"); + int index = 0; + auto vars = program_.scope->VarContain("fetch", &index); PADDLE_MOBILE_ENFORCE(output_size == vars.size(), "output data number not correct"); for (int i = 0; i < output_size; i++) { - auto var = vars[i]; + auto var = program_.scope->Var("fetch", i + index); auto fetch_tensor = var->template GetMutable(); (*v)[i] = fetch_tensor->template data(); } @@ -506,11 +509,11 @@ void Executor::GetResults(std::vector *v) { template void Executor::GetTensorResults( std::vector *v) { - auto vars = program_.scope->VarContain("fetch"); + int index = 0; + auto vars = program_.scope->VarContain("fetch", &index); auto output_size = vars.size(); - for (int i = 0; i < output_size; i++) { - auto var = vars[i]; + auto var = program_.scope->Var("fetch", i + index); auto fetch_tensor = var->template GetMutable(); v->push_back(fetch_tensor); } diff --git a/src/framework/scope.cpp b/src/framework/scope.cpp index db263081446f9804e5352588063a23f72a8bf163..026b1e6b72dcca081554152ea356204ba311b359 100644 --- a/src/framework/scope.cpp +++ b/src/framework/scope.cpp @@ -116,18 +116,26 @@ Variable *Scope::Var(const std::string &name, const int id) { return Var(name + std::to_string(id)); } -std::vector Scope::VarContain(const std::string substring) { +std::vector Scope::VarContain(const std::string substring, + int *min) { std::vector v; + + int temp = 9999; + auto len0 = substring.length(); for (auto pair : vars_) { if (pair.first.find(substring) == 0) { v.push_back(pair.second); + auto len1 = pair.first.length(); + int index = std::stoi(pair.first.substr(len0, len1)); + if (index < temp) { + temp = index; + } } } + *min = temp; return v; } -void Scope::InsertVar(const std::string str, Variable *var) {} - void Scope::print_vars() { DLOG << "====================start to print variables================="; for (auto pair : vars_) { diff --git a/src/framework/scope.h b/src/framework/scope.h index d9e3a179e0aae9f93947df60cea410d3eb5cb128..2bf9ed85bd36013814a6adb80884693d7a944c90 100644 --- a/src/framework/scope.h +++ b/src/framework/scope.h @@ -85,8 +85,7 @@ class Scope { #ifdef PADDLE_MOBILE_FPGA Variable *Var(const std::string &name, const int id); - std::vector VarContain(const std::string substring); - void InsertVar(const std::string str, Variable *var); + std::vector VarContain(const std::string substring, int *min); void print_vars(); #endif diff --git a/src/io/api_paddle_mobile.cc b/src/io/api_paddle_mobile.cc index d644dc4804b6daa1447aa68084283d345b2dc6f8..b7a8ebba9c1d9adac3993d22aa33fb5445235349 100644 --- a/src/io/api_paddle_mobile.cc +++ b/src/io/api_paddle_mobile.cc @@ -171,18 +171,6 @@ void PaddleMobilePredictor::GetPaddleTensor(const std::string &name, ConvertTensors(*t, output); }; -template -void PaddleMobilePredictor::FeedData( - const std::vector &inputs) { - paddle_mobile_->FeedData(inputs); -} - -template -void PaddleMobilePredictor::GetResults( - std::vector *outputs) { - paddle_mobile_->GetResults(outputs); -} - template void PaddleMobilePredictor::Predict_From_To(int start, int end) { paddle_mobile_->Predict_From_To(start, end); diff --git a/src/io/api_paddle_mobile.h b/src/io/api_paddle_mobile.h index 2e3d8dc69b60138eb5f82c1b1faa9c182c51442b..aa0050ca057baa94c457dc0eb313b2bd7f8355be 100644 --- a/src/io/api_paddle_mobile.h +++ b/src/io/api_paddle_mobile.h @@ -32,8 +32,6 @@ class PaddleMobilePredictor : public PaddlePredictor { std::vector* output_data, int batch_size = -1) override; #ifdef PADDLE_MOBILE_FPGA - void FeedData(const std::vector& inputs) override; - void GetResults(std::vector* outputs) override; void Predict_From_To(int start, int end) override; void FeedPaddleTensors(const std::vector& inputs) override; void FetchPaddleTensors(std::vector* outputs) override; diff --git a/src/io/paddle_inference_api.h b/src/io/paddle_inference_api.h index 81779da1eafa892bd800641e133014988dab13e8..36435e07e6bad84527b58c0216cc12df557a8ab7 100644 --- a/src/io/paddle_inference_api.h +++ b/src/io/paddle_inference_api.h @@ -113,6 +113,7 @@ class PaddlePredictor { // `inputs`. `inputs` should be available until Run returns. Caller should be // responsible for the output tensor's buffer, either allocated or passed from // outside. + virtual bool Run(const std::vector& inputs, std::vector* output_data, int batch_size = -1) = 0; @@ -126,8 +127,6 @@ class PaddlePredictor { std::string param_file; }; #ifdef PADDLE_MOBILE_FPGA - virtual void FeedData(const std::vector& inputs) = 0; - virtual void GetResults(std::vector* outputs) = 0; virtual void Predict_From_To(int start, int end) = 0; virtual void FeedPaddleTensors(const std::vector& inputs) = 0; virtual void FetchPaddleTensors(std::vector* outputs) = 0; diff --git a/test/fpga/test_rfcn_api.cpp b/test/fpga/test_rfcn_api.cpp index 74e99ff5ffe553101a07c407cd05c177bd6287b2..2268fc46e5eb98eeff781e6de3a57e5efb911d3d 100644 --- a/test/fpga/test_rfcn_api.cpp +++ b/test/fpga/test_rfcn_api.cpp @@ -55,8 +55,21 @@ PaddleMobileConfig GetConfig() { return config; } +PaddleMobileConfig GetConfig1() { + PaddleMobileConfig config; + config.precision = PaddleMobileConfig::FP32; + config.device = PaddleMobileConfig::kFPGA; + config.model_dir = "../models/resnet50"; + config.thread_num = 1; + config.batch_size = 1; + config.optimize = true; + config.quantification = false; + return config; +} + int main() { open_device(); + PaddleMobileConfig config = GetConfig(); auto predictor = CreatePaddlePredictor(fpga_malloc(img_length * sizeof(float))); readStream(g_image, reinterpret_cast(img)); std::cout << "Finishing initializing data" << std::endl; - /* - predictor->FeedData({img_info, img}); - predictor->Predict_From_To(0, -1); - std::cout << " Finishing predicting " << std::endl; - std::vector v(3, nullptr); - predictor->GetResults(&v); - int post_nms = 300; - for (int num = 0; num < post_nms; num ++){ - for (int i = 0; i < 8; i ++){ - std:: cout << ((float*)(v[0]))[num * 8 + i] << std::endl; - } - } - for (int num = 0; num < post_nms; num ++){ - for (int i = 0; i < 8; i ++){ - std:: cout << ((float*)(v[1]))[num * 8 + i] << std::endl; - } - } - for (int num = 0; num < post_nms; num ++){ - for (int i = 0; i < 4; i ++){ - std:: cout << ((float*)(v[2]))[num * 4 + i] << std::endl; - } - } - */ - struct PaddleTensor t_img_info, t_img; - t_img_info.dtype = FLOAT32; + t_img.dtypeid = typeid(float); t_img_info.layout = LAYOUT_HWC; t_img_info.shape = std::vector({1, 3}); t_img_info.name = "Image information"; t_img_info.data.Reset(img_info, 3 * sizeof(float)); - t_img.dtype = FLOAT32; + t_img.dtypeid = typeid(float); t_img.layout = LAYOUT_HWC; - t_img.shape = std::vector({1, 768, 1536, 3}); + t_img.shape = std::vector({1, 432, 1280, 3}); t_img.name = "Image information"; t_img.data.Reset(img, img_length * sizeof(float)); predictor->FeedPaddleTensors({t_img_info, t_img}); @@ -116,6 +105,9 @@ int main() { std::vector v; // No need to initialize v predictor->FetchPaddleTensors(&v); // Old data in v will be cleared std::cout << "Output number is " << v.size() << std::endl; + std::cout << "out[0] length " << v[0].data.length() << std::endl; + std::cout << "out[1] length " << v[1].data.length() << std::endl; + std::cout << "out[2] length " << v[2].data.length() << std::endl; auto post_nms = v[0].data.length() / sizeof(float) / 8; for (int num = 0; num < post_nms; num++) { @@ -138,6 +130,8 @@ int main() { } std::cout << "Finish getting vector values" << std::endl; + //////////////////////////////////////////////////// + PaddleTensor tensor; predictor->GetPaddleTensor("fetch2", &tensor); for (int i = 0; i < post_nms; i++) { @@ -145,5 +139,36 @@ int main() { std::cout << p[+i] << std::endl; } + ////////////////////////////////////////////////////// + + PaddleMobileConfig config1 = GetConfig1(); + auto predictor1 = + CreatePaddlePredictor(config1); + + std::cout << "Finishing loading model" << std::endl; + + int img_length1 = 224 * 224 * 3; + auto img1 = + reinterpret_cast(fpga_malloc(img_length1 * sizeof(float))); + + std::cout << "Finishing initializing data" << std::endl; + + struct PaddleTensor t_img1; + + t_img1.dtypeid = typeid(float); + t_img1.layout = LAYOUT_HWC; + t_img1.shape = std::vector({1, 224, 224, 3}); + t_img1.name = "Image information"; + t_img1.data.Reset(img1, img_length1 * sizeof(float)); + predictor1->FeedPaddleTensors({t_img1}); + predictor1->Predict_From_To(0, -1); + std::cout << "Finishing predicting " << std::endl; + + std::vector v1; // No need to initialize v + predictor1->FetchPaddleTensors(&v1); // Old data in v will be cleared + std::cout << "Output number is " << v1.size() << std::endl; + std::cout << "out[0] length " << v1[0].data.length() << std::endl; + return 0; }