- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have trained a mobilenet for classifying 5 gestures. For any gesture performed, neural network predicts as class 3 only.
Due to preprocessing, input image is FP32
NOTE* NN is properly trained and it predicts correctly when used in OpenCV DNN API with same steps.
I think I am going wrong somewhere in setting input with openVINO. Following are the steps I have followed
1. Initialize IE
// 1. Add CPU plugins
InferenceEnginePluginPtr _plugin = PluginDispatcher({""}).getPluginByDevice(TARGET_HDWARE);
InferencePlugin plugin(_plugin);
//TODO: Write shell to make in 'ie_cpu_extension'
// make generates 'libcpu_extension.so'
string s_ext_plugin = "./ie_cpu_extension/libcpu_extension.so";
auto extension_ptr = make_so_pointer<InferenceEngine::IExtension>(s_ext_plugin);
plugin.AddExtension(extension_ptr);
// 2. Create an IR reader and read network files
CNNNetReader network_reader;
network_reader.ReadNetwork("../mnet_v6/openvino_fp32/mobilenet_v2_336x448.xml");
network_reader.ReadWeights("../mnet_v6/openvino_fp32/mobilenet_v2_336x448.bin");
CNNNetwork network = network_reader.getNetwork();
/** Set network batch size to 1 **/
network.setBatchSize(BATCH_SIZE);
size_t batchSize = network.getBatchSize();
//3. Configure input and output
/**Get NN input information **/
InferenceEngine::InputsDataMap input_info(network.getInputsInfo());
InferenceEngine::SizeVector inputDims;
for (auto &item : input_info) {
auto input_data = item.second;
input_data->setPrecision(Precision::FP32);
input_data->setLayout(Layout::NCHW);
inputDims=input_data->getDims();
}
cout << "inputDims=";
for (int i=0; i<inputDims.size(); i++) {
cout << (int)inputDims << " ";
}
cout << endl;
infer_width=inputDims[0];
infer_height=inputDims[1];
num_channels=inputDims[2];
/**Get NN output information **/
InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());
InferenceEngine::SizeVector outputDims;
for (auto &item : output_info) {
auto output_data = item.second;
output_data->setPrecision(Precision::FP32);
output_data->setLayout(Layout::NC);
outputDims=output_data->getDims();
}
cout << "outputDims=";
for (int i=0; i<outputDims.size(); i++) {
cout << (int)outputDims << " ";
}
// 4. Load model to plugin
ExecutableNetwork executable_network = plugin.LoadNetwork(network,{});
// 5. Create infer request
InferRequest infer_request = executable_network.CreateInferRequest();
2. Get input/output buffer information
// get the input blob buffer pointer location
float *input_buffer;
float *input_buffer_current_image;
for (auto &item : nn_read_data.input_info) {
input_name = item.first;
auto input_data = item.second;
input = nn_read_data.infer_request.GetBlob(input_name);
input_buffer = input->buffer().as<PrecisionTrait<Precision::FP32>::value_type *>();
}
// get the output blob pointer location
float *output_buffer;
float *output_buffer_current_image;
for (auto &item : nn_read_data.output_info) {
auto output_name = item.first;
output = nn_read_data.infer_request.GetBlob(output_name);
output_buffer = output->buffer().as<PrecisionTrait<Precision::FP32>::value_type *>();
}
3. Feed in the image and run inference
image3ch_gesture = // code to generate image
imshow("original image", image3ch_gesture);
preprocess_image(image3ch_gesture);
auto dims = input->getTensorDesc().getDims();
size_t channels_number = dims[1];
size_t image_size = dims[3]*dims[2];
for (size_t pid = 0; pid < image_size; ++pid){
for (size_t ch = 0; ch < channels_number; ++ch) {
input_buffer[ch * image_size + pid] = image3ch_gesture.at<cv::Vec3b>(pid)[ch];
}
}
// perform inference. Async
nn_read_data.infer_request.Infer();
// Get detection output using output blob pointer.
// For 5 class classification with batch size of N,
// output is Nx5
vector<unsigned> results;
TopResults(2, *output, results);
NOTE* imshow() shows me the correct processed image.
My guess is I am going wrong somewhere in 1st or 2nd stage. 3rd stage seems find because when I feed 32F mat with all zeros, NN classify it as background as expected.
For all other image, always class 3 is predicted.
Thanks.
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page