打广告网站,discuz 网站标题,素材下载网站开发文档,手游传奇网站999服在一些人流量比较大的场合#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下#xff0c;密切关注当前系统所承载的人流量是十分必要的#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段#xff0c;本文的主要目的是想要…在一些人流量比较大的场合或者是一些特殊时刻、时段、节假日等特殊时期下密切关注当前系统所承载的人流量是十分必要的对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段本文的主要目的是想要基于通用的数据开发构建用于通用场景下的人群检测计数系统。
首先看下实例效果 简单看下实例数据情况 训练数据配置文件如下所示
# Dataset
path: ./dataset
train:- /data/dataset/images/train
val:- /data/dataset/images/test
test:- /data/dataset/images/test# Classes
names:0: person
如果对YOLOv8开发构建自己的目标检测项目有疑问的可以看下面的文章如下所示
《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》
非常详细的开发实践教程。本文这里就不再展开了因为从YOLOv8开始变成了一个安装包的形式整体跟v5和v7的使用差异还是比较大的。
YOLOv8核心特性和改动如下 1、提供了一个全新的SOTA模型state-of-the-art model包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于YOLACT的实例分割模型。和 YOLOv5 一样基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型用于满足不同场景需求 2、骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构并对不同尺度模型调整了不同的通道数属于对模型结构精心微调不再是一套参数应用所有模型大幅提升了模型性能。 3、Head 部分相比 YOLOv5 改动较大换成了目前主流的解耦头结构将分类和检测头分离同时也从Anchor-Based 换成了 Anchor-Free 4、Loss 计算方面采用了TaskAlignedAssigner正样本分配策略并引入了Distribution Focal Loss 5、训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作可以有效地提升精度
官方项目地址在这里如下所示 目前已经收获超过1.7w的star量了。官方提供的预训练模型如下所示
Modelsize (pixels)mAPval 50-95Speed CPU ONNX (ms)Speed A100 TensorRT (ms)params (M)FLOPs (B)YOLOv8n64037.380.40.993.28.7YOLOv8s64044.9128.41.2011.228.6YOLOv8m64050.2234.71.8325.978.9YOLOv8l64052.9375.22.3943.7165.2YOLOv8x64053.9479.13.5368.2257.8
另外一套预训练模型如下
Modelsize (pixels)mAPval 50-95Speed CPU ONNX (ms)Speed A100 TensorRT (ms)params (M)FLOPs (B)YOLOv8n64018.4142.41.213.510.5YOLOv8s64027.7183.11.4011.429.7YOLOv8m64033.6408.52.2626.280.6YOLOv8l64034.9596.92.4344.1167.4YOLOv8x64036.3860.63.5668.7260.6
是基于Open Image V7数据集构建的可以根据自己的需求进行选择使用即可。
YOLOv8的定位不仅仅是目标检测而是性能强大全面的工具库故而在任务类型上同时支持姿态估计、检测、分类、分割、跟踪多种类型可以根据自己的需要进行选择使用这里就不再详细展开了。
简单的实例实现如下所示
from ultralytics import YOLO# yolov8n
model YOLO(yolov8n.yaml).load(yolov8n.pt) # build from YAML and transfer weights
model.train(datadata/self.yaml, epochs100, imgsz640)# yolov8s
model YOLO(yolov8s.yaml).load(yolov8s.pt) # build from YAML and transfer weights
model.train(datadata/self.yaml, epochs100, imgsz640)# yolov8m
model YOLO(yolov8m.yaml).load(yolov8m.pt) # build from YAML and transfer weights
model.train(datadata/self.yaml, epochs100, imgsz640)# yolov8l
model YOLO(yolov8l.yaml).load(yolov8l.pt) # build from YAML and transfer weights
model.train(datadata/self.yaml, epochs100, imgsz640)# yolov8x
model YOLO(yolov8x.yaml).load(yolov8x.pt) # build from YAML and transfer weights
model.train(datadata/self.yaml, epochs100, imgsz640)
这里我们依次选择n、s、m、l和x五款不同参数量级的模型来进行开发。
这里给出yolov8的模型文件如下
# Parameters nc: 1 # number of classes scales: # model compound scaling constants, i.e. modelyolov8n.yaml will call yolov8.yaml with scale n # [depth, width, max_channels] n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPs s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs # YOLOv8.0n backbone backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C2f, [128, True]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 6, C2f, [256, True]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 6, C2f, [512, True]] - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 3, C2f, [1024, True]] - [-1, 1, SPPF, [1024, 5]] # 9 # YOLOv8.0n head head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C2f, [512]] # 12 - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 3, C2f, [256]] # 15 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 12], 1, Concat, [1]] # cat head P4 - [-1, 3, C2f, [512]] # 18 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 9], 1, Concat, [1]] # cat head P5 - [-1, 3, C2f, [1024]] # 21 (P5/32-large) - [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
囊括了五款不同参数量级的模型。在训练结算保持相同的参数设置等待训练完成后我们横向对比可视化来整体对比分析。
【Precision曲线】 精确率曲线Precision-Recall Curve是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。 精确率Precision是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率Recall是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。 绘制精确率曲线的步骤如下 使用不同的阈值将预测概率转换为二进制类别标签。通常当预测概率大于阈值时样本被分类为正例否则分类为负例。 对于每个阈值计算相应的精确率和召回率。 将每个阈值下的精确率和召回率绘制在同一个图表上形成精确率曲线。 根据精确率曲线的形状和变化趋势可以选择适当的阈值以达到所需的性能要求。 通过观察精确率曲线我们可以根据需求确定最佳的阈值以平衡精确率和召回率。较高的精确率意味着较少的误报而较高的召回率则表示较少的漏报。根据具体的业务需求和成本权衡可以在曲线上选择合适的操作点或阈值。 精确率曲线通常与召回率曲线Recall Curve一起使用以提供更全面的分类器性能分析并帮助评估和比较不同模型的性能。 【Recall曲线】 召回率曲线Recall Curve是一种用于评估二分类模型在不同阈值下的召回率性能的可视化工具。它通过绘制不同阈值下的召回率和对应的精确率之间的关系图来帮助我们了解模型在不同阈值下的表现。 召回率Recall是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。召回率也被称为灵敏度Sensitivity或真正例率True Positive Rate。 绘制召回率曲线的步骤如下 使用不同的阈值将预测概率转换为二进制类别标签。通常当预测概率大于阈值时样本被分类为正例否则分类为负例。 对于每个阈值计算相应的召回率和对应的精确率。 将每个阈值下的召回率和精确率绘制在同一个图表上形成召回率曲线。 根据召回率曲线的形状和变化趋势可以选择适当的阈值以达到所需的性能要求。 通过观察召回率曲线我们可以根据需求确定最佳的阈值以平衡召回率和精确率。较高的召回率表示较少的漏报而较高的精确率意味着较少的误报。根据具体的业务需求和成本权衡可以在曲线上选择合适的操作点或阈值。 召回率曲线通常与精确率曲线Precision Curve一起使用以提供更全面的分类器性能分析并帮助评估和比较不同模型的性能。 【F1值曲线】 F1值曲线是一种用于评估二分类模型在不同阈值下的性能的可视化工具。它通过绘制不同阈值下的精确率Precision、召回率Recall和F1分数的关系图来帮助我们理解模型的整体性能。 F1分数是精确率和召回率的调和平均值它综合考虑了两者的性能指标。F1值曲线可以帮助我们确定在不同精确率和召回率之间找到一个平衡点以选择最佳的阈值。 绘制F1值曲线的步骤如下 使用不同的阈值将预测概率转换为二进制类别标签。通常当预测概率大于阈值时样本被分类为正例否则分类为负例。 对于每个阈值计算相应的精确率、召回率和F1分数。 将每个阈值下的精确率、召回率和F1分数绘制在同一个图表上形成F1值曲线。 根据F1值曲线的形状和变化趋势可以选择适当的阈值以达到所需的性能要求。 F1值曲线通常与接收者操作特征曲线ROC曲线一起使用以帮助评估和比较不同模型的性能。它们提供了更全面的分类器性能分析可以根据具体应用场景来选择合适的模型和阈值设置 综合对比来看在密集人群检测计数场景下n系列模型的表现最差s系列的模型由于n系列的模型但是效果也是不尽人意m、l和x三个系列的模型没有拉开明显的差距x系列模型最优综合考虑参数推理速度最终选择使用m系列的模型作为线上推理模型。
接下来我们详细看下m系列模型的结果
【PR】 【Batch实例】 【训练可视化】 感兴趣的话也都可以试试看