yolov5+deepsort实现实时键盘自动切换单目标跟踪

Posted 成都_小吴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yolov5+deepsort实现实时键盘自动切换单目标跟踪相关的知识,希望对你有一定的参考价值。

距离上一次博客好像有一段时间了,一直在搞瑞芯微、海思之类的东西也没搞不明白,最近我的好同学有一个需求或者项目上有一些需求,如何实现单目标跟踪用键盘自动切换目标进行跟踪,我只能从python的yolov5+deepsort进行入手,我的好同学的话是用在jeston NX英伟达的板子上使用tensortRT进行实现,这里我只能实现python的版本,实现键盘输入目标ID进行跟踪:大家可以看下面的效果:

目标跟踪

首先代码中要使用键盘响应事件,这个键盘响应事件查阅资料必须与GUI-opencv结合使用才可以,所以要在显示图片的地方进行键盘响应事件,如下:

                cv2.imshow(p, im0)
                key = cv2.waitKey(1)
                if(key == 49):
                    a.append(key-48)
                if(key == 50):
                    a.append(key-48)
                if(key == 51):
                    a.append(key-48)
                if(key == 52):
                    a.append(key-48)
                if(key == 53):
                    a.append(key-48)
                if (key == 54):
                    a.append(key - 48)
                if (key == 55):
                    a.append(key - 48)
                if (key == 56):
                    a.append(key - 48)
                if (key == 57):
                    a.append(key - 48)

大家可以看到这里是有一个元组a,为什么要设置这个元组呢,因为检测图片是在不断地刷新KEY的值,这样通过key按键进行目标切换每次循环都会重置,所以需要将你的切换目标的ID存放在一个全局变量a = []中,下面就是切换ID的函数,如果我输入键盘1,则KEY==49,a里面就成了a[1];如果跟踪第一个目标则a的长度为1,要跟踪的ID号就是a[0],只将ID号为1的目标进行输出,或者将这个目标的坐标传递出来给转台进行转动,如果想要切换跟踪自己的目标键盘输入;2,则这时key==50,a[1,2];a[1] == 2;所以这是len(a)==2,选择跟踪第二个目标,对第二个目标的信息进行输出。

def draw_boxes(img, bbox, identities=None, offset=(0, 0)):
    for i, box in enumerate(bbox):
        x1, y1, x2, y2 = [int(i) for i in box]
        x1 += offset[0]
        x2 += offset[0]
        y1 += offset[1]
        y2 += offset[1]
        # box text and bar
        id = int(identities[i]) if identities is not None else 0
        if(len(a) == 1):
            if (id == a[0]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 3):
            if(id == a[2]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 4):
            if(id == a[3]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 5):
            if(id == a[4]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 6):
            if(id == a[5]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 7):
            if(id == a[6]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 8):
            if(id == a[7]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 9):
            if(id == a[8]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) > 9):
            if(id == a[len(a) - 1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)

        else:
            color = compute_color_for_labels(id)
            label = ':d'.format("", id)
            t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
            cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
            cv2.rectangle(
                img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
            cv2.putText(img, label, (x1, y1 +
                                     t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 2, [255, 

此代码只针对少目标的单目标跟踪比如飞机、坦克、船之类的,所以我们还需要改动的地方就是ID号的限制,我们将ID号限制在9以内如下:在deepsort的tracker里面进行ID的限制,大家也可以根据自己的需求进行设置:

    def _initiate_track(self, detection):
        mean, covariance = self.kf.initiate(detection.to_xyah())
        self.tracks.append(Track(
            mean, covariance, self._next_id, self.n_init, self.max_age,
            detection.feature))
        self._next_id += 1
        if (self._next_id==10):
              self._next_id = 1

下面是完整的track.py代码大家可以自行修改。

import sys
sys.path.insert(0, './yolov5')

from yolov5.utils.google_utils import attempt_download
from yolov5.models.experimental import attempt_load
from yolov5.utils.datasets import LoadImages, LoadStreams
from yolov5.utils.general import check_img_size, non_max_suppression, scale_coords, \\
    check_imshow
from yolov5.utils.torch_utils import select_device, time_synchronized
from deep_sort_pytorch.utils.parser import get_config
from deep_sort_pytorch.deep_sort import DeepSort
import argparse
import os
import platform
import shutil
import time
from pathlib import Path
import cv2
import torch
import torch.backends.cudnn as cudnn
a = []
palette = (2 ** 11 - 1, 2 ** 15 - 1, 2 ** 20 - 1)

def xyxy_to_xywh(*xyxy):
    """" Calculates the relative bounding box from absolute pixel values. """
    bbox_left = min([xyxy[0].item(), xyxy[2].item()])
    bbox_top = min([xyxy[1].item(), xyxy[3].item()])
    bbox_w = abs(xyxy[0].item() - xyxy[2].item())
    bbox_h = abs(xyxy[1].item() - xyxy[3].item())
    x_c = (bbox_left + bbox_w / 2)
    y_c = (bbox_top + bbox_h / 2)
    w = bbox_w
    h = bbox_h
    return x_c, y_c, w, h

def xyxy_to_tlwh(bbox_xyxy):
    tlwh_bboxs = []
    for i, box in enumerate(bbox_xyxy):
        x1, y1, x2, y2 = [int(i) for i in box]
        top = x1
        left = y1
        w = int(x2 - x1)
        h = int(y2 - y1)
        tlwh_obj = [top, left, w, h]
        tlwh_bboxs.append(tlwh_obj)
    return tlwh_bboxs


def compute_color_for_labels(label):
    """
    Simple function that adds fixed color depending on the class
    """
    color = [int((p * (label ** 2 - label + 1)) % 255) for p in palette]
    return tuple(color)


def draw_boxes(img, bbox, identities=None, offset=(0, 0)):
    for i, box in enumerate(bbox):
        x1, y1, x2, y2 = [int(i) for i in box]
        x1 += offset[0]
        x2 += offset[0]
        y1 += offset[1]
        y2 += offset[1]
        # box text and bar
        id = int(identities[i]) if identities is not None else 0
        if(len(a) == 1):
            if (id == a[0]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 2):
            if(id == a[1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 3):
            if(id == a[2]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 4):
            if(id == a[3]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 5):
            if(id == a[4]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 6):
            if(id == a[5]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 7):
            if(id == a[6]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 8):
            if(id == a[7]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) == 9):
            if(id == a[8]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)
        elif(len(a) > 9):
            if(id == a[len(a) - 1]):
                color = compute_color_for_labels(id)
                label = ':d'.format("", id)
                t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
                cv2.rectangle(
                    img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
                cv2.putText(img, label, (x1, y1 +
                                         t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 5, [255, 0, 0], 10)

        else:
            color = compute_color_for_labels(id)
            label = ':d'.format("", id)
            t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]
            cv2.rectangle(img, (x1, y1), (x2, y2), color, 3)
            cv2.rectangle(
                img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
            cv2.putText(img, label, (x1, y1 +
                                     t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 2, [255, 255, 255], 2)
    return img


def detect(opt):
    out, source, yolo_weights, deep_sort_weights, show_vid, save_vid, save_txt, imgsz, evaluate = \\
        opt.output, opt.source, opt.yolo_weights, opt.deep_sort_weights, opt.show_vid, opt.save_vid, \\
            opt.save_txt, opt.img_size, opt.evaluate
    webcam = source == '0' or source.startswith(
        'rtsp') or source.startswith('http') or source.endswith('.txt')

    # initialize deepsort
    cfg = get_config()
    cfg.merge_from_file(opt.config_deepsort)
    attempt_download(deep_sort_weights, repo='mikel-brostrom/Yolov5_DeepSort_Pytorch')
    deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT,
                        max_dist=cfg.DEEPSORT.MAX_DIST, min_confidence=cfg.DEEPSORT.MIN_CONFIDENCE,
                        nms_max_overlap=cfg.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distance=cfg.DEEPSORT.MAX_IOU_DISTANCE,
                        max_age=cfg.DEEPSORT.MAX_AGE, n_init=cfg.DEEPSORT.N_INIT, nn_budget=cfg.DEEPSORT.NN_BUDGET,
                        use_cuda=True)

    # Initialize
    device = select_device(opt.device)

    # The MOT16 evaluation runs multiple inference streams in parallel, each one writing to
    # its own .txt file. Hence, in that case, the output folder is not restored
    if not evaluate:
        if os.path.exists(out):
            pass
            shutil.rmtree(out)  # delete output folder
        os.makedirs(out)  # make new output folder
    half = device.type != 'cpu'  # half precision only supported on CUDA

    # Load model
    model = attempt_load(yolo_weights, map_location=device)  # load FP32 model
    stride = int(model.stride.max())  # model stride
    imgsz = check_img_size(imgsz, s=stride)  # check img_size
    names = model.module.names if hasattr(model, 'module') else model.names  # get class names
    if half:
        model.half()  # to FP16

    # Set Dataloader
    vid_path, vid_writer = None, None
    # Check if environment supports image displays
    if show_vid:
        show_vid = check_imshow()

    if webcam:
        cudnn.benchmark = True  # set True to speed up constant image size inference
        dataset = LoadStreams(source, img_size=imgsz, stride=stride)
    else:
        dataset = LoadImages(source, img_size=imgsz)

    # Get names and colors
    names = model.module.names if hasattr(model, 'module') else model.names

    # Run inference
    if device.type != 'cpu':
        model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters())))  # run once
    t0 = time.time()

    save_path = str(Path(out))
    # extract what is in between the last '/' and last '.'
    txt_file_name = source.split('/')[-1].split('.')[0]
    txt_path = str(Path(out)) + '/' + txt_file_name + '.txt'
    for frame_idx, (path, img, im0s, vid_cap) in enumerate(dataset):
        img = torch.from_numpy(img).to(device)
        img = img.half() if half else img.float()  # uint8 to fp16/32
        img /= 255.0  # 0 - 255 to 0.0 - 1.0
        if img.ndimension() == 3:
            img = img.unsqueeze(0)

        # Inference
        t1 = time_synchronized()
        pred = model(img, augment=opt.augment)[0]

        # Apply NMS
        pred = non_max_suppression(
            pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)
        t2 = time_synchronized()

        # Process detections
        for i, det in enumerate(pred):  # detections per image
            if webcam:  # batch_size >= 1
                p, s, im0 = path[i], '%g: ' % i, im0s[i].copy()
            else:
                p, s, im0 = path, '', im0s

            s += '%gx%g ' % img.shape[2:]  # print string
            save_path = str(Path(out) / Path(p).name)

            if det is not None and len(det):
                # Rescale boxes from img_size to im0 size
                det[:, :4] = scale_coords(
                    img.shape[2:], det[:, :4], im0.shape).round()

                # Print results
                for c in det[:, -1].unique():
                    n = (det[:, -1] == c).sum()  # detections per class
                    s += '%g %ss, ' % (n, names[int(c)])  # add to string

                xywh_bboxs = []
                confs = []

                # Adapt detections to deep sort input format
                for *xyxy, conf, cls in det:
                    # to deep sort format
                    x_c, y_c, bbox_w, bbox_h = xyxy_to_xywh(*xyxy)
                    xywh_obj = [x_c, y_c, bbox_w, bbox_h]
                    xywh_bboxs.append(xywh_obj)
                    confs.append([conf.item()])

                xywhs = torch.Tensor(xywh_bboxs)
                confss = torch.Tensor(confs)

                # pass detections to deepsort
                outputs = deepsort.update(xywhs, confss, im0)

                # draw boxes for visualization
                if len(outputs) > 0:
                    bbox_xyxy = outputs[:, :4]
                    identities = outputs[:, -1]
                    draw_boxes(im0, bbox_xyxy, identities)
                    # to MOT format
                    tlwh_bboxs = xyxy_to_tlwh(bbox_xyxy)

                    # Write MOT compliant results to file
                    # if save_txt:
                    #     for j, (tlwh_bbox, output) in enumerate(zip(tlwh_bboxs, outputs)):
                    #         bbox_top = tlwh_bbox[0]
                    #         bbox_left = tlwh_bbox[1]
                    #         bbox_w = tlwh_bbox[2]
                    #         bbox_h = tlwh_bbox[3]
                    #         identity = output[-1]
                    #         with open(txt_path, 'a') as f:
                    #             f.write(('%g ' * 10 + '\\n') % (frame_idx, identity, bbox_top,
                    #                                         bbox_left, bbox_w, bbox_h, -1, -1, -1, -1))  # label format

            else:
                deepsort.increment_ages()

            # Print time (inference + NMS)
            # print('%sDone. (%.3fs)' % (s, t2 - t1))

            # Stream results
            if 1:
                cv2.imshow(p, im0)
                key = cv2.waitKey(1)
                if(key == 49):
                    a.append(key-48)
                if(key == 50):
                    a.append(key-48)
                if(key == 51):
                    a.append(key-48)
                if(key == 52):
                    a.append(key-48)
                if(key == 53):
                    a.append(key-48)
                if (key == 54):
                    a.append(key - 48)
                if (key == 55):
                    a.append(key - 48)
                if (key == 56):
                    a.append(key - 48)
                if (key == 57):
                    a.append(key - 48)
            # Save results (image with detections)
            # if 1:
            #     if vid_path != save_path:  # new video
            #         vid_path = save_path
            #         if isinstance(vid_writer, cv2.VideoWriter):
            #             vid_writer.release()  # release previous video writer
            #         if vid_cap:  # video
            #             fps = vid_cap.get(cv2.CAP_PROP_FPS)
            #             w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            #             h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            #         else:  # stream
            #             fps, w, h = 30, im0.shape[1], im0.shape[0]
            #             save_path += '.mp4'
            #
            #         vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
            #     vid_writer.write(im0)

    # if save_txt or save_vid:
    #     print('Results saved to %s' % os.getcwd() + os.sep + out)
    #     if platform == 'darwin':  # MacOS
    #         os.system('open ' + save_path)

    # print('Done. (%.3fs)' % (time.time() - t0))


if __name__ == '__main__':
    # a = cv2.imread('194.jpg')
    parser = argparse.ArgumentParser()
    parser.add_argument('--yolo_weights', type=str, default='yolov5/weights/yolov5s.pt', help='model.pt path')
    parser.add_argument('--deep_sort_weights', type=str, default='deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7', help='ckpt.t7 path')
    # file/folder, 0 for webcam
    parser.add_argument('--source', type=str, default='./Demo.mp4', help='source')
    parser.add_argument('--output', type=str, default='inference/output', help='output folder')  # output folder
    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
    parser.add_argument('--conf-thres', type=float, default=0.4, help='object confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.5, help='IOU threshold for NMS')
    parser.add_argument('--fourcc', type=str, default='mp4v', help='output video codec (verify ffmpeg support)')
    parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--show-vid', action='store_true', help='display tracking video results')
    parser.add_argument('--save-vid', action='store_true', help='save video tracking results')
    parser.add_argument('--save-txt', action='store_true', help='save MOT compliant results to *.txt')
    # class 0 is person, 1 is bycicle, 2 is car... 79 is oven
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 16 17')
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    parser.add_argument('--evaluate', action='store_true', help='augmented inference')
    parser.add_argument("--config_deepsort", type=str, default="deep_sort_pytorch/configs/deep_sort.yaml")
    args = parser.parse_args()
    args.img_size = check_img_size(args.img_size)

    with torch.no_grad():
        detect(args)

大家如果有兴趣的话可以进群交流:135163517

以上是关于yolov5+deepsort实现实时键盘自动切换单目标跟踪的主要内容,如果未能解决你的问题,请参考以下文章

视频实时行为检测——基于yolov5+deepsort+slowfast算法

yolov5+deepsort+slowfast复现

基于Yolov5的目标追踪(非Yolov5+DeepSort版)

用C++部署yolov5+deepsort+tensorrt实现目标跟踪

基于yolov5和deepsort的行人车辆的检测跟踪和计数(课程设计)

简单易上手YOLOV5-deepsort(Windows)