用YOLOv5模型识别出表情!

本文利用YOLOV5对手势进行训练识别,并识别显示出对应的emoji,如同下图:

本教程所用环境:YOLOV5版本是V3.1。

通过gitclone将源码下载到本地,通过pipinstall-rrequirements.txt安装依赖包(其中官方要求python>=3.8andtorch>=1.6)。

我的环境是:系统环境Ubuntu16.04;cuda版本10.2;cudnn版本7.6.5;torch版本1.6.0;python版本3.8

其中手势数据集已上传至开源数据平台Graviti,包含了完整代码。

2.1数据集的采集以及标注

手势数据采集的代码:

importcv2defmain():total_pics=1000cap=cv2.VideoCapture(0)pic_no=0flag_start_capturing=Falseframes=0whileTrue:ret,frame=cap.read()frame=cv2.flip(frame,1)cv2.imwrite("hand_images/"+str(pic_no)+".jpg",frame)cv2.imshow("Capturinggesture",frame)cv2.waitKey(10)pic_no+=1ifpic_no==total_pics:breakmain()在yolov5目录下创建VOC2012文件夹(名字自己定义的),目录结构就是VOC数据集的,对应如下:

示例:

VOC2012文件夹下内容:

Annotations文件中是xml文件(labelimg标注的):

images为VOC数据集格式中的JPRGImages:

ImageSets文件中Main子文件夹主要存放训练,测试验证集的划分txt。这个划分通过以下脚本代码生成:

2.2生成yolo训练格式labels

把xml标注信息转换成yolo的txt格式。其中yolo的txt标签格式信息:每个图像对应一个txt文件,文件每一行为一个目标信息,包括classx_center,y_center,width,height格式。如下图所示:

创建voc_label.py文件,将训练集,验证集以及测试集生成txt标签,代码如下:

三个txt文件内容:

2.3配置文件

1)数据集的配置

在yolov5目录的data文件夹新建一个Emoji.yaml文件(自己定义)。用来存放训练集验证集的划分文件train.txt和val.txt(其中这两个文件是voc_label.py生成的)。具体内容如下:

2)模型的配置文件

一般训练yolo模型的时候,是可以聚类自己标注的框作为先验框(这样可以保证标注样本最大化的利用)。我们这里就直接采用默认值了。

到这里我们的自定义数据集以及配置文件创建完毕,下面就是训练模型了。

3.1、下载预训练模型

在源码yolov5目录下的weights文件夹下提供了下载smlx模型的脚本--download_weights.sh,执行这个脚本就可以下载这四个模型的预训练模型了。

3.2、训练模型

以上参数解释如下:epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。batch-size:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点。cfg:存储模型结构的配置文件。data:存储训练、测试数据的文件。img-size:输入图片宽高,显卡不行你就……。rect:进行矩形训练。resume:恢复最近保存的模型开始训练。nosave:仅保存最终checkpoint。notest:仅测试最后的epoch。evolve:进化超参数。bucket:gsutilbucket。cache-images:缓存图像以加快训练速度。weights:权重文件路径。name:重命名results.txttoresults_name.txt。device:cudadevice,i.e.0or0,1,2,3orcpu。adam:使用adam优化。multi-scale:多尺度训练,img-size+/-50%。single-cls:单类别的训练集

训练只需要运行训练命令就可以了,如下:

$pythontrain.py--dataEmoji.yaml--cfgyolov5s.yaml--weightsweights/yolov5s.pt--batch-size64--device"0,1,2,3"--epochs200--img-size640其中devicebatch-size等需要根据自己机器进行设置。

4.模型测试

评估模型好坏就是在有标注的测试集或验证集上进行模型效果的评估,在目标检测中最常使用的评估指标为mAP。yolov5文件下的test.py文件中指定了数据集的配置文件和训练结果模型如下:

通过以下命令进行模型测试:

pythontest.py--datadata/Emoji.yaml--weightsruns/train/exp2/weights/best.pt--augment模型测试效果:

测试结果图:

1.安装依赖库

pipinstallonnxcoremltoolsonnx-simplifier2.导出ONNX模型

此时在best.pt同级目录下生成了best.mlmodelbest.onnxbest.torchscript.pt三个文件,我们只需best.onnx,这个文件可以直接用netron打开查看模型结构。

3.用onnx-simplifer简化模型

为什么要简化?

在训练完深度学习的pytorch或者tensorflow模型后,有时候需要把模型转成onnx,但是很多时候,很多节点比如cast节点,Identity这些节点可能都不需要,我们需要进行简化,这样会方便我们把模型转成ncnn或者mnn等这些端侧部署的模型格式或者通过tensorRT进行部署。

完成后就生成了简化版本的模型yolov5-best-sim.onnx。

由上述生成了yolov5-best-sim.onnx这个模型,我们利用ncnn自带的工具onnx2ncnn.exe(这个工具是自己编译生成的,我这里是在windows下编译生成的,可以用linux下的可执行文件)生成yolov5s.paramyolov5s.bin两个文件。

在windows平台下ctrl+rcmd命令行窗口输入:

去掉不支持的网络层,打开转换得到的yolov5s.param文件,前面几行需要删除的是标红部分。(注意我们训练yoloV5的版本是V3.1,这里不同的版本可能会不同。)

修改结果如下绿色框和红色框中的。因为去掉了10层所以变成191228。并用YoloV5Focus网络层代替去掉的10层,而YoloV5Focus网络层中的images代表该层的输入,207代表的输出名,这个是根据下边一层的卷积层输入层数写的。

修改网路的输出shape:

当基于修改后的网路使用ncnn/examples/yolov5测试时会发现出现图片中一堆乱框,这种情况需要修改网路的输出部分。在保证输出名一致的情况下,修改Reshape中的0=-1,使的最终的输出shape不固定。具体的修改地方以及修改之前和之后见下图。

以下是用C++实现的完整代码。建议一划到底,先看最后的整体思路

THE END
1.训练集验证集和测试集训练集测试集验证集本文详细解释了训练集、验证集和测试集在深度学习中的作用,强调了它们之间的联系以及实验中的注意事项。此外,还介绍了交叉验证的概念,特别是K折验证,以及模型参数和超参数的区别。 摘要由CSDN通过智能技术生成 文章目录 训练集、验证集和测试集概念 三者的联系和实验注意事项 https://blog.csdn.net/m0_49866160/article/details/136381625
2.python数据预测的训练集和测试集的关系测试集和训练集的比例1 训练/验证/测试集 机器学习/深度学习中,一般会把数据集分为训练集(training set)、验证集(validation set/development set,dev set)、测试集(test set)三部分。 训练集用于对模型进行训练;验证集用于对单一指标进行确定,如选择算法,确定参数;测试集用于对最终的模型性能进行评估。 https://blog.51cto.com/u_16099295/8876742
3.训练集验证集测试集以及交验验证的理解在人工智能机器学习中,很容易将“验证集”与“测试集”,“交叉验证”混淆。 一、三者的区别 训练集(train set) —— 用于模型拟合的数据样本。 验证集(validation set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时,用以验证当前https://cloud.tencent.com/developer/article/2084957
4.机器学习训练集验证集测试集机器学习 - 训练集、验证集、测试集 与其他机器学习方法不同,随机森林存在OOB,相当于自带多套训练集和测试集,内部可以通过OOB作为评估模型准确性的一种方法。大多数其他机器学习方法都没有这种优势。 通常,当有一套数据时,它需要分为训练集和测试集。数据集一般按比例进行8:2,7:3,6:4分为训练集和测试集。https://www.tulingxueyuan.cn/tlzx/jsp/2205.html
5.机器学习入门,一文彻底理解:训练集,验证集,测试集,交叉验证训练集(train set),验证集(validation set),测试集(test set)这三个名词在机器学习领域极其常见,但很多人并不是特别清楚,尤其是后两个经常被混用。 交叉验证很多教材和文章概念也不统一,本文我们深度研究一下。 通过本文,您将学会: 1、训练集,验证集,测试集概念、用法2、交叉验证在不同教材及 sklearn 中的概https://m.163.com/dy/article/I4AI743T0519EA27.html
6.使用python如何将数据集划分为训练集验证集和测试集这篇文章主要介绍了使用python如何将数据集划分为训练集、验证集和测试集问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教+ 目录 python将数据集划分为训练集、验证集和测试集 划分数据集 众所周知,将一个数据集只区分为训练集和验证集是不行的,还需要有测试集,本博文针对上https://www.jb51.net/python/297753sxd.htm
7.训练集(Train),验证集(Validation)和测试集(TestSets)以及交叉训练集、测试集、验证集与交叉验证 初学者对于训练集(train set)、测试集(test set)、验证集(validation set)这三个概念和应用非常容易搞混,这里我结合各种博文和书籍上的讲解进行总结: 训练集 参与训练,模型从训练集中学习经验,从而不断减小训练误差。这个最容易理解,一般没什么疑惑。 验证集 不参与训练,用于在训https://www.pianshen.com/article/51521358243/
8.YOLOv8精度大涨,教你如何在自定义数据集上训练它以下是上述足球数据集的训练结果: (1)返回的混淆矩阵; (2)跟踪的关键指标; (3)验证batch上的推理示例。 是不是还不错? 4、用测试集验证模型 训练好后开始验证。创建数据集时分成三部分,其中一部分用来当测试集: yolo task=detect \ mode=val \ https://www.thepaper.cn/newsDetail_forward_21528386
9.一文搞定YOLO3训练自己的数据集生成训练与测试文件打开darknet/scripts/voc_label.py文件,根据自己的数据集更改下面的代码sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] classes = ["car","person"]执行改文件,在darknet文件夹下生成3个txt文件:2007_val.txt(验证样本集路径),2007_train.txt和2007_test.txt。同https://www.flyai.com/article/638
10.训练和测试数据集MicrosoftLearn了解如何将数据分为训练集和测试集,这是SQL Server Analysis Services中评估数据挖掘模型的重要部分。https://msdn.microsoft.com/zh-cn/library/bb895173.aspx
11.基于VGGNet改进网络结构的多尺度大熊猫面部检测训练阶段采用5折交叉验证的方式。5折交叉验证将整个数据集均分为5个子数据集,在训练过程中不重复的选择一个子数据集作为测试集,其它的4个子数据集作为训练集。整个训练过程重复5次,最终将5次的结果求平均作为最终的结果。该方法保证了每个样本都参与训练且被测试,从而降低了泛化误差。 http://qks.cqu.edu.cn/html/cqdxzrcn/2020/11/20201107.htm
12.科学网—[转载]转载认清虚拟筛选中的陷阱遵循良好的建模实践,从训练集中确定的最佳参数也必须在独立的测试集上表现良好; 也就是说,只有当该方法成功检索出不属于训练集的其他控制分子的生物活性构象时,才能假定已建立的方案的有效性和可靠性得到充分证实,从而得到积极验证。一些出版物13,19,23,25,26,38,41专为已经解决这个问题进行讨论,并且已经有一些https://wap.sciencenet.cn/blog-3386602-1162809.html
13.训练集验证集测试集和而不同,国内数据集又是怎样光景?人人在AI的世界中,有关数据集的“故事”有很多,这篇文章里,作者就继续讲述有关AI数据集的那些原理,梳理了训练集、验证集、测试集的区别和联系,以及目前国内数据集的现状、挑战和应对之策。想弄懂AI数据集的同学,不妨来看看这篇文章。 各位看官: 欢迎一起揭秘AI的世界。AI领域中,无论是模型,算法,还是应用,都离不https://www.woshipm.com/ai/5989591.html
14.基于DenseStep 1. 在BIT-Vehicle车型数据集(如图4)中挑选具有代表性即不同光照强度和不同拍摄距离的图片, 随机划分训练集和测试集; Step 2. 将训练集用labelImg工具进行标注形成xml文件; Step 3. 利用代码形式训练集划分为两部分即train集和val集; Step 4. 保留测试集图片. 图4 车型数据集 (2)网络训练 输入: 已https://c-s-a.org.cn/html/2020/10/7634.html