1. コード
リンク: https://pan.baidu.com/s/1nvgtKIRVPOEa0pJazW8GHQ抽出コード: qhkp
または: https://github.com/caip1299920300/Openvino_dog_cat
2. 環境構築
1. OpenCVの環境設定
opencv バージョン: opencv340
次のチュートリアルを使用できます ( VS+OpenCV+OpenVINO2022 の詳細な構成 - Zhihu (zhihu.com)も参照できます)。
(1) 「マイ コンピュータ」を右クリック -> 「プロパティ」 -> 「システムの詳細設定」 -> 「環境変数」 -> 「システム変数」 -> 「パス」 -> 「D:\OpenCV\build\x64\vc15\bin」を追加します (これは、に基づいていることに注意してください)独自の OpenCV パス。ここで指定されたパスは私のパスであり、コピーして直接使用することはできません。追加されるのは、opencv インストール ディレクトリのビルド内の bin フォルダー パスです)
(2) パス D:\OpenCV\build\x64\vc15\bin\ にある opencv_world420.dll と opencv_world420d.dll を C:\Windows\SysWOW64 ディレクトリにコピーします。
(3) パス D:\OpenCV\build\bin\ にある opencv_videoio_ffmpeg420_64.dll を C:\Windows\System32 ディレクトリにコピーします。
Windows が見つからない場合は、[表示] をクリックして非表示の項目を確認します。
2. VS で新しいプロジェクトを作成し、プロジェクトを構成します
配置VC++ 目录的”包含目录“和”库目录“
”包含目录“:
C:\Program Files(x86)\Intel\openvino_2022.1.0.643\runtime\include
C:\Program Files(x86)\Intel\openvino_2022.1.0.643\runtime\include\openvino
C:\Program Files(x86)\Intel\openvino_2022.1.0.643\runtime\include\ngraph
C:\Program Files(x86)\Intel\openvino_2022.1.0.643\runtime\include\ie
E:\opencv\build\include
E:\opencv\build\include\opencv2
”库目录“:
E:\opencv\build\x64\vc15\lib
C:\ProgramFiles (x86)\Intel\openvino_2022.1.0.643\runtime\lib\intel64\Release
配置”链接器“的输入:
openvino.lib
openvino_onnx_frontend.lib
openvino_ir_frontend.lib
opencv_world340.lib
三、运行代码
#include <openvino/openvino.hpp>
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
int main() {
std::string img_path = "E:/project/VS2017/dog_cat/img/dog.jpg"; // 预测图片
std::string onnx_path = "E:/project/VS2017/dog_cat/model/Cat_dog.onnx"; // 预测模型
size_t input_batch_size = 1; // 输入图片的batch_size
size_t num_channels = 3; // 输入通道
size_t h = 224; // 输入图片的高
size_t w = 224; // 输入图片的宽
clock_t startTime, endTime; // 推理时间记录变量
// 0、创建IE插件,查询支持硬件设备
ov::Core core;
//获取当前支持的所有的AI硬件推理设备
std::vector<std::string> devices = core.get_available_devices();
for (int i = 0; i < devices.size(); i++) {
std::cout << devices[i] << std::endl;
}
// 1、加载检测模型
// 模型加载并编译
ov::CompiledModel compiled_model = core.compile_model(onnx_path, "AUTO");
// 创建用于推断已编译模型的推理请求对象 创建的请求分配了输入和输出张量
ov::InferRequest infer_request = compiled_model.create_infer_request();
// 2、请求网络输入
auto input_tensor = infer_request.get_input_tensor(0);
// 3、指定shape的大小
input_tensor.set_shape({ input_batch_size, num_channels, w, h });
// 4、获取输入的地址,并传递给指针input_data_host
float* input_data_host = input_tensor.data<float>();
// 对应于pytorch的代码部分
// 推理开始时间
startTime = clock();
// opencv读取图片
cv::Mat src = cv::imread(img_path);
int image_height = src.rows;
int image_width = src.cols;
// 修改图片大小
cv::Mat image;
cv::resize(src, image, cv::Size(w, h));
int image_area = image.cols * image.rows;
unsigned char* pimage = image.data;
float* phost_b = input_data_host + image_area * 0; // input_data_host和phost_*进行地址关联
float* phost_g = input_data_host + image_area * 1;
float* phost_r = input_data_host + image_area * 2;
// BGR->RGB
float mean[] = { 0.406, 0.456, 0.485 };
float std[] = { 0.225, 0.224, 0.229 };
for (int i = 0; i < image_area; ++i, pimage += 3) {
// 注意这里的顺序rgb调换了
*phost_r++ = pimage[0] / 255.; // 将图片中的像素点进行减去均值除方差,并赋值给input
*phost_g++ = pimage[1] / 255.;
*phost_b++ = pimage[2] / 255.;
}
// 5、执行预测
infer_request.infer();
// 6、推理结果
auto output = infer_request.get_output_tensor(0);
// 对输出结果处理
float* prob = output.data<float>();
const int num_classes = 2; // 种类
int predict_label = std::max_element(prob, prob + num_classes) - prob; // 确定预测类别的下标
std::string label;
if (predict_label == 0)
label = "cat";
else
label = "dog";
float confidence = prob[predict_label]; // 获得预测值的置信度
printf("confidence = %f, label = %s\n", confidence, label);
endTime = clock();//计时结束
std::cout << "total推理时间: " << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << std::endl;
return 0;
}
四、运行结果