Framework工程师必备操作:C++ open()和read()函数使用

对于Framework工程师来说,必要C或者C++编程能力是必须的,像对设备节点的操作是最基本的操作,那么我们便会用到open和read函数。open()函数用于打开文件,而read()函数用于从打开的文件中读取数据。

1. open() 函数

open()函数是C/C++标准库中的一个POSIX标准函数,用于打开一个文件并返回一个文件描述符(File Descriptor),以供后续的读写操作。其函数声明如下:

#include <fcntl.h>
int open(const char* path, int flags, mode_t mode);
  • path:要打开或创建的目标文件名。
  • flags:对文件进行多种操作的模式,如O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)、O_CREAT(若文件不存在,创建文件)等。
  • mode:新文件的访问权限,通常使用权限掩码如S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH。
    如果打开文件成功,open()返回一个文件描述符;如果失败,返回-1,并设置errno以指示错误原因‌12。

2. read() 函数

read()函数用于从打开的文件描述符中读取数据。其函数声明如下:

#include <unistd.h>
ssize_t read(int fd, void* buf, size_t count);
  • fd:文件描述符,由open()函数返回。
  • buf:指向用于存储读取数据的缓冲区的指针。
  • count:要读取的字节数。
    如果读取成功,read()返回实际读取的字节数;如果遇到文件结束或发生错误,返回-1,并设置errno以指示错误原因‌23。
    示例代码
    以下是一个简单的示例,展示如何使用open()和read()函数读取文件:
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
    const char* filePath = "input.txt";
    int fd = open(filePath, O_RDONLY); // 以只读模式打开文件
    if (fd < 0) {
        perror("Failed to open file");
        return -1;
    }
    char buffer[1024]; // 定义一个缓冲区用于存储读取的数据
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer)); // 从文件中读取数据到缓冲区
    if (bytesRead < 0) { // 如果读取失败或遇到文件结束符EOF
        perror("Failed to read file");
        close(fd); // 关闭文件描述符
        return -1;
    }
    printf("Read %ld bytes from file: %s\n", bytesRead, buffer); // 打印读取的内容和字节数
    close(fd); // 关闭文件描述符
    return 0;
}
<think>我们正在配置Windows下使用C++OpenVINO进行推理的开发环境。以下是完整步骤: ### 一、环境准备 1. **系统要求**: - Windows 10/11 64位 - Visual Studio 2019/2022 - CMake 3.14+ 2. **安装OpenVINO**: - 从[官网下载](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html) Windows版 - 运行安装程序,默认路径:`C:\Program Files (x86)\Intel\openvino_2023.1` - 创建符号链接(管理员权限): ```powershell cd "C:\Program Files (x86)\Intel" mklink /D openvino_2023 openvino_2023.1.0.12185 ``` 3. **配置环境变量**: ```powershell # 永久设置 [System.Environment]::SetEnvironmentVariable('INTEL_OPENVINO_DIR', 'C:\Program Files (x86)\Intel\openvino_2023', [System.EnvironmentVariableTarget]::Machine) ``` ### 二、项目配置(Visual Studio) 1. **创建CMake项目**: ```cmake cmake_minimum_required(VERSION 3.15) project(OpenVINO_Demo) # 查找OpenVINO find_package(OpenVINO REQUIRED) add_executable(main main.cpp) target_link_libraries(main OpenVINO::runtime) ``` 2. **手动配置(无CMake)**: - **包含目录**: ``` C:\Program Files (x86)\Intel\openvino_2023\runtime\include ``` - **库目录**: ``` C:\Program Files (x86)\Intel\openvino_2023\runtime\lib\intel64\Release ``` - **附加依赖项**: ``` openvino_c.lib;openvino_onnx_frontend.lib ``` ### 三、推理代码实现 `main.cpp` 示例: ```cpp #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> int main() { // 1. 初始化OpenVINO核心 ov::Core core; // 2. 加载模型 std::shared_ptr<ov::Model> model = core.read_model("model.xml", "model.bin"); // 3. 配置输入输出 ov::preprocess::PrePostProcessor ppp(model); ppp.input().tensor() .set_layout("NHWC") .set_element_type(ov::element::u8); ppp.input().preprocess().convert_layout("NCHW"); model = ppp.build(); // 4. 编译模型 ov::CompiledModel compiled_model = core.compile_model(model, "CPU"); // 5. 创建推理请求 ov::InferRequest infer_request = compiled_model.create_infer_request(); // 6. 准备输入数据 cv::Mat image = cv::imread("test.jpg"); ov::Tensor input_tensor = infer_request.get_input_tensor(); // 将OpenCV图像数据拷贝到张量(需考虑数据格式转换) // ... // 7. 推理 infer_request.infer(); // 8. 获取输出 ov::Tensor output_tensor = infer_request.get_output_tensor(); float* detections = output_tensor.data<float>(); // 9. 后处理 // ... return 0; } ``` ### 四、模型转换(PyTorch→OpenVINO) ```python from openvino.tools import mo from openvino.runtime import serialize # 转换ONNX模型 onnx_model = mo.convert_model( "yolov8n.onnx", framework="onnx", compress_to_fp16=True # FP16量化 ) # 保存为IR格式 serialize(onnx_model, "model.xml", "model.bin") ``` ### 五、部署优化 1. **硬件加速**: ```cpp // 指定推理设备 compiled_model = core.compile_model(model, "GPU.1"); // 使用iGPU // 或使用多设备 compiled_model = core.compile_model(model, "CPU,GPU", ...); ``` 2. **异步推理**: ```cpp infer_request.start_async(); infer_request.wait(); ``` ### 六、完整示例:YOLOv8目标检测 ```cpp // 后处理代码示例(简化版) void postprocess(ov::Tensor& output, cv::Mat& image) { const float* data = output.data<float>(); int out_h = output.get_shape()[2]; int out_w = output.get_shape()[3]; for (int i = 0; i < out_h; ++i) { float confidence = data[4]; if (confidence > 0.5) { int cx = data[0] * image.cols; int cy = data[1] * image.rows; int w = data[2] * image.cols; int h = data[3] * image.rows; cv::rectangle(image, cv::Rect(cx-w/2, cy-h/2, w, h), cv::Scalar(0,255,0), 2); } data += out_w; // 移动到下一行 } } ``` ### 七、常见问题解决 1. **DLL缺失错误**: - 将`C:\Program Files (x86)\Intel\openvino_2023\runtime\bin\intel64\Release`加入系统PATH 2. **模型转换错误**: ```python # 添加输入形状 onnx_model = mo.convert_model( "model.onnx", input_shape=[1,3,640,640] ) ``` 3. **性能调优**: ```cpp // 设置推理线程数 core.set_property("CPU", {{"INFERENCE_NUM_THREADS", "8"}}); ``` > 注:在Intel i7-12700H上,YOLOv8n的推理速度可达**15ms/帧**(FP16精度)[^2] ### 八、进阶功能 1. **模型量化**: ```python from openvino.tools.pot import quantize, create_config config = create_config("AccuracyAwareQuantization") quantized_model = quantize(model=onnx_model, config=config) ``` 2. **动态形状支持**: ```cpp model->reshape({{ov::Dimension(), 3, ov::Dimension(320,800), ov::Dimension(320,800)}}); ``` §§相关问题§§ 1. 如何在OpenVINO中实现多模型级联推理? 2. OpenVINO异步推理接口如何避免数据竞争? 3. 如何利用OpenVINO实现模型INT8量化? 4. 不同硬件平台(CPU/iGPU/VPU)的性能对比?</think>以下是在Windows系统下使用C++结合OpenVINO进行推理开发的完整指南,包含环境配置、部署流程、代码实现及示例: ### 一、开发环境配置 #### 1. 系统要求 - Windows 10/11 64位 - Visual Studio 2019/2022 - CMake 3.14+ #### 2. OpenVINO安装 1. **下载安装包**: - 从[Intel官网](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html)下载Windows版OpenVINO - 推荐版本:2023.1 LTS 2. **安装步骤**: ```powershell # 运行安装程序(管理员权限) openvino_installer.exe --install-path "C:\Intel\openvino_2023" # 设置环境变量 [System.Environment]::SetEnvironmentVariable('INTEL_OPENVINO_DIR', 'C:\Intel\openvino_2023', [System.EnvironmentVariableTarget]::Machine) ``` 安装路径说明: - 管理员安装:`C:\Intel\openvino_2023` - 用户安装:`C:\Users\<用户名>\Intel\openvino_2023`[^1] 3. **验证安装**: ```powershell cd C:\Intel\openvino_2023\samples\cpp build_samples.bat # 运行示例 .\classification_sample\Release\classification_sample.exe ``` #### 3. 依赖库安装 ```powershell # OpenCV(必须) pip install opencv-python # ONNX Runtime(可选) pip install onnxruntime ``` ### 二、项目配置(Visual Studio) #### 1. 包含目录设置 ``` C:\Intel\openvino_2023\runtime\include C:\Intel\openvino_2023\runtime\include\ie C:\Intel\openvino_2023\opencv\include ``` #### 2. 库目录设置 ``` C:\Intel\openvino_2023\runtime\lib\intel64\Release C:\Intel\openvino_2023\opencv\lib ``` #### 3. 链接库配置 ``` openvino_c.lib opencv_world452.lib ``` ### 三、模型部署流程 #### 1. 模型转换(PyTorch→ONNX→IR) ```python import torch from openvino.tools import mo # PyTorch转ONNX torch.onnx.export(model, dummy_input, "model.onnx") # ONNX转OpenVINO IR onnx_model = mo.convert_model( "model.onnx", compress_to_fp16=True, # FP16量化 input_shape=[1,3,640,640] ) ``` #### 2. 模型优化(FP16量化) ```powershell mo --input_model model.onnx --data_type FP16 --output_dir ir_model --model_name optimized ``` ### 四、C++推理代码实现 #### 1. 基础推理框架(main.cpp) ```cpp #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> int main() { // 1. 初始化OpenVINO核心 ov::Core core; // 2. 加载模型 std::shared_ptr<ov::Model> model = core.read_model("model.xml"); // 3. 配置输入输出 ov::preprocess::PrePostProcessor ppp(model); ppp.input().tensor() .set_layout("NHWC") .set_element_type(ov::element::u8); ppp.input().model().set_layout("NCHW"); model = ppp.build(); // 4. 编译模型 ov::CompiledModel compiled_model = core.compile_model(model, "CPU"); // 5. 创建推理请求 ov::InferRequest infer_request = compiled_model.create_infer_request(); // 6. 准备输入数据 cv::Mat image = cv::imread("test.jpg"); ov::Tensor input_tensor = infer_request.get_input_tensor(); // 将OpenCV数据拷贝到张量... // 7. 执行推理 infer_request.infer(); // 8. 处理输出 ov::Tensor output_tensor = infer_request.get_output_tensor(); const float* detections = output_tensor.data<const float>(); // 9. 后处理 // ... return 0; } ``` #### 2. 图像预处理函数 ```cpp void prepare_input(cv::Mat& img, ov::Tensor& input_tensor) { // 调整大小 cv::resize(img, img, cv::Size(640, 640)); // 转换为RGB并归一化 cv::cvtColor(img, img, cv::COLOR_BGR2RGB); img.convertTo(img, CV_32F, 1/255.0); // 拷贝到张量 float* tensor_data = input_tensor.data<float>(); for (int c = 0; c < 3; ++c) { for (int h = 0; h < 640; ++h) { for (int w = 0; w < 640; ++w) { tensor_data[c*640*640 + h*640 + w] = img.at<cv::Vec3f>(h,w)[c]; } } } } ``` #### 3. CMake配置示例 ```cmake cmake_minimum_required(VERSION 3.10) project(OpenVINO_Demo) # 查找OpenVINO find_package(OpenVINO REQUIRED) add_executable(main main.cpp) target_link_libraries(main openvino::runtime opencv_core opencv_imgproc opencv_highgui ) ``` ### 五、部署优化技巧 #### 1. 硬件加速配置 ```cpp // 使用iGPU加速 ov::CompiledModel compiled_model = core.compile_model( model, "GPU", ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT) ); // 使用多设备并行 ov::CompiledModel compiled_model = core.compile_model( model, "CPU,GPU", ov::device::priorities("GPU", "CPU") ); ``` #### 2. 异步推理 ```cpp // 启动异步推理 infer_request.start_async(); // 等待结果 if (infer_request.wait_for(std::chrono::milliseconds(10)) == std::future_status::ready) { ov::Tensor output = infer_request.get_output_tensor(); } ``` ### 六、完整示例:YOLOv8目标检测 ```cpp #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> int main() { // 初始化 ov::Core core; auto model = core.read_model("yolov8n.xml"); // 配置预处理 ov::preprocess::PrePostProcessor ppp(model); ppp.input().tensor() .set_layout("NHWC") .set_element_type(ov::element::u8); ppp.input().model().set_layout("NCHW"); model = ppp.build(); // 编译模型 auto compiled_model = core.compile_model(model, "GPU"); auto infer_request = compiled_model.create_infer_request(); // 加载图像 cv::Mat img = cv::imread("demo.jpg"); cv::cvtColor(img, img, cv::COLOR_BGR2RGB); // 准备输入张量 auto input_tensor = infer_request.get_input_tensor(); prepare_input(img, input_tensor); // 自定义预处理函数 // 推理 infer_request.infer(); // 获取输出 auto output_tensor = infer_request.get_output_tensor(); const float* detections = output_tensor.data<const float>(); // 后处理 process_output(detections, img); // 自定义后处理 // 显示结果 cv::imshow("Detection", img); cv::waitKey(0); return 0; } ``` ### 七、性能优化建议 1. **模型量化**: ```powershell mo --input_model model.onnx --data_type FP16 # FP16加速 --output_dir optimized ``` 2. **缓存编译**(首次运行后加速): ```cpp core.set_property("GPU", {{"CACHE_DIR", "./cache"}}); ``` 3. **输入/输出固定**: ```cpp infer_request.set_input_tensor(input_tensor); infer_request.set_output_tensor(output_tensor); ``` > 注:在Intel i7-12700H上,YOLOv8n的推理速度可达**15ms/帧**(FP16精度)[^2] ### 八、常见问题解决 1. **DLL缺失错误**: - 将`C:\Intel\openvino_2023\runtime\bin\intel64\Release`加入系统PATH 2. **模型转换错误**: ```python # 添加输入形状 onnx_model = mo.convert_model( "model.onnx", input_shape=[1,3,640,640] ) ``` 3. **内存不足**: ```cpp // 设置推理线程数 core.set_property("CPU", {{"INFERENCE_NUM_THREADS", "4"}}); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值