C++ inference semantic segmentation

Hi everyone!

i’m faced with a problem while develop c++ app for NN inference using c++ API. In examples i’m found code https://github.com/apache/incubator-mxnet/blob/master/example/image-classification/predict-cpp/image-classification-predict.cc which is used as a base for inference.

For debuging app deeplab model used from

The problem is empty output array data. No error while forward or any step.

Where is a mistake?
How to make it work?

output log:
[15:13:07] /home/user/incubator-mxnet/src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v1.2.0. Attempting to upgrade…
[15:13:07] /home/user/incubator-mxnet/src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded!
MXPREDCreate… Done
Assert… Done
[15:14:14] /home/user/incubator-mxnet/src/operator/nn/./cudnn/./cudnn_algoreg-inl.h:107: Running performance tests to find the best convolution algorithm, this can take a while… (setting env variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable)
[15:14:36] /home/user/incubator-mxnet/src/operator/nn/./cudnn/./cudnn_algoreg-inl.h:107: Running performance tests to find the best convolution algorithm, this can take a while… (setting env variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable)

Inference code:

std::string json_file = "deepLab-symbol.json";
    std::string param_file = "deepLab-0000.params";

    BufferFile json_data(json_file);
    BufferFile param_data(param_file);

    // Parameters
    int dev_type = 2;  // 1: cpu, 2: gpu
    int dev_id = 0;  // arbitrary.
    mx_uint num_input_nodes = 1;  // 1 for feedforward
    const char* input_key[1] = {"data"};
    const char** input_keys = input_key;

    // Image size and channels
    int width = 2048;
    int height = 1024;
    int channels = 3;

    const mx_uint input_shape_indptr[2] = { 0, 4 };
    const mx_uint input_shape_data[4] = { 1,
                                        static_cast<mx_uint>(channels),
                                        static_cast<mx_uint>(height),
                                        static_cast<mx_uint>(width)};
    PredictorHandle pred_hnd = 0;

    // if (json_data.GetLength() == 0 ||
    //     param_data.GetLength() == 0) {
    //     return -1;
    // }

    // Create Predictor
    cout << "MXPREDCreate... " << endl;
    MXPredCreate((const char*)json_data.GetBuffer(),
                 (const char*)param_data.GetBuffer(),
                 static_cast<size_t>(param_data.GetLength()),
                 dev_type,
                 dev_id,
                 num_input_nodes,
                 input_keys,
                 input_shape_indptr,
                 input_shape_data,
                 &pred_hnd);
    cout << "MXPREDCreate... Done" << endl;
    assert(pred_hnd);
    cout << "Assert... Done" << endl;
    int image_size = width * height * channels;

    // Read Mean Data
    const mx_float* nd_data = NULL;
    NDListHandle nd_hnd = 0;
		//BufferFile nd_buf; //nd_file);

  //  if (nd_buf.GetLength() > 0) {
  //      mx_uint nd_index = 0;
  //      mx_uint nd_len;
  //      const mx_uint* nd_shape = 0;
  //      const char* nd_key = 0;
  //      mx_uint nd_ndim = 0;

  //      MXNDListCreate((const char*)nd_buf.GetBuffer(),
  //                 nd_buf.GetLength(),
  //                 &nd_hnd, &nd_len);

  //      MXNDListGet(nd_hnd, nd_index, &nd_key, &nd_data, &nd_shape, &nd_ndim);
  //  }

    // Read Image Data
    std::vector<mx_float> image_data = std::vector<mx_float>(image_size);

    GetImageFile(test_file, image_data.data(),
                 channels, cv::Size(width, height), nd_data);

    // Set Input Image
    MXPredSetInput(pred_hnd, "data", image_data.data(), image_size);

    // Do Predict Forward
    MXPredForward(pred_hnd);

    mx_uint output_index = 0;

    mx_uint *shape = 0;
    mx_uint shape_len;

    // Get Output Result
    MXPredGetOutputShape(pred_hnd, output_index, &shape, &shape_len);

    size_t size = 1;
    for (mx_uint i = 0; i < shape_len; ++i) size *= shape[i];

    //std::vector<float> data(size);
		float * data = new float[size];
    MXPredGetOutput(pred_hnd, output_index, data, size);

    // Release NDList
    if (nd_hnd)
      MXNDListFree(nd_hnd);

    // Release Predictor
    MXPredFree(pred_hnd);