[C#]winform使用纯opencvsharp部署yolox-onnx模型

2024-01-10 10:41:08

【官方框架地址】

https://github.com/Megvii-BaseDetection/YOLOX
【算法介绍】

YOLOX是一个高性能的目标检测算法,它是基于YOLO(You Only Look Once)系列算法的Anchor? Free版本。YOLOX由Megvii Technology的研究团队开发,并在2021年推出。该算法在保持YOLO系列原有速度与精度优势的同时,引入了新的改进和创新点,使得在各种规模的数据集上都能取得卓越的性能。

### YOLOX的主要特点

#### 锚框(Anchor boxes)的去除
YOLOX摒弃了传统的锚框机制。锚框是一种预设的框,用于在训练初期引导模型识别物体的大致位置和尺寸。但锚框也存在局限性,比如需要手动设计、可能引入先验偏差等。YOLOX通过引入anchor-free的机制,直接预测目标的中心点和宽高,从而减少了对先验知识的依赖,简化了算法结构。

#### 解耦头(Decoupled head)
YOLOX采用解耦头设计,将分类和回归两个任务分开处理。这种设计有助于专门化网络的每个部分以处理不同的任务,从而提高整体性能。

#### 强化数据增强(Strong data augmentation)
为了提高模型的泛化能力,YOLOX采用了包括Mosaic和MixUp在内的多种强化数据增强策略。这些策略可以有效扩充数据集,增加模型训练时的样本多样性,进而提高模型对各种变化的适应能力。

#### 支持多尺度训练
YOLOX支持在不同尺寸的图片上进行训练,这意味着模型可以适应各种分辨率的输入,增强了模型的鲁棒性和适应性。

#### SimOTA标签分配策略
YOLOX引入了一种新的标签分配策略SimOTA,用于在训练过程中更高效地分配正负样本。这种策略可以自动调整与不同检测框关联的目标数量,从而优化训练过程。

#### 模型剪枝和量化
YOLOX还考虑了模型部署的需求,提供了模型剪枝和量化的方案,用以减少模型的大小和提高推理速度,使其更适合在移动或边缘计算设备上运行。

### YOLOX与其他YOLO版本的比较

YOLOX不仅继承了YOLOv4的优点,并且结合了YOLOv3和YOLOv5的一些特性。YOLOX相对于YOLOv4,在速度和精度上都有显著提升,同时也具有更好的扩展性。与YOLOv5相比,YOLOX在开放测试集上通常能够实现更高的精确度和更快的速度。

### 应用场景

YOLOX的高速度和高精度特性使其非常适合用于实时视频分析、自动驾驶、无人机监视、工业自动化检测等多个领域。它可以快速地在视频流中检测出多个目标和分类,满足对实时性要求较高的应用场景。

### 开源与社区

YOLOX是一个开源项目,代码和预训练模型可以在GitHub上找到。它的开源特性吸引了全球的开发者和研究者参与贡献,使得YOLOX能够持续进化和改进。

综合来看,YOLOX是一个强大的目标检测算法,它在YOLO家族中脱颖而出,不断突破目标检测的边界。其创新的设计和优异的性能使得YOLOX在计算机视觉领域有着广泛的应用前景。

【效果展示】


【实现部分代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;

namespace FIRC
{
    public partial class Form1 : Form
    {
        Mat src = new Mat();
        YoloxManager detector = new YoloxManager();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";
            openFileDialog.RestoreDirectory = true;
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
              
                src = Cv2.ImRead(openFileDialog.FileName);

                pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);


            }


        }

        private void button2_Click(object sender, EventArgs e)
        {
            if(pictureBox1.Image==null)
            {
                return;
            }

            var result = detector.Inference(src);
            var resultMat = detector.DrawImage(result,src);
            pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat); //Mat转Bitmap
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            detector.LoadWeights(Application.StartupPath+"\\weights\\yolox_s.onnx", Application.StartupPath + "\\weights\\coco.names");
        }

        private void button3_Click(object sender, EventArgs e)
        {
     
       
        }
    }
}


【视频演示】

https://www.bilibili.com/video/BV1V5411i7Zz/
【源码下载】

https://download.csdn.net/download/FL1623863129/88723523
【测试环境】

vs2019

netframework4.7.2

opencvsharp4.8.0

文章来源:https://blog.csdn.net/FL1623863129/article/details/135494595
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。