使用 YOLO 和计算机视觉进行目标跟踪 | 附完整代码

点击下方卡片,关注“小白玩转Python”公众号

YOLO 是一种能够实时进行目标检测的深度学习算法。您可以使用预训练的 YOLO 模型,如 YOLOv8 或 YOLOv9,或者在需要时在自定义数据集上训练自己的模型。在本文中,我将带您了解如何使用预训练的 YOLO 模型进行目标跟踪。这是最简单的教程,我们只处理简单的目标检测。

b52bfa97c37cc714bf7e10ee007110c7.png

让我们看看目标检测所涉及的步骤。

  1. 我们将加载模型

  2. 我们将加载视频

  3. 我们将逐帧提取视频

  4. 对每一帧进行预测并使用 OpenCV 显示结果

下面的图像总结了这些步骤:

748de02d630cddeab7a98de071f14fa7.png

目标检测步骤 让我们开始编码。

第 0 步:环境设置

我们需要两个库 ultralytics 和 opencv,您可以使用以下代码安装这些库。

 
 
pip install ultralytics opencv-python

导入所有必要的库。

 
 
import cv2 as cv
from ultralytics import YOLO

第 1 步:加载模型 

#load the model
model = YOLO('yolov8n.pt')

在 YOLO 中加载模型非常容易。我们可以直接使用 ultralytics 提供的 YOLO() 函数,并指定模型名称。一旦运行,它会自动在代码所在的文件夹中下载指定的 YOLO 模型。

第 2 步:加载视频 

我们使用 OpenCV 的 VideoCapture() 函数来加载视频。这个函数的输入是视频的路径。

path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)

第 3 步:提取帧 

一旦我们加载了视频,在下一步我们将逐个提取视频中的帧。视频是由连续拼接在一起的帧组成的。

  • vs = cv.VideoCapture(path):包含指向视频的指针。

  • vs.read():允许我们逐帧读取视频。一旦我们调用vs上的read函数,它将以迭代的方式返回当前的视频帧。

  • cv.imshow('image', frame):显示每个提取出的帧。

 
 
path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)


#load the model
model = YOLO('yolov8n.pt')
while True:
    (grabbed,frame) = vs.read()
    if not grabbed:
        break
    cv.imshow('image', frame)
    cv.waitKey(500)

第 4 步:应用预测 

模型的predict()方法是用于对每一帧进行预测的方法。预测结果存储在results变量中。在while循环中,我们从视频中提取每一帧,并在每一帧上进行预测。简单来说,我正在尝试在视频中的每一帧中检测对象。

results = model.predict(frame,stream=False)


path = "../videos/football_test.mp4"
    #read video
    vs = cv.VideoCapture(path)
    #load the model
    model = YOLO('yolov8n.pt')
    while True:
        (grabbed,frame) = vs.read()
        if not grabbed:
            break
        results = model.predict(frame,stream=False)
        cv.imshow('image', frame)
        cv.waitKey(500)

第 5 步:绘制边界框

为了绘制边界框,我创建了一个函数,该函数将输入图像、数据(包含预测结果)、检测到的类别名称,并返回带有检测到的对象边界框的图像。drawBox(data, image, name):data是预测详情,image是帧,name是检测到的类别名称,例如:人、汽车等。

def drawBox(data,image,name):
    x1, y1, x2, y2, conf, id = data
    p1 = (int(x1), int(y1))
    p2 = (int(x2), int(y2))
    cv.rectangle(image, p1, p2, (0, 0, 255), 3)
    cv.putText(image, name, p1, cv.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3)
    return image
    
results = model.predict(frame,stream=False)
for result in results:
     for data in result.boxes.data.tolist():
           #print(data)
           id = data[5]
           drawBox(data, frame,detection_classes[id])

由于结果包含了帧中所有检测到的对象的详细信息,我们在上述代码中对每个检测到的对象进行解码。对于每个检测,我们调用`drawBox(data, frame, detection_classes[id])`来在检测周围绘制边界框。

第 6 步:完整代码

您也可以在此处访问完整代码:https://github.com/sunnykumar1516/YOLO/blob/main/ReadVideoApplyYoloV8.py。

import cv2 as cv
from ultralytics import YOLO


def drawBox(data,image,name):
    x1, y1, x2, y2, conf, id = data
    p1 = (int(x1), int(y1))
    p2 = (int(x2), int(y2))
    cv.rectangle(image, p1, p2, (0, 0, 255), 3)
    cv.putText(image, name, p1, cv.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3)
    return image


detection_classes= []
 path = "../videos/football_test.mp4"
    #read video
 vs = cv.VideoCapture(path)
    #load the model
 model = YOLO('yolov8n.pt')
 while True:
    (grabbed,frame) = vs.read()
     if not grabbed:
            break
     results = model.predict(frame,stream=False)
     detection_classes = results[0].names
     for result in results:
         for data in result.boxes.data.tolist():
                #print(data)
                id = data[5]
                drawBox(data, frame,detection_classes[id])

完整代码参考:https://github.com/sunnykumar1516/YOLO/blob/main

·  END  ·

HAPPY LIFE

bf1ddd58f6b80d895baedb29c330e591.png

本文仅供学习交流使用,如有侵权请联系作者删除

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标跟踪计算机视觉领域的重要研究方向,sort算法是一种经典的目标跟踪算法,下面我对sort算法进行详解。 sort算法是通过目标检测和数据关联两个步骤实现目标跟踪的。首先,通过目标检测算法(如YOLO、Faster R-CNN等)得到当前帧中的目标检测结果,提取目标的特征信息。然后,使用匈牙利算法对当前帧中的目标进行数据关联,即将当前帧的目标与上一帧中的目标进行匹配。 在sort算法中,每个目标表示为一个状态向量,包含目标的位置、速度等信息。通过测量模型,可以计算预测的目标位置。在数据关联阶段,根据目标之间的距离来进行匹配,同时引入了IoU(交并比)和Kalman滤波器来进行更新和预测。 sort算法的核心思想是使用卡尔曼滤波器进行目标的状态估计和预测,并将目标与当前帧中的检测结果进行关联。通过最小化匹配目标和检测结果的距离,来得到最优的目标跟踪结果。同时,sort算法还引入了一些优化策略,如对目标进行过滤、使用历史信息来更新和预测目标等。 sort算法在实际应用中取得了较好的效果,具有较高的跟踪准确率和鲁棒性。但也存在一些限制,如对目标的形变和遮挡敏感,对目标速度变化较快的情况较为难以跟踪等。 总之,sort算法是一种经典的目标跟踪算法,通过目标检测和数据关联两个步骤来实现目标的跟踪。通过引入IoU和Kalman滤波器等技术,可以提高目标跟踪的准确性和稳定性。该算法在实际应用中有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值