1. yolo的相关介绍
YOLO(You Only Look Once)是基于深度神经网络的目标检测算法,用在图像或视频中实时识别和定位多个对象。YOLO的主要特点是速度快且准确度较高,能够在实时场景下实现快速目标检测。YOLO是一种快速而准确的目标检测算法,被广泛应用于计算机视觉领域,包括实时视频分析、自动驾驶、安防监控、智能交通、缺陷检测等。YOLO由网络架构、基础网络、特征提取层、网格划分、边界框预测、非最大抑制和损失函数等组成,从而实现了高效而准确的实时目标检测。
- 网络架构: YOLO使用卷积神经网络(Convolutional Neural Network,CNN)作为基础网络架构。
- 基础网络: YOLO使用一个预训练的CNN作为基础网络,通常使用轻量级的神经网络框架Darknet作为默认选择(V5前),用于目标检测任务。
- 网格划分: YOLO将输入图像划分为固定大小的网格。每个网格负责检测图像中的对象,在不同的特征图上进行多尺度的网格划分,检测不同大小的对象
- 边界框预测: 对于每个网格,YOLO会预测多个边界框。每个边界框由一个边界框坐标和一个对象类别预测组成。边界框预测是通过回归来实现的。
- 非最大抑制(Non-Maximum Suppression,NMS): 为了消除多个重叠的预测结果,YOLO使用非最大抑制算法。该算法会筛选出具有高置信度的预测边界框,并删除与其高度重叠的边界框。
- 损失函数: YOLO使用多个损失函数来训练网络。这些损失函数包括边界框回归损失、对象存在性的分类损失、类别预测的分类损失。这些损失函数用于衡量预测结果与真实标签之间的差异,并通过反向传播来更新网络参数。
- 激活函数 YOLO通常使用的激活函数是线性整流函数(Rectified Linear Unit,ReLU)。主要作用是引入非线性性质,使得神经网络可以学习更复杂的函数关系,以增加网络的表达能力和非线性拟合能力。
2. yolo模型的训练
2.1 模型调试
关于python编译环境,本文不做太多介绍。需要用到Pytorch GPU版的深度神经网络框架,具体安装教程可以看这篇文章在windows下pytorch(GPU版)的安装。
上篇文章(基于yolo的无畏契约内目标检测-(1)数据集的制作)已经获取并标注好适合yolo模型训练的数据,接下来我们将利用YOLO V5训练自定义的数据集。首先,我们去YOLO V5的Github首页下载源码,我下载的是YOLO V5 Tag v5.0版本的。下图是源码的文件结构:
- 首先选择对应的python环境, 在命令行界面输入
pip install -r requirements.txt
以安装yolo的依赖包- 完成安装后可以运行train.py,运行过程可能遇到的问题可以参考这篇博客:YOLOv5tagV5.0调试过程中的遇到的问题 。 默认是对coco128这个数据集进行训练。
运行train.py成功后就会生成如下文件目录:
|----runs
| |----train
| | |----exp1
| | | |----weights
| | | | |----best.pt # 训练过程中最好的参数文件 所需要的
| | | | |----last.pt # 训练过程中最后一个epoch的参数文件
| | | |----训练过程相关的数据和图片
我们所需要的就是这个best.pt代表模型参数的文件(因为如果将整个模型完整的保存下载会占用大量的内存,只要保持模型的结构一直,只需保存参数文件即可)。
- 接下来运行detect.py进行对data/imageswen文件夹下的bus.jpg和zidane.jpg两张图片目标推理测试。
我们只需对detect.py中的以下部分进行调整即可:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam
parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--view-img', action='store_true', help='display results')
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
parser.add_argument('--augment', action='store_true', help='augmented inference')
parser.add_argument('--update', action='store_true', help='update all models')
parser.add_argument('--project', default='runs/detect', help='save results to project/name')
parser.add_argument('--name', default='exp', help='save results to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
opt = parser.parse_args()
print(opt)
check_requirements(exclude=('pycocotools', 'thop'))
with torch.no_grad():
if opt.update: # update all models (to fix SourceChangeWarning)
for opt.weights in ['yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt']:
detect()
strip_optimizer(opt.weights)
else:
detect()
我们介绍其中关键的三条:
(1) --weights 参数指所要用的参数文件,其默认用default=‘yolov5s.pt’(若没有会自动下载),这里可以换成我们自己训练的best.pt文件,注意路径
(2) --source 参数指要推理哪些测试图片,默认值为default=‘data/images’, 即’data/images’文件夹内的两张图片,同时你也可以自己更改路径内的图片或者更改成存放着自己测试图片的路径。
(3) --project 参数指要将结果保存在哪里,默认值为default=‘runs/detect’。
detect.py运行成功之后可以在runs/detect下看到测试结果,如下图:
得到推理成功的图片也就说明我们将整个项目调试通了,接着就可以换成我们自己的数集,训练专属于该训练集的best.pt。
2.2 训练自己的数据集
- 在data文件夹内创建自定义数据集的yaml文件,如下:
其中的train和val代表游戏数据集的路径,nc表示类的数量,names表示类的具体名称(一定要和之前做数据标注的类名顺序一致) - 将图片和图片标注存在在以下目录:
- 随后我们只需要将train.py中的
parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')
改为parser.add_argument('--data', type=str, default='data/valorant.yaml', help='data.yaml path')
其他不需要改变,然后运行train.py得到best.pt即可。我们可以为其重命名为best_valorant.py然后在dect.py中进行测试。