yolov5行人跟踪
使用YOLOv5实现行人跟踪
为了使用YOLOv5实现行人跟踪,通常会结合其他算法来增强功能。具体来说,在YOLOv5的基础上加入DeepSort能够有效地完成这一任务[^3]。
数据集准备
首先需要准备好标注好的数据集用于训练YOLOv5模型。这些数据应该包含大量不同场景下的行人图片,并且每张图中的行人都已被框选并分类标记好。对于特定应用场景还可以收集额外的数据以提升模型对该环境的理解力和适应性。
YOLOv5模型训练
安装PyTorch和其他依赖库之后,可以从官方GitHub仓库克隆YOLOv5项目源码。按照文档说明调整配置文件参数(如batch size、epochs等),然后利用之前准备的数据集启动训练流程。经过充分迭代后保存最优权重供后续部署调用。
DeepSort集成
当拥有一个表现良好的YOLOv5检测器时,下一步就是引入DeepSort来进行多目标追踪处理。这涉及到两个主要组件——外观描述符(Appearance Descriptor)与运动预测机制(Motion Model)。前者负责计算物体间的相似度得分;后者则基于卡尔曼滤波估计目标可能移动的方向及速度变化趋势。
from deep_sort import preprocessing
from deep_sort import nn_matching
from deep_sort.detection import Detection
from deep_sort.tracker import Tracker
from tools import generate_detections as gdet
max_cosine_distance = 0.4
nn_budget = None
nms_max_overlap = 1.0
model_filename = 'mars-small128.pb'
encoder = gdet.create_box_encoder(model_filename, batch_size=1)
metric = nn_matching.NearestNeighborDistanceMetric("cosine", max_cosine_distance, nn_budget)
tracker = Tracker(metric)
上述代码片段展示了初始化DeepSort所需对象的过程,包括加载预训练的人脸重识别模型作为外观特征提取工具,设置最大余弦距离阈值控制匹配严格程度,创建Tracker
实例管理整个跟踪逻辑。
实现实时展示
最后一步是借助Streamlit框架搭建简易友好的前端页面,让用户可以通过浏览器轻松访问到行人跟踪服务。编写Python脚本读取摄像头流或本地视频文件帧画面,依次送入YOLOv5做边界框定位再交给DeepSort更新轨迹状态,最终把带有编号标签的结果渲染出来呈现给访客查看。
import streamlit as st
import numpy as np
import cv2
st.title('Pedestrian Tracking with YOLOv5 and DeepSort')
capture = cv2.VideoCapture('./video/test.mp4')
while True:
ret, frame = capture.read()
# Perform object detection using yolov5 here
detections = [] # List of bounding boxes from yolov5 output
features = encoder(frame, detections)
dets = [Detection(bbox, score, feature) for bbox, score, feature in zip(detections, scores, features)]
out_boxes = []
out_scores = []
indices = preprocessing.non_max_suppression(np.array([det.confidence for det in dets]), nms_max_overlap)
for i in indices:
out_boxes.append(dets[i].tlbr)
out_scores.append(dets[i].confidence)
tracker.predict()
tracker.update(out_boxes, out_scores)
for track in tracker.tracks:
if not track.is_confirmed() or track.time_since_update > 1:
continue
bbox = track.to_tlbr()
id_num = str(track.track_id)
label = f'ID:{id_num}'
cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])),(255,255,255), 2)
cv2.putText(frame, label,(int(bbox[0]), int(bbox[1])-10),0, 5e-3 * 200, (0,255,0),2)
st.image(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
这段程序实现了基本的功能模块组合,即从获取输入影像资料开始直到输出带有序号标识的人物轮廓为止的一系列操作。注意这里仅给出简化版伪代码示意,实际开发过程中还需要考虑更多细节优化问题。
相关推荐

















