将yolov8权重文件转为onnx格式并在c#中使用

from ultralytics import YOLO
import tkinter as tk
from tkinter import filedialog

def open_file_dialog():
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口

    file_path = filedialog.askopenfilename()  # 打开文件选择对话框

    return file_path

pt_path=open_file_dialog()

# Load the YOLOv8 model
model = YOLO(pt_path)

# Export the model to ONNX format
model.export(format="onnx")  # creates 'yolov8n.onnx'

 yolov8权重文件转为onnx格式

训练模型的.pt权重文件转换为onnx格式只需要使用ultralytics库中的YOLO类,使用pip安装ultralytics库,然后执行上面python代码。在c#中没办法直接转换。

C#中使用ONNX

创建一个.NET项目,在Nuget中下载Yolov8.Net

读取onnx模型

OpenFileDialog opnDlg = new OpenFileDialog();
opnDlg.Filter = "模型文件 | *.onnx";
opnDlg.Title = "打开模型文件";
opnDlg.ShowHelp = true;
opnDlg.Multiselect = false;
opnDlg.RestoreDirectory = true;

if (opnDlg.ShowDialog() == DialogResult.OK)
{
    string filename = opnDlg.FileName;
    //加载模型
    try
    {
        yolov8 = YoloV8Predictor.Create(filename, mylabel);
        if (yolov8 != null)
        {
            MessageBox.Show("模型加载成功\r\n");
        }
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

读取图片

OpenFileDialog dialog = new OpenFileDialog();
//dialog.Multiselect = true;//该值确定是否可以选择多个文件
dialog.Title = "请选择文件";
dialog.Filter = "图像文件(*.jpg;*.jpeg;*.bmp)|*.jpg;*.jpeg;*.bmp";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    string file = dialog.FileName;
    textBox1.Text = file;

    HOperatorSet.ReadImage(out ho_ModelImage1, file);
    showImage();
    showyolov8(dialog);
    
}

使用模型预测,显示的窗口使用了halcon库。

string imgpath = dialog.FileName;
System.Drawing.Image image = System.Drawing.Image.FromFile(imgpath);
ho_ModelImage1.Dispose();
//图像预测
var predictions = yolov8.Predict(image);

var filteredPredictions = predictions.Where(pred => pred.Score >= minConfidence);

foreach (var pred in filteredPredictions)
{
    var originalImageHeight = image.Height;
    var originalImageWidth = image.Width;

    var x = Math.Max(pred.Rectangle.X, 0);
    var y = Math.Max(pred.Rectangle.Y, 0);
    var width = Math.Min(originalImageWidth - x, pred.Rectangle.Width);
    var height = Math.Min(originalImageHeight - y, pred.Rectangle.Height);
    // 创建一个矩形
    HRegion rectangle = new HRegion();
    rectangle.GenRectangle1(new HTuple(y), new HTuple(x), new HTuple(y + height), new HTuple(x + width));
    //MessageBox.Show(x.ToString()+y.ToString()+ width.ToString() + height.ToString());
    //MessageBox.Show(width.ToString()+height.ToString());
    // 显示矩形
    hWindowControl1.HalconWindow.SetDraw("margin");
    hWindowControl1.HalconWindow.DispObj(rectangle);
    string text = $"{pred.Label?.Name} [{pred.Score}]";
    HOperatorSet.SetTposition(hWindowControl1.HalconWindow, y, x);
    HOperatorSet.WriteString(hWindowControl1.HalconWindow, text);

    // MessageBox.Show(text);

}
image.Dispose();

 最后,本人也是一个小白,第一次发文,后续也会继续更新一些我学习中觉得难题的文章,如果有错误的地方请大家指出,我一定改正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值