計算グラフは、tensorflow で作成したので、mo_tf.py であらかじめ変換して、Intel IR(Intermediate Representation) の形式にしておく。
で、以下ソース。 具体的なことはコメントを参照して下さい。
FULL_PATH_TO_IR_XML_FILE は、IRに変換したXMLファイルのパスを
FULL_PATH_TO_IR_BIN_FILE は、IRに変換した時のBINフィルのパスを
最初の
1 2 3 |
InferenceEngine::PluginDispatcher dispatcher |
のパスも適宜変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
// プラグインの初期化 (ubuntu_16.04 の場合) InferenceEngine::PluginDispatcher dispatcher({"/opt/intel/computer_vision_sdk/deployment_tools/inference_engine/lib/ubuntu_16.04/intel64", ""}); // eCPU : CPUで計算 // eMYRIAD : Movidius等のMyriadでの計算 // eGPU : GPU で計算 this->m_plugin.reset(new InferenceEngine::InferencePlugin(dispatcher.getSuitablePlugin(InferenceEngine::TargetDevice::eCPU))); // モデルファイルから変換した Intel IR(Intermediate Representation) を読み込ませる InferenceEngine::CNNNetReader network_reader; // XMLファイルを指定する network_reader.ReadNetwork(FULL_PATH_TO_IR_XML_FILE); // BIN ファイルを指定する network_reader.ReadWeights(FULL_PATH_TO_IR_BIN_FILE); // バッチサイズの指定 network_reader.getNetwork().setBatchSize(1); this->m_network = network_reader.getNetwork(); // 入力情報の読み込み auto input_info = this->m_network.getInputsInfo().begin()->second; // 入力の変数名の取得 m_input_name = this->m_network.getInputsInfo().begin()->first; input_info->setPrecision(InferenceEngine::Precision::FP32); // 出力情報の読み込み auto output_info = this->m_network.getOutputsInfo().begin()->second; // 出力の変数名の取得 m_output_name = this->m_network.getOutputsInfo().begin()->first; output_info->setPrecision(InferenceEngine::Precision::FP32); // ----- ここまでは使い回せるので、initializer とか、constructor とかで処理すると良いかも -----// // プラグインにネットワークをロードする auto executable_network = m_plugin->LoadNetwork(this->m_network, {}); auto infer_request = executable_network.CreateInferRequest(); // 入力のBlobを取得 auto input = infer_request.GetBlob(m_input_name); auto input_data = input->buffer().as<InferenceEngine::PrecisionTrait<InferenceEngine::Precision::FP32>::value_type*>(); // 例では画像データを入れる。 // 画像データは、一度1次元の状態にして、以下のような形式でBlobに入れ込む cv::Mat flat = target.reshape(1,3); size_t channels_number = input->dims()[2]; // Blobの中は、チャンネルごとに纏めた状態の配列になる // BGR 形式の場合 2x2 の画像の場合 // [B1, B2, B3, B4, G1, G2, G3, G4, R1, R2, R3, R4] // のような配列になる size_t image_size = input->dims()[1] * input->dims()[0]; for(int i = 0; i < flat.cols; i++) { for (size_t ch = 0; ch < channels_number; ++ch) { input_data[ch * image_size + i] = target.at<cv::Vec3b>(i)[ch]; } } // 推論する infer_request.Infer(); // 結果のBLobを取得する auto output = infer_request.GetBlob(m_output_name); // output_data は float のポインタ. auto output_data = output->buffer().as<InferenceEngine::PrecisionTrait<InferenceEngine::Precision::FP32>::value_type*>(); // 例えば、結果は 2 x 2 (結果サイズ 2 のものが二つ戻ってくると) // [一つ目の結果1 , 一つめの結果2, 2つ目の結果1,2つ目の結果2] // のように、フラットな配列の状態で取れる output_data[0]; // first result (First of the two out of all) output_data[1]; // second result (First of the two out of all) output_data[2]; // first result (Second of the two out of all) output_data[3]; // second result (Second of the two out of all) |