部署OpenVINO
Windows
- 第 1 步: 在Pycharm终端键入以下命令行即可
bash
pip install openvino-dev转化模型格式
将.pt文件转化为.onnx文件
py
from ultralytics import YOLO
model = YOLO('yolov12n.pt')
model.export(format="onnx", half=True) # or format="onnx"将.onnx文件转为.xml和.bin
py
from openvino import convert_model, save_model
import os
# 指定您的 ONNX 模型路径
onnx_model_path = 'E:/project/yolov12/yolov12n.onnx'
# 指定您想要保存 OpenVINO IR 模型的输出路径(包括文件名)
output_path = 'E:/project/yolov12/openvino/yolov12n.xml'
# 如果输出目录不存在,尝试创建它
output_dir = os.path.dirname(output_path)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
try:
# 使用 convert_model 函数进行转换
ov_model = convert_model(onnx_model_path)
# 保存模型
save_model(ov_model, output_path)
print(f"ONNX 模型已成功转换为 OpenVINO IR 格式,保存在: {output_path} 和相应的 .bin 文件")
except Exception as e:
print(f"转换过程中发生错误:{e}")Ubuntu22.04
- 第 1 步:下载 GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB。您也可以使用以下命令
bash
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB- 第 2 步:将此密钥添加到系统密钥环。
bash
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB- 第 3 步:通过以下命令添加存储库。
bash
# Ubuntu 20
echo "deb https://apt.repos.intel.com/openvino/2025 ubuntu20 main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2025.listbash
# Ubuntu 22
echo "deb https://apt.repos.intel.com/openvino/2025 ubuntu22 main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2025.listbash
# Ubuntu 24
echo "deb https://apt.repos.intel.com/openvino/2025 ubuntu24 main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2025.list- 第 4 步:使用更新命令更新软件包列表。
bash
sudo apt update- 第 5 步:验证 APT 存储库的设置是否正确。使用 apt-cache 命令查看包含所有可用 OpenVINO 程序包和组件的列表
bash
apt-cache search openvino- 第 6 步:安装 OpenVINO 运行时。
bash
sudo apt install openvino-2025.0.0验证测试
点击查看项目结构
bash
├── build
├── CMakeLists.txt
├── config
│ ├── bus.jpg
│ ├── yolov12n.bin
│ └── yolov12n.xml
├── include
└── src
└── infer_image.cpp点击查看CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.10)
project(yolov12_inference)
find_package(OpenCV REQUIRED)
message(STATUS "Found OpenCV library: ${OpenCV_VERSION}")
find_package(OpenVINO REQUIRED)
file(GLOB_RECURSE YOLO_SOURCE_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
)
add_executable(${PROJECT_NAME} ${YOLO_SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} PUBLIC
${OpenCV_LIBS}
${OpenVINO_LIBRARIES}
openvino::frontend::onnx
openvino::runtime
openvino::frontend::tensorflow_lite
)点击查看.cpp 测试代码
cpp
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <openvino/openvino.hpp>
int main() {
// 指定 OpenVINO IR 模型的路径
std::string model_path = "../config/yolov12n.xml";
std::string weights_path = "../config/yolov12n.bin";
// 指定要识别的图片路径
std::string image_path = "../config/bus.jpg";
try {
// 1. 创建 OpenVINO Core 对象
ov::Core core;
// 2. 读取模型
auto model = core.read_model(model_path, weights_path);
// 3. 获取模型的输入端口
auto input_port = model->inputs().front();
ov::Shape input_shape = input_port.get_shape();
// 4. 编译模型到设备 (这里使用 CPU,您可以根据需要更改为 "GPU")
auto compiled_model = core.compile_model(model, "CPU");
// 5. 创建推理请求
auto infer_request = compiled_model.create_infer_request();
// 6. 使用 OpenCV 读取图片
cv::Mat image = cv::imread(image_path);
if (image.empty()) {
std::cerr << "Error: Could not open the image: " << image_path << std::endl;
return 1;
}
// 7. 预处理图像
cv::Mat resized_image;
cv::resize(image, resized_image, cv::Size(input_shape[3], input_shape[2]));
cv::Mat blob;
cv::dnn::blobFromImage(resized_image, blob, 1.0 / 255.0, cv::Size(), cv::Scalar(), true, false);
// 8. 设置输入数据到推理请求
ov::Tensor input_tensor(input_port.get_element_type(), input_shape, blob.ptr());
infer_request.set_input_tensor(input_tensor);
// 9. 执行推理
infer_request.infer();
// 10. 获取输出结果
const ov::Tensor& output_tensor = infer_request.get_output_tensor();
const float* output_data = output_tensor.data<const float>();
// 11. 后处理输出结果 (您需要根据您的 YOLOv12 模型实现这部分)
std::cout << "Inference Results (first 100 elements):" << std::endl;
size_t output_size = output_tensor.get_size();
for (size_t i = 0; i < std::min((size_t)100, output_size); ++i) {
std::cout << output_data[i] << " ";
}
std::cout << std::endl;
if(!resized_image.empty())cv::imshow("123", resized_image);
else std::cout<<1<<std::endl;
cv::waitKey(0);
} catch (const std::exception& error) {
std::cerr << "Error occurred: " << error.what() << std::endl;
return 1;
}
return 0;
}