深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数(1)https://developer.aliyun.com/article/1536937
2. 数据集准备与训练
通过网络上搜集关于行人的各类图片
,并使用LabelImg标注工具对每张图片中的目标边框(Bounding Box)及类别进行标注。一共包含10000张图片
,其中训练集包含8000张图片
,验证集包含2000张图片
,部分图像及标注如下图所示。
图片数据的存放格式如下,在项目目录中新建datasets
目录,同时将检测的图片分为训练集与验证集放入Data
目录下。
同时我们需要新建一个data.yaml
文件,用于存储训练数据的路径及模型需要进行检测的类别。YOLOv8在进行模型训练时,会读取该文件的信息,用于进行模型的训练与验证。data.yaml
的具体内容如下:
train: E:\MyCVProgram\PersonDetection\datasets\Data\images\train val: E:\MyCVProgram\PersonDetection\datasets\Data\images\val # number of classes nc: 1 # class names names: ['person']
注:train与val后面表示需要训练图片的路径,建议直接写自己文件的绝对路径。
数据准备完成后,通过调用train.py
文件进行模型训练,epochs
参数用于调整训练的轮数,batch
参数用于调整训练的批次大小【根据内存大小调整,最小为1】,代码如下:
#coding:utf-8 from ultralytics import YOLO import matplotlib matplotlib.use('TkAgg') if __name__ == '__main__': # 模型配置文件路径 model_yaml_path = 'ultralytics/cfg/models/v8/yolov8.yaml' # 加载模型配置文件 model = YOLO(model_yaml_path) # 加载官方预训练模型 model.load('yolov8n.pt') # 训练模型 print("开始训练模型...") results = model.train(data='datasets/Data/data.yaml', epochs=150, batch=4)
3. 训练结果评估
在模型训练结束后,可以在runs/
目录下找到训练过程及结果文件,如下所示:
在深度学习中,我们通常用损失函数下降的曲线来观察模型训练的情况。YOLOv8在训练时主要包含三个方面的损失:定位损失(box_loss)、分类损失(cls_loss)和动态特征损失(dfl_loss)
。
各损失函数作用说明:
定位损失box_loss
:预测框与标定框之间的误差(GIoU),越小定位得越准;
分类损失cls_loss
:计算锚框与对应的标定分类是否正确,越小分类得越准;
动态特征损失(dfl_loss)
:DFLLoss是一种用于回归预测框与目标框之间距离的损失函数。在计算损失时,目标框需要缩放到特征图尺度,即除以相应的stride,并与预测的边界框计算Ciou Loss,同时与预测的anchors中心点到各边的距离计算回归DFLLoss。这个过程是YOLOv8训练流程中的一部分,通过计算DFLLoss可以更准确地调整预测框的位置,提高目标检测的准确性。
本文训练结果如下:
我们通常用PR曲线
来体现精确率和召回率的关系,本文训练结果的PR曲线如下。mAP
表示Precision和Recall作为两轴作图后围成的面积,m表示平均,@后面的数表示判定iou为正负样本的阈值。mAP@.5:表示阈值大于0.5的平均mAP,可以看到本文模型两类目标检测的mAP@0.5
平均值为0.934
,结果还是非常不错的。
4. 使用模型进行检测
模型训练完成后,我们可以得到一个最佳的训练结果模型best.pt
文件,在runs/trian/weights
目录下。我们可以使用该文件进行后续的推理检测。
图片检测代码如下:
#coding:utf-8 from ultralytics import YOLO import cv2 # 所需加载的模型目录 path = 'models/best.pt' # 需要检测的图片地址 img_path = "TestFiles/s107.jpg" # 加载预训练模型 model = YOLO(path, task='detect') # 检测图片 results = model(img_path) print(results) res = results[0].plot() # res = cv2.resize(res,dsize=None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR) cv2.imshow("YOLOv8 Detection", res) cv2.waitKey(0)
执行上述代码后,会将检测的结果直接标注在图片上,结果如下:
三、使用ByteTrack进行目标追踪
ByteTrack算法简介
论文地址:https://arxiv.org/abs/2110.06864
源码地址:https://github.com/ifzhang/ByteTrack
ByteTrack算法是一种十分强大且高效的追踪算法
,和其他非ReID的算法一样,仅仅使用目标追踪所得到的bbox进行追踪
。追踪算法使用了卡尔曼滤波预测边界框,然后使用匈牙利算法进行目标和轨迹间的匹配。
ByteTrack算法的最大创新点就是对低分框的使用
,作者认为低分框可能是对物体遮挡时产生的框,直接对低分框抛弃会影响性能,所以作者使用低分框对追踪算法进行了二次匹配,有效优化了追踪过程中因为遮挡造成换id的问题。
- 没有使用ReID特征计算外观相似度
- 非深度方法,不需要训练
- 利用高分框和低分框之间的区别和匹配,有效解决遮挡问题
ByteTrack与其他追踪算法的对比如下图所示,可以看到ByteTrack的性能还是相当不错的。
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数(3)https://developer.aliyun.com/article/1536939