# YOLO11-OpenVINO™ 实例分割

点击蓝字

关注我们,让开发变得更有趣

OpenVINO™

OpenVINO™ 2025 C#支持

开源的支持项目来自颜国进老师贡献,已经被 OpenVINO™ 官方收录,项目网址:

https://gitee.com/linbei_cht/OpenVINO-CSharp-API

安装非常容易,只要在 VS2022 里面点击一下即可安装。最新版本已经是 OpenVINO™ 2025 支持。

OpenVINO™

YOLO11实例分割

YOLO11 是 YOLOv5 跟 YOLOv8 作者推出最新升级版本模型,支持分类、检测、分割、姿态评估、OBB。这里以 YOLO11 实例分割模型为例,演示 OpenVINO™ C# 如何运行,YOLO11-seg 模型的输入与输出。

代码是我在 OpenVINO-CSharp-API 作者开源的 YOLOv8 对象检测的代码基础上修改而成。调用检测代码如下:

public void Detect(){    // Set the video path and model path    string video_path = "D:/images/video/play_scoers.mp4";    string model_path = "D:/python/yolov5-7.0/yolo11n-seg.onnx";    // Create a new Core object and read the model    Core core = new Core();    Model model = core.read_model(model_path);    CompiledModel compiled_model = core.compile_model(model, "GPU");    // Create a list of InferRequest objects    Listrequests = new List{ compiled_model.create_infer_request(), compiled_model.create_infer_request() };    // Create a new VideoCapture object and read the video    VideoCapture capture = new VideoCapture(video_path);    if (!capture.IsOpened())    {        Console.WriteLine("Error: Video not found!");        return;    }    Mat frame = new Mat();    Mat next_frame = new Mat();    capture.Read(frame);    float scale = 0.0f;    float[] input_data = preprocess(frame, out scale);    requests[0].get_input_tensor().set_data(input_data);    requests[0].start_async();    Stopwatch sw = new Stopwatch();    float[] total_infs = new float[3];    ListclassList = File.ReadAllLines("D:/python/yolov5-7.0/classes.txt").Select(line => line.Trim()).ToList();    while (true)    {        if (!capture.Read(next_frame))        {            break;        }        sw.Restart();        input_data = preprocess(frame, out scale);        requests[1].get_input_tensor().set_data(input_data);        requests[1].start_async();        requests[0].wait();        float[] det_data = requests[0].get_tensor("output0").get_data<float>(8400 * 116);        float[] seg_data = requests[0].get_tensor("output1").get_data<float>(32 * 160*160);        Mat rgb_mask = new Mat(frame.Size(), frame.Type());        DetResult result = postprocess(det_data, seg_data, scale, rgb_mask);        sw.Stop();        total_infs[0] = sw.ElapsedMilliseconds;        Cv2.PutText(frame, "Inference: " + (1000.0 / total_infs[0]).ToString("0.00") + "FPS " + (total_infs[0]).ToString("0.00") + "ms", new OpenCvSharp.Point(20, 40), HersheyFonts.HersheyPlain, 2, new Scalar(255, 0, 255), 2);        result.update_lable(classList);        Visualize.draw_det_result(result, frame);        Cv2.AddWeighted(frame, 0.5, rgb_mask, 0.5, 0, frame);        Cv2.ImShow("C# YOLO11-OpenVINO-Seg演示 - OpenCV学堂", frame);        // Press 'ESC' to exit the program        if (Cv2.WaitKey(1) == 27)        {            break;        }        swap(requests);        frame = next_frame;        rgb_mask.Release();    }}

运行结果如下:

OpenVINO™

后处理实现细节

这个实现最大的坑在后处理部分,要基于全局编码信息乘以每个检测 BOX 区域的编码信息,才可以解码得到每个 BOX 对象的掩膜。实现的代码如下:

Mat roi_mask = roi_masks[index];Mat m = roi_mask * mask_info;for (int col = 0; col < m.Cols; col++){    m.At<float>(0, col) = sigmoid_function(m.At<float>(0, col));}

最后根据得到掩膜直接设置 BOX 区域的颜色即可,代码如下:

rgb_mask[box].SetTo(new Scalar(0, 0, 255), box_m);re.add(classIds[index], confidences[index], positionBoxes[index]);

然后把得到 RGB 彩色掩膜图像跟 BOX 框绘制图像相加记得到最终输出结果图像。

OpenVINO™

---------------------------------------

*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.

-----------------------------

 OpenVINO 中文社区 

微信号 : openvinodev

B站:OpenVINO中文社区

“开放、开源、共创”

致力于通过定期举办线上与线下的沙龙、动手实践及开发者交流大会等活动,促进人工智能开发者之间的交流学习。

○ 点击 “ 在看 ”,让更多人看见

###YOLO11-CLS 模型转换和部署到 OpenVINO 框架中的方法 为了将 YOLO11-CLS 模型转换并部署到 OpenVINO 框架中,需要遵循以下关键步骤和工具支持。以下是详细的说明: #### 1. 模型转换为 IR 格式 OpenVINO 使用中间表示(Intermediate Representation, IR)格式来存储模型。YOLO11-CLS 模型可以通过 Model Optimizer 工具转换为 IR 格式。参考提供的代码示例[^2],可以使用以下 Python 脚本完成模型转换: ```python from ultralytics import YOLO # 加载预训练的 YOLO11-CLS 模型 model = YOLO(r".\best.pt") # 导出模型为 OpenVINO 格式 model.export(format="openvino", imgsz=(640, 640), dynamic=False, simplify=True, opset=13) ``` 上述脚本通过 `ultralytics` 库加载 `.pt` 格式的模型,并将其导出为 OpenVINO 支持的格式。参数解释如下: - `imgsz=(640, 640)`:指定输入图像的尺寸。 - `dynamic=False`:禁用动态形状支持。 - `simplify=True`:简化模型结构以提高推理效率。 - `opset=13`:指定 ONNX 的操作集版本。 #### 2. 部署模型到 OpenVINO 完成模型转换后,可以使用 OpenVINO 的推理引擎进行模型部署。以下是一个简单的 C++ 示例代码[^4],展示如何加载和运行 IR 格式的模型: ```cpp #include <openvino/openvino.hpp> #include <iostream> int main() { try { // 初始化 OpenVINO 推理核心 ov::Core ie; // 读取 IR 模型文件 std::string xml_path = "path_to_your_model.xml"; // 替换为实际路径 std::string bin_path = "path_to_your_model.bin"; // 替换为实际路径 ov::Model model = ie.read_model(xml_path); // 编译模型到目标设备(例如 CPU) ov::CompiledModel compiled_model = ie.compile_model(model, "CPU"); // 获取输入输出端口 ov::InferRequest infer_request = compiled_model.create_infer_request(); const ov::OutputVector& outputs = compiled_model.outputs(); // 假设输入数据已准备好 ov::Tensor input_tensor = infer_request.get_input_tensor(0); // 设置输入张量的数据... // 执行推理 infer_request.infer(); // 获取输出结果 for (size_t i = 0; i < outputs.size(); ++i) { ov::Tensor output_tensor = infer_request.get_output_tensor(i); // 处理输出张量的数据... } } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; return 1; } return 0; } ``` 此代码展示了如何加载 IR 模型、设置输入数据、执行推理以及处理输出结果。开发者可以根据具体需求调整输入输出的处理逻辑。 #### 3. 性能优化 为了进一步提升模型在 OpenVINO 上的推理性能,可以考虑以下优化策略: - **量化**:使用 OpenVINO 的 Post-Training Optimization Tool (POT) 对模型进行量化,从而减少计算资源消耗[^3]。 - **硬件加速**:根据目标硬件选择合适的设备(如 GPU、VPU 或 FPGA),并通过 OpenVINO 提供的 API 进行配置。 - **批处理**:对于批量推理任务,可以调整输入张量的批量大小以充分利用硬件资源。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值