目录
1、环境配置
1.1、Yolov5源码下载
1.2、Yolov5源码所需的环境和依赖包安装
1.3、安装cuda和pytorch(后续只用CPU进行训练的话可以跳过)
1.4、检验Yolov5是否能正常运行
2、模型训练
2.1、数据集准备
2.2、训练模型
2.3、验证训练好的模型(这步一般是写论文出数据用的,没需求可以不用验证)
2.4、使用训练好的模型
3、C#部署
3.1、将.pt文件导出为.onnx文件
3.2、下载Yolov5部署于C#中的源码
3.3、生成C#使用.onnx文件需要的配置文件
3.4、用C#从零编写Yolov5目标检测的窗体demo程序
3.4.1、用.NET6.0框架编写窗体程序的步骤
3.4.2、C#部署Yolov5进行自己所需的目标识别的配置以及demo程序
教程开始之前,请确保安装好Anacaonda和Pycharm。直接在官网下载安装就好,由于下载安装的过程比较简单,本教程不详细阐述。
1、环境配置
1.1、Yolov5源码下载
Yolov5源码官网下载地址: ONNX > CoreML > TFLite”>GitHub – ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
点击链接后,进入以下界面,可点击“Code”→“ Download ZIP”下载Yolov5源码。
解压后进入解压后的文件路径,如下图所示,即Yolov5的工程文件中。输入“cmd”,进入下图所示的命令行界面。
1.2、Yolov5源码所需的环境和依赖包安装
(在此之前,确保电脑下载安装好Anaconda)
下载Python解释器,创建Python的虚拟环境:在命令行界面中输入“conda create -n py385_yolov5 python==3.8.5”并按ENTER键执行,如下图所示。
如下图所示,创建虚拟环境的过程中卡在“Proceed ([y]/n)?”,直接按下ENTER键就行。
安装完成后,激活安装好的虚拟环境:如下图所示,输入“conda activate py385_yolov5”并按ENTER键执行,出现“(py385_yolov5)”表示激活成功,当前正处于py385_yolov5的虚拟环境下。
下一步是在这个Python的虚拟环境中安装Yolov5需要的各种依赖包,在下载各种包之前,为了防止下载速度慢甚至直接卡住,可以先切换一下中科大提供的国内镜像源:直接复制以下内容粘贴到命令行,则会自动执行切换源的指令。
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的虚拟环境中安装Yolov5需要的各种依赖包,Yolov5需要的所有包的名字及版本都在解压后Yolov5工程文件中的“requirements.txt”文件里,所以可以直接在命令行输入“pip install -r requirements.txt”并按ENTER键进行安装,如下图所示。
1.3、安装cuda和pytorch(后续只用CPU进行训练的话可以跳过)
如果要用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.3”,意思是支持版本等于或低于12.3版本的cuda,建议安装的时候选择小于12.3版本的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、检验Yolov5是否能正常运行
(在此之前,确保下载安装好Pycharm)
安装好Yolov5需要的虚拟环境和各种依赖包之后,利用Pycharm集成开发环境打开整个Yolov5工程文件,如下图所示。
用Pycharm打开整个工程文件后,在右下角为Pycharm集成开发环境设置安装好的Python解释器,即py385_yolov5,如下图所示。
接下来是运行“detect.py”文件检验Yolov5是否能正常运行。但是在运行detect.py文件之前,需要先自行下载预训练好的权重文件:先打开“detect.py”,查看这里用的是哪个权重文件,如下图所示。然后去官网下载对应的权重文件,下载地址: ONNX > CoreML > TFLite”>GitHub – ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite。下载到Yolov5工程文件中,如下图所示。(Ps:可以把yolov5n.pt、yolov5s.pt、yolov5m.pt、yolov5l.pt等权重文件都下载了,之后运行train.py、detect.py等文件时要用哪个就改一下运行时的参数就行。)
(Ps权重文件说明:1、这些预训练好的权重文件本身就可以直接拿去进行目标识别了,可以对人物、汽车等很多种目标进行识别。如果要根据自己的需求识别特定的目标,就要自己训练模型,得到一个特定的.pt的权重文件,进行训练得到.pt文件的程序就是train.py。本教程训练特定模型时是在预训练好的模型的基础上训练的(用预训练模型比较不用预训练模型,训练出来的模型理论上效果会好一些),所以执行train.py文件时也会用到预训练好的.pt权重文件。训练模型的具体过程本教程后文也会讲到。2、对于yolov5n.pt、yolov5s.pt、yolov5m.pt、yolov5l.pt等权重文件,笼统地讲,越大的识别精度越高,识别速度越慢,越小的识别精度越低,识别速度越快。)
下载好预训练好的yolov5s.pt权重文件后,直接运行“detect.py”进行目标识别就行,这样程序会按照各个默认参数运行,识别的结果会放在“runs/detect/exp”路径下面。每运行一次“detect.py”,目标识别的结果都会放在一个“exp”文件里。若是在“exp”文件里看到检测完成的图片,说明Yolov5已经可以正常运行了,如下图所示。
到现在为止,经过“detect.py”的验证,Yolov5的所有依赖、环境都已安装完成。
2、模型训练
Yolov5所需的环境都配置好以后,接下来就是根据自己的识别需求来训练模型了,本教程以水果忍者里面的“西瓜”、“菠萝”两种水果的识别为例。
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”,所以先要安装这个软件:在Yolov5工程文件中输入“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#部署Yolov5时要用到。
2.2、训练模型
准备好数据集后,就可以进行模型的训练了,即执行“train.py”文件。但是在执行train.py程序之前,需要做一些配置和参数的修改。首先需要创建一个数据集的配置文件“shuiguo_data.yaml”放在Yolov5工程文件中的“data”路径里面,如下图所示。配置文件的内容修改为如下图所示。路径,类别数量,类别名字和顺序和前面创建的数据集的保存路径一致。
第二是修改要用到的模型的配置文件,本教程以yolov5s为例,即以yolov5s.pt这个预训练模型为基础进行训练(也可以选择其他的预训练模型为基础,区别参考1.3节中的“Ps权重文件说明”)。模型的配置文件修改步骤:打开Yolov5工程文件中的“models”文件夹下的“yolov5s.yaml”文件,将要识别的目标的种类数量按实际情况更改,如下图所示,本教程案例更改为2,即“boluo”和“xigua”。
设置好这两个配置文件之后,就可以运行“train.py”程序训练模型了,但是直接点执行的话,它会按照默认参数执行,所以需要用Pycharm里面的“终端”执行train.py,输入“python train.py –data shuiguo_data.yaml –cfg yolov5s.yaml –weights yolov5s.pt –epoch 100 –batch-size 4”并按ENTER键,如下图所示,这样就会按照自己设置好的配置文件和参数运行“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没有调用)。
“train.py”运行完毕后,即训练完成后,程序输出的结果会保存在Yolov5工程文件中的“runs/train/exp”路径下面,每运行一次“train.py”,输出的结果都会放在一个“exp”文件里。训练得到的特定的权重文件在“exp”里面的“weights”文件夹中,一般使用“best.pt”这个权重文件,如下图所示。有了这个“best.pt”权重文件之后就可以进行水果忍者图片中的“菠萝”和“西瓜”的识别了。
2.3、验证训练好的模型(这步一般是写论文出数据用的,没需求可以不用验证)
得到训练好的模型,即“best.pt”权重文件后,可以对这个模型进行验证,即用“val.py”检验一下这个模型的效果好不好。运行“val.py”这个文件就可以了,但是同样的,直接点执行的话,它会按照默认参数执行,所以这里也需要用Pycharm里面的“终端”执行“val.py”,即输入“python val.py –data data/shuiguo_data.yaml –weights runs/train/exp/weights/best.pt –img 640”(这里的“runs/train/exp/weights/best.pt”是训练完成后的best.pt的路径,需根据实际情况进行调整)并按ENTER键,如下图所示,这样就会按照设置好的配置文件和参数运行“val.py”了。
验证完成后,即“val.py”运行完毕后,程序输出的结果会保存在Yolov5工程文件中的“runs/val/exp”路径下面,每运行一次“val.py”,输出的结果都会放在一个“exp”文件里,如下图所示。“exp”里面的各种数据和结果就是表明训练出来的“best.pt”这个模型的效果好不好的,一般写论文,做大作业之类的需要这些数据。
2.4、使用训练好的模型
利用“detect.py”就可以使用训练好的“best.pt”模型进行水果忍者图片中的“菠萝”和“西瓜”的目标识别:运行“detect.py”进行目标识别就行,但是,同样的,直接执行“detect.py”的话,程序会按照各个默认参数运行,所以需要用Pycharm里面的“终端”执行“detect.py”,即输入“python detect.py –weights runs/train/exp/weights/best.pt –source data/images/test.jpg”(这里的“runs/train/exp/weights/best.pt”是训练完成后的best.pt的路径,“data/images/test.jpg”是要检测的图片的路径,根据实际情况调整)并按ENTER键,如下图所示。这样就会按照设置好的配置文件和参数执行“detect.py”了。识别的结果会放在“runs/detect/exp”路径下面,每运行一次“detect.py”,目标识别的结果都会放在一个“exp”文件里。可以在“exp”文件里看到检测完成的图片,如下图所示。
3、C#部署
Yolov5的源码是用python写的,本章将详细讲解Yolov5怎么用C#部署。
3.1、将.pt文件导出为.onnx文件
用Yolov5的python源码训练出来的.pt文件只能用python运行,要想要用C#部署Yolov5目标识别,需要将训练好的模型转换为C#可用的模型,即将.pt文件转换为.onnx文件。Yolov5的源码提供了这样的转换功能:运行“export.py”就可以将训练好的.pt文件导出为可以部署在C#里面的.onnx文件。在运行“export.py”文件前,要先确保安装好“export.py”所需要的各种依赖包,可以结合“export.py”代码中提到的需要导入的包和Yolov5工程文件中的 “requirements.txt”,在命令行界面中用pip install指令进行安装。当“export.py”在Pycharm中没有报错时,说明“export.py”所需要的依赖包全部安装完成。
安装好“export.py”需要的各种包之后,如下图所示修改代码中的两个地方,一个是把需要转换的.pt文件的路径换成自己的实际路径,本教程案例是”runs/train/exp/weights/best.pt“,另一个是将默认导出类型”torchscript“改为“onnx”。然后点击运行就好了。
“export.py”运行完毕之后,程序输出的结果可以在Pycharm下方看到,如下图所示,可以看到导出的.onnx文件的保存位置是在“C:UsersKITElDesktopyolov5yolov5-master
uns rainexpweights”的路径下面,通过这个路径找到这个.onnx文件然后用提供的可视化网址“Netron”打开,如下图所示。点击“images”,右边就会出现这个.onnx模型的信息,记住“names”的名称与顺序和“output0”,后面C#部署Yolov5时会用到。
3.2、下载Yolov5部署于C#中的源码
Yolov5部署于C#中的源码官网下载地址:GitHub – techwingslab/yolov5-net: YOLOv5 object detection with C#, ML.NET, ONNX
点击链接后,进入以下界面,可点击“Code”→“ Download ZIP”下载Yolov5部署于C#中的源码。解压后用Visual Studio打开Yolov5-net工程文件中的“Yolov5Net.sln”,打开后点击运行,如下图所示。
程序运行完成之后打开Yolov5-net工程文件中的“yolov5-net-mastersrcYolov5Net.AppinDebug
et6.0Assets”这个文件路径,在这个路径下如果看到“result.jpg”的检测结果,如下图所示,说明Yolov5部署于C#中的源码运行成功,没有问题。
3.3、生成C#使用.onnx文件需要的配置文件
接下来要用Yolov5部署于C#中的源码,生成C#使用自己的.onnx模型需要的配置文件。做法就是再运行Yolov5-net工程文件中的“Yolov5Net.sln”,让其用自己的.onnx模型去检测自己的图片。
在运行程序之前,首先要准备一张要自己的要检测的图片放到“yolov5-net-mastersrcYolov5Net.AppinDebug
et6.0Assets”的路径下,如下图所示;并且将之前导出的.onnx文件放到“yolov5-net-mastersrcYolov5Net.AppinDebug
et6.0AssetsWeights”路径下,如下图所示。
准备好自己的待检测图片和导出的.onnx模型后,将“Program.cs”里面的代码如下图所示修改路径。并且将“YoloCocoP5Model.cs”里面的代码按照我们的实际模型进行修改,如下图所示,第一处的数字是识别类型的种类数量+5,本案例的种类为“菠萝”和“西瓜”两种,所以是2+5,为7;第二处的output和第三处的种类顺序须与在3.1节中使用可视化网址“Netron”显示的.onnx模型的信息一致。
做好以上修改后之后直接运行“Yolov5Net.sln”就可以了,运行完成后,在“yolov5-net-mastersrcYolov5Net.AppinDebug
et6.0Assets”路径下如果能看到检测结果图,如下图所示,就说明自己训练并导出的.onnx模型在C#中可以使用。
程序运行完成后,适配自己的.onnx模型的配置文件也会随之生成,打开“yolov5-net-mastersrcYolov5Net.ScorerinDebug”路径,保存如下图所示里面的生成的三个文件。有了这三个配置文件以及自己训练并导出的.onnx文件,就可以自己编写C#程序实现自己需要的Yolov5目标识别功能了。
3.4、用C#从零编写Yolov5目标检测的窗体demo程序
3.4.1、用.NET6.0框架编写窗体程序的步骤
如下图步骤所示,用Visual Studio创建一个“C#控制台应用”的项目,创建项目时项目的命名不要出现中文和特殊的字符,这里命名为“yolov5_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());// 窗体应用程序启动并进入消息循环,接收和处理用户的输入和操作。
}
}
}
复制完成后,如下图所示:
双击项目“yolov5_WindowsDemo”(项目名称是创建项目时自己命名的),将以下内容复制替换掉“yolov5_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>
复制完成后如下图所示,然后右击项目“yolov5_WindowsDemo”点击生成。
生成后,如下图所示步骤,再右击“yolov5_WindowsDemo”,如下图所示添加“Windows 窗体”,命名为“FormMain.cs”,然后点击添加。
回到“Program.cs”,鼠标放到报错位置,根据提示,添加“using ******”,如下图所示。添加完成后如下图所示。
点击运行程序,如果程序没有报错,出现名为“FormMain”的窗体,如下图所示,说明窗体程序所需的配置已经全部配置完成。
3.4.2、C#部署Yolov5进行自己所需的目标识别的配置以及demo程序
Demo程序:
using OpenCvSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using Yolov5Net.Scorer;
using Yolov5Net.Scorer.Models;
using Point = OpenCvSharp.Point;
namespace yolov5_WindowsDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Image<Rgba32> im = SixLabors.ImageSharp.Image.Load<Rgba32>("tmp_upload.jpg");// 待检测图片
YoloScorer<YoloCocoP5Model> model = new YoloScorer<YoloCocoP5Model>("best.onnx");// 自己的模型文件
List<YoloPrediction> predictions = model.Predict(im);
Mat inputMat = Cv2.ImRead("tmp_upload.jpg", ImreadModes.Color);
foreach (YoloPrediction 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 = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
pictureBox1.Image = image_result;
}
}
}
Demo程序所需的配置:
NuGet程序包下载:Microsoft.ML.OnnxRuntime、SixLabors.ImageSharp、OpenCvSharp.Extensions、OpenCvSharp.Windows、System.Drawing.Common(由于.NET6.0自带的System.Drawing.Common版本可能低于OpenCvSharp需要的System.Drawing.Common版本,所以可能需要升级System.Drawing.Common的版本)
如下图所示:
将3.3节保存的三个文件复制到“binDebug
et6.0-windows”路径下,然后添加依赖项引用“Yolov5Net.Scorer.dll”,如下图所示。
运行Demo程序之后的检测效果:
暂无评论内容