使用C++预测库预测不准
Created by: zuokanmingyuli
- 版本、环境信息:
1)预测库版本
WITH_MKL: OFF
WITH_MKLDNN: OFF
WITH_GPU: ON
CUDA version: 10.0
CUDNN version: v7
2)系统:ubuntu 18.04
3)opencv:4.1.1
- 问题描述: 使用c++预测库(由paddle1.5.2编译),模型使用paddlehub的mobilenet_v2_imagenet,对一张客机的图片进行预测,使用paddlehub的命令行命令预测结果是正确的,而我的预测结果是错误的,我觉得可能是我的数据处理的问题,但不知道怎么改。代码如下:
#include <QCoreApplication>
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <numeric>
#include <iostream>
#include <memory>
#include <chrono>
#include "paddle/include/paddle_inference_api.h"
// cv
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
using namespace cv;
using namespace std;
namespace paddle {
using paddle::AnalysisConfig;
DEFINE_string(dirname, "./mobilenet_v2_imagenet", "Directory of the inference model.");
using Time = decltype(std::chrono::high_resolution_clock::now());
Time time() { return std::chrono::high_resolution_clock::now();}
double time_diff(Time t1, Time t2) {
typedef std::chrono::microseconds ms;
auto diff = t2 - t1;
ms counter = std::chrono::duration_cast<ms>(diff);
return counter.count() / 1000.0;
}
void PrepareTRTConfig(AnalysisConfig *config, int batch_size) {
config->SetModel("./mobilenet_v2_imagenet");
config->EnableUseGpu(100, 0);
// We use ZeroCopyTensor here, so we set config->SwitchUseFeedFetchOps(false)
config->SwitchUseFeedFetchOps(false);
}
bool inference(int batch_size) {
// opencv
Mat img; Mat dst;
const char* filename = "plane.jpg";
img = imread(filename, IMREAD_COLOR );
if (img.empty())
{
printf(" Error opening image\n");
}
dst = img.clone();
resize(img,dst,Size(224,224),0,0,INTER_LINEAR);
float ary[224 * 224 * 3];
for (int i = 0; i < 224 * 224 * 3; i++) {
ary[i] = dst.data[i]/255;
};
AnalysisConfig config;
PrepareTRTConfig(&config, batch_size);
auto predictor = CreatePaddlePredictor(config);
int channels = 3;
int height = 224;
int width = 224;
// prepare inputs
float input[batch_size * channels * height * width] = {0};
auto input_names = predictor->GetInputNames();
auto input_t = predictor->GetInputTensor(input_names[0]);
input_t->Reshape({batch_size, channels, height, width});
input_t->copy_from_cpu(ary);
// run
cout <<"开始预测: " << endl;
auto time1 = time();
CHECK(predictor->ZeroCopyRun());
auto time2 = time();
std::cout <<"batch: " << batch_size << " one predict cost: " << time_diff(time1, time2) << "ms" << std::endl;
// get the output
std::vector<float> out_data;
auto output_names = predictor->GetOutputNames();
auto output_t = predictor->GetOutputTensor(output_names[0]);
std::vector<int> output_shape = output_t->shape();
int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1, std::multiplies<int>());
out_data.resize(out_num);
output_t->copy_to_cpu(out_data.data());
std::vector<float>::iterator biggest = std::max_element(std::begin(out_data), std::end(out_data));
cout <<" Max element is " << *biggest<< " at position" << std::distance(std::begin(out_data), biggest) << std::endl;
return true;
}
} // namespace paddle
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
paddle::inference(1);
return a.exec();
}
就是在文档样例的基础上,用opencv送入了一幅图片进行预测。(文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_usage/deploy/inference/native_infer.html) 输出结果如下:
--- Running analysis [ir_graph_build_pass]
--- Running analysis [ir_graph_clean_pass]
--- Running analysis [ir_analysis_pass]
--- Running IR pass [is_test_pass]
--- Running IR pass [simplify_with_basic_ops_pass]
--- Running IR pass [conv_affine_channel_fuse_pass]
--- Running IR pass [conv_eltwiseadd_affine_channel_fuse_pass]
--- Running IR pass [conv_bn_fuse_pass]
I1105 15:20:35.616180 14890 graph_pattern_detector.cc:96] --- detected 36 subgraphs
--- Running IR pass [conv_eltwiseadd_bn_fuse_pass]
--- Running IR pass [multihead_matmul_fuse_pass]
--- Running IR pass [fc_fuse_pass]
I1105 15:20:35.690109 14890 graph_pattern_detector.cc:96] --- detected 1 subgraphs
--- Running IR pass [fc_elementwise_layernorm_fuse_pass]
--- Running IR pass [conv_elementwise_add_act_fuse_pass]
--- Running IR pass [conv_elementwise_add2_act_fuse_pass]
--- Running IR pass [conv_elementwise_add_fuse_pass]
I1105 15:20:35.706290 14890 graph_pattern_detector.cc:96] --- detected 36 subgraphs
--- Running IR pass [transpose_flatten_concat_fuse_pass]
--- Running IR pass [runtime_context_cache_pass]
--- Running analysis [ir_params_sync_among_devices_pass]
I1105 15:20:35.713924 14890 ir_params_sync_among_devices_pass.cc:41] Sync params from CPU to GPU
--- Running analysis [adjust_cudnn_workspace_size_pass]
--- Running analysis [inference_op_replace_pass]
--- Running analysis [ir_graph_to_program_pass]
I1105 15:20:35.740032 14890 analysis_predictor.cc:474] ======= optimize end =======
--- skip [@HUB_mobilenet_v2_imagenet@feed], feed -> @HUB_mobilenet_v2_imagenet@image
--- skip [@HUB_mobilenet_v2_imagenet@save_infer_model/scale_0], fetch -> @HUB_mobilenet_v2_imagenet@fetch
--- skip [@HUB_mobilenet_v2_imagenet@save_infer_model/scale_1], fetch -> @HUB_mobilenet_v2_imagenet@fetch
W1105 15:57:08.443006 15571 device_context.cc:235] Please NOTE: device: 0, CUDA Capability: 61, Driver API Version: 10.1, Runtime API Version: 10.0
W1105 15:57:08.446297 15571 device_context.cc:243] device: 0, cuDNN Version: 7.6.
开始预测:
batch: 1 one predict cost: 3.373ms
Max element is 3.3759 at position400
根据标签文件,正确结果应该是标签的405,请问是哪里错了呢?