目录
1、环境配置
1.1、Yolov8源码下载
1.2、Yolov8源码所需的python环境安装
1.3、安装cuda和pytorch(后续只用CPU进行训练的话可以跳过,注意1.3和1.4的安装顺序不能换,即torch安装要在依赖包安装之前)
1.4、Yolov8源码所需的依赖包安装
1.5、检验Yolov8是否能正常运行
2、模型训练
2.1、数据集准备
2.2、训练模型
2.3、验证训练好的模型(这步一般是写论文出数据用的,没需求可以不用验证)
2.4、使用训练好的模型
3、C#部署
3.1、将.pt文件导出为.onnx文件
3.2、用C#从零编写Yolov8目标检测的窗体demo程序
3.2.1、用.NET6.0框架编写窗体程序的步骤
3.2.2、C#部署Yolov8进行自己所需的目标识别的配置以及demo程
教程开始之前,请确保安装好Anacaonda和Pycharm。直接在官网下载安装就好,由于下载安装的过程比较简单,本教程不详细阐述。
1、环境配置
1.1、Yolov8源码下载
Yolov8源码官网下载地址:https://github.com/ultralytics/ultralytics
点击链接后,进入以下界面,可点击“Code”→“ Download ZIP”下载Yolov8源码。

解压后进入解压后的文件路径,如下图所示,即Yolov8的工程文件中。输入“cmd”,进入下图所示的命令行界面。


1.2、Yolov8源码所需的python环境安装
(在此之前,确保电脑下载安装好Anaconda)
下载Python解释器,创建Python的虚拟环境:在命令行界面中输入“conda create -n py39_19_ultralytics python==3.9.19”并按ENTER键执行,如下图所示。

如下图所示,创建虚拟环境的过程中卡在“Proceed ([y]/n)?”,直接按下ENTER键就行。

安装完成后,激活安装好的虚拟环境:如下图所示,输入“conda activate py39_19_ultralytics”并按ENTER键执行,出现“(py39_19_ultralytics)”表示激活成功,当前正处于py39_19_ultralytics的虚拟环境下。

下一步是在这个Python的虚拟环境中安装Yolov8需要的各种依赖包,在下载各种包之前,为了防止下载速度慢甚至直接卡住,可以先切换一下中科大提供的国内镜像源:直接复制以下内容粘贴到命令行,则会自动执行切换源的指令。
conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
切换了镜像源之后就可以在这个Python的虚拟环境中安装Yolov8需要的torch和各种依赖包。
1.3、安装cuda和pytorch(后续只用CPU进行训练的话可以跳过,注意1.3和1.4的安装顺序不能换,即torch安装要在依赖包安装之前)
如果要用GPU进行训练的话,还需要正确安装cuda和pytorch。
在安装之前,先查看是不是已经安装好了torch,因为“requirements.txt”文件中包含了torch,上一步安装依赖包的时候已经装了一个版本。具体操作为在命令行中输入“pip show torch”,如果有torch的版本等相关信息输出,说明已经装了一个版本,我们可以用“pip uninstall torch”命令把它卸载了(因为这个torch大概率不是我们需要的GPU版本的torch,需要自己重装过),卸载完成后再用“pip show torch”命令就可以查看有没有卸载成功,没有torch的信息输出就说明卸载成功了。
在安装cuda和pytorch之前,一定要先全部确认完要安装的版本。
先确定要安装的cuda的版本:用“nvidia-smi”命令查看电脑的GPU支持的cuda的版本,如下图所示,这里是“12.7”,意思是支持版本等于或低于12.7版本的cuda,建议安装的时候选择小于12.7版本的cuda,例如“12.1”。

确定了cuda版本后先不要安装,要先确认要安装的pytorch版本,因为pytorch不一定支持所有版本的cuda。
确定要安装的pytorch版本,可进入官网Previous PyTorch Versions | PyTorch,选择一个版本的torch版本,如下图所示,这里选择2.2.0版本的torch,注意一定要选择有“# CUDA xx.x”(根据电脑GPU支持的cuda版本选择)的命令安装torch,例如这里的“conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia”或“pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 –index-url https://download.pytorch.org/whl/cu121”,这两个命令选一个粘贴在命令行中运行就可以下载torch了,这样就会安装支持cuda12.1的torch了。下载安装torch的时候可能会因为国外源的原因下载很慢或者下载失败,亲测用“conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia”命令下载安装torch会好一点。下载好之后也可以用“pip show torch”检查是否安装成功。

之后就是安装cuda了,这里已经确定了安装“12.1”版本的cuda,所以我们去官网CUDA Toolkit Archive | NVIDIA Developer选择这个版本的cuda安装就好,例如这里选择如下图所示的版本的cuda(12.1.x都可以),

如下图所示,根据自己的电脑配置选择参数下载就可以。

下载完成后,安装就可以,安装时注意“安装选项”选择“自定义”,然后将“驱动程序组件”全部勾选。默认安装路径是“C:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.1”,记住这个CUDA的安装目录。
这样安装好CUDA后,还没有全部完成,还需要去cuDNN官网cuDNN Archive | NVIDIA Developer下载cuDNN,选择支持CUDA的版本,刚刚下载的CUDA是哪个版本就选择对应的版本,CUDA 12.x则代表支持CUDA12代版本的所有版本,这里选择如下图所示的版本。

下载完cuDNN后会得到一个压缩包,解压后如下图所示将cuDNN文件夹里面的三个文件复制到CUDA的安装目录下直接覆盖替换。


到这里,pytorch和cuda就算全部安装完成,之后训练的时候就可以用GPU进行训练了。
1.4、Yolov8源码所需的依赖包安装
Yolov8只需要安装一个ultralytics包即可,所以可以直接在命令行输入“pip install ultralytics”并按ENTER键进行安装,如下图所示。(Ps:ultralytics包理论上包含了所有需要的依赖包,但是后面实际运行时,可能会有一些依赖包版本不兼容等报错,例如其中的numpy包,这种情况只需要按照报错提示,更新或重新安装一些依赖包即可。)

1.5、检验Yolov8是否能正常运行
安装好Yolov8需要的虚拟环境和依赖包之后,接下来是检验Yolov8是否能正常运行。在此之前,需要先自行下载预训练好的权重文件:下载地址: 探索Ultralytics YOLOv8 -Ultralytics YOLO 文档。打开网址,将预训练权重文件下载到Yolov8工程文件中,如下图所示。(Ps:可以把yolov8n.pt、yolov8s.pt、yolov8m.pt、yolov8l.pt等权重文件都下载了,之后运行要用哪个就改一下运行时的参数就行。)(Ps权重文件说明:1、这些预训练好的权重文件本身就可以直接拿去进行目标识别了,可以对人物、汽车等很多种目标进行识别。如果要根据自己的需求识别特定的目标,就要自己训练模型,得到一个特定的.pt的权重文件,进行训练得到.pt文件的程序就是train.py。本教程训练特定模型时是在预训练好的模型的基础上训练的(用预训练模型比较不用预训练模型,训练出来的模型理论上效果会好一些),所以执行train.py文件时也会用到预训练好的.pt权重文件。训练模型的具体过程本教程后文也会讲到。2、对于yolov8n.pt、yolov8s.pt、yolov8m.pt、yolov8l.pt等权重文件,笼统地讲,越大的识别精度越高,识别速度越慢,越小的识别精度越低,识别速度越快。)


下载好预训练权重模型文件后,在命令行中输入“yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg'”并运行,用以检测一张工程文件中自带的图片,以检验Yolov8是否能正常运行,如下图所示(注意命令行中输入的.pt文件须是下载好的)。这样程序会按照各个默认参数运行,识别的结果会放在“runs/detect/predict”路径下面。每运行一次该命令,目标识别的结果都会放在一个“predict”文件里。若是在“predict”文件里看到检测完成的图片,说明Yolov8已经可以正常运行了,如下图所示。


到现在为止,经过“detect.py”的验证,Yolov8的所有依赖、环境都已安装完成。
2、模型训练
Yolov8所需的环境都配置好以后,接下来就是根据自己的识别需求来训练模型了,本教程以水果忍者里面的“西瓜”、“菠萝”两种水果的识别为例。
2.1、数据集准备
在训练模型之前先需要准备好大量的样本图片,即数据集,数据集分为训练集、验证集和测试集。为了使接下来的训练过程更加规范,可以创建一个“score”文件夹用以储存数据集的文件夹,在“score”里面再创建一个“images”和一个“labels”的文件夹,分别在“images”和“labels”两个文件夹内再创建三个文件夹“train”、“val”、“test”,如下图所示。这样创建储存数据集的文件夹之后,就可以将数据集图片和标签管理和对应起来了。

本教程案例的数据集准备了10张图片,按照8:1:1的比例作为训练集、验证集和测试集,即把10张样本图片按照8:1:1的比例分别放入“score/images”里面的“train”、“val”、“test”文件夹里,如下图所示。(这里为了演示所以只准备了10张图,大家自己训练时样本准备得越多,训练出的模型效果越好,图片太少可能没有效果的,8:1:1的比例也可以自己调整。)

这样准备好图片后,就可以进行数据标注了,即为数据集里的每张图片都打上标签。进行数据标注的软件是“labelimg”,所以先要安装这个软件:在Yolov8工程文件中输入“cmd”进入命令行界面,如下图所示。在之前安装好的python环境下输入“pip install labelimg”并按ENTER键进行安装,如下图所示。


安装好labelimg之后在命令行中直接输入“labelimg”,如下图所示,就可以直接打开这个软件。

打开labelimg后,如下图所示,save_format要设置为“yolo”。然后点击“Open Dir”选择样本图片储存的路径,点击“Change Save Dir”选择标注好的标签要保存路径,一定要跟之前创建的文件路径一一对应,例如点击Open Dir选择的路径是“score/images/train”,则点击Change Save Dir选择标签保存路径要设置为“score/labels/train”。设置好之后,就可以点击“Create RectBox”对图片上的目标进行标注了,标注完之后点击“Save”,然后点击“Next Image”标注下一张。这样将“score/images”里面的图片都标注完之后,打开“score/labels”,里面就会有对应的每张图片的标签信息,如下图所示。打开labels文件中的“classes.txt”文件,如下图所示,记住名字和顺序,后面设置数据集的配置文件以及C#部署Yolov8时要用到。





(在此之前,确保下载安装好Pycharm)利用Pycharm集成开发环境打开整个Yolov8工程文件,如下图所示。

用Pycharm打开整个工程文件后,在右下角为Pycharm集成开发环境设置安装好的Python解释器,即py39_19_ultralytics,如下图所示。

之后需要创建一个数据集的配置文件“shuiguo_data.yaml”放在Yolov8工程文件中的“datasets”路径里面,如下图所示。配置文件的内容修改为如下图所示。路径,类别数量,类别名字和顺序和前面创建的数据集的保存路径一致。

2.2、训练模型
准备好数据集及其配置文件后,就可以进行模型的训练了,为了方便执行训练指令,在项目中新建“train.py”文件,如下图所示。

第二是修改要用到的模型的配置文件:打开Yolov8工程文件中的“models”文件夹下的“yolov8.yaml”文件,将要识别的目标的种类数量按实际情况更改,如下图所示,本教程案例更改为2,即“boluo”和“xigua”。

如下图所示,设置好配置文件之后,就可以运行“train.py”程序训练模型了,可以根据自己的需求修改“train.py”中的路径和参数。然后等待“train.py”运行完毕,程序的运行过程就是训练模型的过程,如果数据集样本图片很多、跑的轮次设置得很大或者电脑没有GPU或者之类的话可能需要非常久的时间(cuda和pytorch没有正确安装的话,就算电脑有GPU也不会调用的,正确安装请参考第1.3节,用GPU训练的话“batch-size”可以设置的大一些,根据GPU显存可以设置为16或者32,这样也会训练的时间也会短一些,可以结合训练时占用的“GPU_mem”和电脑GPU的显存自己调整“batch-size”。如何判断GPU是否调用:可以查看训练时打印的信息,即运行“train.py”之后的打印输出,如果训练时每一个“Epoch”的“GPU_mem”都为0,则GPU没有调用)。(注意,下图训练时下载yolov11n.pt是为了训练前的测试,如果自己之前下载了这个预训练权重文件就可以省去下载过程。)


“train.py”运行完毕后,即训练完成后,程序输出的结果会保存在Yolov8工程文件中的“runs/train/exp”路径下面,每运行一次“train.py”,输出的结果都会放在一个“exp”文件里。训练得到的特定的权重文件在“exp”里面的“weights”文件夹中,一般使用“best.pt”这个权重文件,如下图所示。有了这个“best.pt”权重文件之后就可以进行水果忍者图片中的“菠萝”和“西瓜”的识别了。

2.3、验证训练好的模型(这步一般是写论文出数据用的,没需求可以不用验证)
得到训练好的模型,即“best.pt”权重文件后,可以对这个模型进行验证,为了方便执行训练指令,在项目中新建“val.py”文件,如下图所示。

然后可以用“val.py”检验一下这个模型的效果好不好。运行“val.py”这个文件就可以了,可以根据自己的需求修改“val.py”中的路径和参数。验证完成后,即“val.py”运行完毕后,程序输出的结果会保存在Yolov8工程文件中的“runs/val/exp”路径下面,每运行一次“val.py”,输出的结果都会放在一个“exp”文件里,如下图所示。“exp”里面的各种数据和结果就是表明训练出来的“best.pt”这个模型的效果好不好的,一般写论文,做大作业之类的需要这些数据。

2.4、使用训练好的模型
为了方便检测,在项目中新建“detect.py”文件,如下图所示(这里的“runs/train/exp/weights/best.pt”是训练完成后的best.pt的路径,“C:/Users/KITEl/Desktop/test.jpg”是要检测的图片的路径,根据实际情况调整)。

利用“detect.py”就可以使用训练好的“best.pt”模型进行水果忍者图片中的“菠萝”和“西瓜”的目标识别, 可以根据自己的需求修改“detect.py”中的路径和参数。识别的结果会放在“runs/detect/predict”每运行一次“detect.py”,目标识别的结果都会放在一个“predict”文件里。可以在“predict”文件里看到检测完成的图片,如下图所示。

3、C#部署
Yolov8的源码是用python写的,本章将详细讲解Yolov8怎么用C#部署。
3.1、将.pt文件导出为.onnx文件
用Yolov8的python源码训练出来的.pt文件只能用python运行,要想要用C#部署Yolov8标识别,需要将训练好的模型转换为C#可用的模型,即将.pt文件转换为.onnx文件。为了方便转换,在项目中新建“export.py”文件,如下图所示(根据自己的情况调整路径)。

在运行“export.py”文件前,要先确保安装好“export.py”所需要的各种依赖包,可以先运行一下,结合报错信息检查缺哪些包,在命令行界面中用pip install指令进行安装。当“export.py”在Pycharm中没有报错时,说明“export.py”所需要的依赖包全部安装完成。
“export.py”运行完毕之后,程序输出的结果可以在Pycharm下方看到,如下图所示,可以看到导出的.onnx文件的保存位置是在“runs rainexpweights”的路径下面。

3.2、用C#从零编写Yolov8目标检测的窗体demo程序
3.2.1、用.NET6.0框架编写窗体程序的步骤
如下图步骤所示,用Visual Studio创建一个“C#控制台应用”的项目,创建项目时项目的命名不要出现中文和特殊的字符,这里命名为“yolov8_WindowsDemo”。框架选择“.NET6.0”,如果没有.NET6.0的话,可以去官网下载,下载地址:适用于 Visual Studio 的 .NET SDK | .NET



创建好项目后打开项目,将以下代码复制到“Program.cs”中:
using System;
using System.Windows.Forms;
namespace MicroLED_Detecter
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]// 这是一个特性标记,用于指示应用程序的线程模型为单线程单元(STA)。在使用 COM 组件或进行 UI 操作时,需要将应用程序的线程模型设置为 STA。这个特性通常用于 Windows 窗体应用程序。
static void Main()
{
Application.EnableVisualStyles();// 这个方法启用 Windows 窗体应用程序的视觉样式。它会应用操作系统的默认外观和主题来渲染窗体控件。
Application.SetCompatibleTextRenderingDefault(false);// 这个方法设置文本渲染的兼容性。将参数设置为 false 表示使用 GDI+ 来渲染文本,而不是使用 GDI。在大多数情况下,使用 GDI+ 会提供更好的文本显示效果。
Application.Run(new FormMain());// 窗体应用程序启动并进入消息循环,接收和处理用户的输入和操作。
}
}
}
复制完成后,如下图所示:

双击项目“yolov8_WindowsDemo”(项目名称是创建项目时自己命名的),将以下内容复制替换掉“yolov8_WindowsDemo”里面的内容,目的是为了能够添加C#窗体类文件。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
</Project>
复制完成后如下图所示,然后右击项目“yolov8_WindowsDemo”点击生成。

生成后,如下图所示步骤,再右击“yolov5_WindowsDemo”,如下图所示添加“Windows 窗体”,命名为“FormMain.cs”,然后点击添加。


回到“Program.cs”,鼠标放到报错位置,根据提示,添加“using ******”,如下图所示。添加完成后如下图所示。


点击运行程序,如果程序没有报错,出现名为“FormMain”的窗体,如下图所示,说明窗体程序所需的配置已经全部配置完成。

3.2.2、C#部署Yolov8进行自己所需的目标识别的配置以及demo程序
将3.1节导出的best.onnx文件和需要检测的图片“test.jpg”放在下图所示的路径下。

检测的Demo程序:
using OpenCvSharp;
using OpenCvSharp.Extensions;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using Yolov8Net;
using Point = OpenCvSharp.Point;
namespace yolov8_WindowsDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string[] mylabel = { "boluo", "xigua" };// 模型分类标签
IPredictor yolov8 = YoloV8Predictor.Create("best.onnx", mylabel);// 自己的模型文件;
Image<Rgba32> im = SixLabors.ImageSharp.Image.Load<Rgba32>("test.jpg");// 待检测图片
Prediction[] predictions = yolov8.Predict(im);// 利用模型进行检测
Mat inputMat = Cv2.ImRead("test.jpg", ImreadModes.Color);
foreach (Prediction prediction in predictions)
{
Point p1 = new Point(prediction.Rectangle.X, prediction.Rectangle.Y);//矩形左上顶点
Point p2 = new Point(prediction.Rectangle.X + prediction.Rectangle.Width, prediction.Rectangle.Y + prediction.Rectangle.Height);//矩形右下顶点
Point p3 = new Point(prediction.Rectangle.X, prediction.Rectangle.Y - 60);
Scalar scalar = new Scalar(0, 0, 255);
Cv2.Rectangle(inputMat, p1, p2, scalar, 7);
Cv2.PutText(inputMat, prediction.Label.Name + " " + Math.Round(prediction.Score, 2), p3, HersheyFonts.HersheyDuplex, 2, scalar, 4);
}
System.Drawing.Image image_result = BitmapConverter.ToBitmap(inputMat);
pictureBox1.Image = image_result;
}
}
}
程序所需的配置:
NuGet程序包下载: SixLabors.ImageSharp、OpenCvSharp4、OpenCvSharp.Extensions、OpenCvSharp.runtime.win、Yolov8.Net、Microsoft.ML.OnnxRuntime
如下图所示:






运行Demo程序之后的检测效果:



















暂无评论内容