YOLOv8+DeepSORT多目标车辆跟踪
时间: 2025-01-05 18:36:54 浏览: 13
### 使用YOLOv8和DeepSORT实现多目标车辆跟踪
#### YOLOv8:革命性的车辆检测
YOLOv8 是一种先进的实时物体检测模型,在速度和准确性方面表现出色。该模型能够快速识别图像中的车辆,并提供精确的位置信息[^1]。
#### DeepSORT:增强型目标跟踪算法
DeepSORT 基于SORT(简单在线实时跟踪),通过引入深度学习技术来提高目标跟踪的效果。它不仅保持了SORT的高效性,还增强了跨帧间目标一致性,确保即使在遮挡或其他复杂情况下也能稳定跟踪目标[^3]。
#### 实现方法概述
为了实现多目标车辆跟踪,通常会结合YOLOv8进行初步的对象检测,随后利用DeepSORT完成后续的轨迹预测与身份管理:
- 加载预训练好的YOLOv8权重文件。
- 设置DeepSORT所需的参数,比如最大丢失次数、匹配阈值等。
- **数据处理流程**
- 对每一帧输入图片执行YOLOv8推理操作获取当前时刻所有可能存在的车辆边界框及其置信度分数。
- 将这些检测结果传递给DeepSORT模块作为新观测值更新现有轨迹状态;对于未被任何已知轨迹关联的新出现对象,则创建新的轨迹实例。
- **输出展示**
- 经过上述两步之后即可得到带有唯一ID编号以及历史运动路径记录的各个车辆实体信息列表。
- 可视化部分可以采用OpenCV库绘制矩形标注出各辆车所在位置并附加相应标签显示其ID号。
```python
import cv2
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort
# 初始化YOLOv8模型
model = YOLO('yolov8n.pt')
# 创建DeepSORT实例
tracker = DeepSort(max_age=30, n_init=2)
cap = cv2.VideoCapture(0) # 打开摄像头或读取视频文件
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)[0].boxes.data.cpu().numpy()[:, :4]
detections = []
for bbox in results:
x1, y1, x2, y2 = map(int, bbox)
confidences = [float(confidence)] * len(results)
class_ids = [0] * len(results) # 这里假设只关心类别为'car'
detection = Detection(bbox=bbox.tolist(), confidence=max(confidences), class_id=int(class_ids))
detections.append(detection)
tracks = tracker.update_tracks(detections, frame=frame)
for track in tracks:
if not track.is_confirmed():
continue
track_bbox = track.to_tlbr()
id_num = str(track.track_id)
label = f'{id_num}'
(label_width, label_height), baseline = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.75, 2)
cv2.rectangle(frame, (int(track_bbox[0]), int(track_bbox[1])-(label_height+baseline)),
(int(track_bbox[0])+label_width, int(track_bbox[1])), (255, 255, 255), cv2.FILLED)
cv2.putText(frame, label, (int(track_bbox[0]), int(track_bbox[1])-2),
cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 0), 2)
cv2.rectangle(frame, (int(track_bbox[0]), int(track_bbox[1])),
(int(track_bbox[2]), int(track_bbox[3])), (255, 255, 255), 2)
cv2.imshow("Tracking", frame)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
```
阅读全文