點擊上方藍字關注我們
微信公眾號:OpenCV學堂
關注獲取更多計算機視覺與深度學習知識
前言

導入頭文件
一行代碼就獲取C++ SDK支持
創建推理推理請求
ov::Core ie;ov::CompiledModel compiled_model = ie.compile_model(settings.getWeight_file(), "CPU");infer_request = compiled_model.create_infer_request();
ov::Core ie;auto model = ie.read_model(settings.getWeight_file());auto?inputs?=?model->inputs();// change the input as dynamic shape supportfor(auto input_one : inputs){auto input_shape = input_one.get_partial_shape();input_shape[0] = 1;input_shape[1] = 3;input_shape[2] = -1;input_shape[3] = -1;}ov::CompiledModel compiled_model = ie.compile_model(model, "CPU");infer_request = compiled_model.create_infer_request();
ov::Core ie;std::cout<<"model file: "<std ::endl;< span="">auto model = ie.read_model(settings.getWeight_file());std::cout<<"read?model?file?finished!"<<std::endl;"">// setting input data format and layoutov::preprocess::PrePostProcessor ppp(model);ov::preprocess::InputInfo& inputInfo0 = ppp.input(0);inputInfo0.tensor().set_element_type(ov::element::u8);inputInfo0.tensor().set_layout({ "NCHW" });inputInfo0.model().set_layout("NCHW");ov::preprocess::InputInfo& inputInfo1 = ppp.input(1);inputInfo1.tensor().set_element_type(ov::element::u8);inputInfo1.tensor().set_layout({ "NCHW" });inputInfo1.model().set_layout("NCHW");model = ppp.build();ov::CompiledModel compiled_model = ie.compile_model(model, "CPU");this->infer_request = compiled_model.create_infer_request();
導出IR格式模型?
ov_model = ov.convert_model("D:/python/my_yolov8_train_demo/yolov8n.onnx",input=[[1, 3, 640, 640]])ov.save_model(ov_model, str("D:/bird_test/back1/yolov8_ov.xml"))
圖像預處理?
ov::preprocess::PrePostProcessor ppp(model);ov::preprocess::InputInfo& input = ppp.input(tensor_name);// we only need to know where is C dimensioninput.model().set_layout("...C");// specify scale and mean values, order of operations is importantinput.preprocess().mean(116.78f).scale({ 57.21f, 57.45f, 57.73f });// insert preprocessing operations to the 'model'model = ppp.build();
// 預處理cv::Mat blob_image;resize(image, blob_image, cv::Size(input_w, input_h));blob_image.convertTo(blob_image, CV_32F);blob_image = blob_image / 255.0;
或者
cv::Mat blob = cv::dnn::blobFromImage(image, 1 / 255.0, cv::Size(640, 640), cv::Scalar(0, 0, 0), true, false);預測推理?
this->infer_request.infer();異步方式 + Callback
auto restart_once = true;infer_request.set_callback([&, restart_once](std::exception_ptr exception_ptr) mutable {if (exception_ptr) {// procces exception or rethrow it.std::rethrow_exception(exception_ptr);} else {// Extract inference resultov::Tensor output_tensor = infer_request.get_output_tensor();// Restart inference if neededif (restart_once) {infer_request.start_async();restart_once = false;}}});// Start inference without blocking current threadinfer_request.start_async();// Get inference status immediatelybool status = infer_request.wait_for(std::chrono::milliseconds{0});// Wait for one milisecondstatus = infer_request.wait_for(std::chrono::milliseconds{1});// Wait for inference completioninfer_request.wait();
cv::Mat與ov::Tensor轉換
bgr.convertTo(bgr, CV_32FC3);gray.convertTo(gray, CV_32F, 1.0/255);ov::Tensor blob1(input_tensor_1.get_element_type(), input_tensor_1.get_shape(), (float *)bgr.data);ov::Tensor blob2(input_tensor_2.get_element_type(), input_tensor_2.get_shape(), (float *)gray.data);
const float* prob = (float*)output.data();const ov::Shape outputDims = output.get_shape();size_t numRows = outputDims[1];size_t numCols = outputDims[2];
// 通道數為1 用這行
cv::Mat detOut(numRows, numCols, CV_32F, (float*)prob);// 通道數為3 用這行
cv::Mat detOut(numRows, numCols, CV_32FC3, (float*)prob);如果輸出是1xHW的三維張量,直接用下面這樣:
cv::Mat detOut(numRows, numCols, CV_32F, (float*)prob);從此你就真的解鎖了OpenVINO C++ 模型推理部署的各種細節了。


推薦閱讀
OpenCV4.8+YOLOv8對象檢測C++推理演示
ZXING+OpenCV打造開源條碼檢測應用
攻略 | 學習深度學習只需要三個月的好方法
三行代碼實現 TensorRT8.6 C++ 深度學習模型部署
實戰 | YOLOv8+OpenCV 實現DM碼定位檢測與解析
對象檢測邊界框損失 – 從IOU到ProbIOU
初學者必看 | 學習深度學習的五個誤區
