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

Posted 荣仔!最靓的仔!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Yolov5的目标追踪(非Yolov5+DeepSort版)相关的知识,希望对你有一定的参考价值。

目录

1 效果演示

2 实现细节

2.1 获取预测目标框坐标位置信息

2.2 计算两框的 IoU

2.3 实现视频画面暂停播放

2.4 实现在暂停视频画面后对目标框选

2.5 OpenCV画线、画框、画点等

3 源码地址


1 效果演示

基于yolov5的目标跟踪(非yolov5+deepsort版)

:目标跟踪,全网都用的是 。仅用  可以实现吗?可以。该视频效果实现的是手动暂停正在播放的视频,在画面中对待跟踪目标进行矩形框选,再让视频播放时即可对目标进行跟踪(包括目标框定位和轨迹划线等) 

2 实现细节

2.1 获取预测目标框坐标位置信息

# 前向推理
pred = model(img, augment=False)[0]

# NMS去除多余的框
pred = non_max_suppression(pred, conf_thres, iou_thres, agnostic=False)

# 开始预测
for i, det in enumerate(pred):
    if det is not None and len(det):
        # 将框从img大小重新缩放为im0大小
        det[:, :4] = scale_coords(img.shape[2:], det[:, :4], showimg.shape).round()

        for *xyxy, conf, cls in reversed(det):
            str_xyxy = (torch.tensor(xyxy).tolist())
            print('获得的目标框位置信息:', str_xyxy)

2.2 计算两框的 IoU

# 第一个矩形框面积
parea = (pxmax - pxmin) * (pymax - pymin)
# 第二个矩形框面积
garea = (gxmax - gxmin) * (gymax - gymin)
# 相交处矩形框四角位置坐标
xmin = max(pxmin, gxmin)
ymin = max(pymin, gymin)
xmax = min(pxmax, gxmax)
ymax = min(pymax, gymax)
# 相交处矩形框长和宽
w = xmax - xmin
h = ymax - ymin
# 若没有交集,则IoU值为0
if w < 0 or h < 0:
    print('IoU值为:0')
# 否则进行IoU值的运算,并将结果返回输出
area = w * h
print('IoU值为:', area / (parea + garea - area))

2.3 实现视频画面暂停播放

import cv2

capture = cv2.VideoCapture(0)
while True:
    ret, frame = capture.read()
    cv2.imshow('Video', frame)
    k = cv2.waitKey(1)
    if k == 32:           # 按下空格键即可无限次实现暂停/播放画面效果
        cv2.waitKey(0)

2.4 实现在暂停视频画面后对目标框选

import cv2

# 获取鼠标位置
def draw_circle(event, x, y, flags, param):
    global xmin, ymin, xmax, ymax
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x, y)
        xmin, ymin = x, y
    elif event == cv2.EVENT_LBUTTONUP:
        print(x, y)
        xmax, ymax = x, y

xmin, ymin, xmax, ymax = 0, 0, 0, 0
cv2.namedWindow('img')
cv2.setMouseCallback('img', draw_circle)

capture = cv2.VideoCapture(0)
while True:
    ret, frame = capture.read()
    cv2.imshow('Video', frame)
    k = cv2.waitKey(1)
    if k == 32:        # 按下空格暂停,画框后再按下空格,目标框即可出现
        cv2.imshow('img', frame)
        frame_rect = frame.copy()
        cv2.rectangle(frame_rect, (xmin, ymin), (xmax, ymax), (0, 255, 0), 1)
        cv2.imshow('img', frame_rect)
        cv2.waitKey(0)

2.5 OpenCV画线、画框、画点等

画圆/点 

cv2.circle(image, center_coordinates, radius, color, thickness)
  • image:它是要在其上绘制圆的图像。
  • center_coordinates:它是圆的中心坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
  • radius:它是圆的半径。
  • color:它是要绘制的圆的边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
  • thickness:它是圆边界线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状。

画框

cv2.rectangle(image, start_point, end_point, color, thickness)
  • image:它是要在其上绘制矩形的图像。
  • start_point:它是矩形的起始坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
  • end_point:它是矩形的结束坐标。坐标表示为两个值的元组,即(X坐标值ÿ坐标值)。
  • color:它是要绘制的矩形的边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
  • thickness:它是矩形边框线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状。 

画线

cv2.line(image, start_point, end_point, color, thickness)
  • image:它是要在其上绘制线段的图像。
  • start_point:它是线段的起始坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
  • end_point:它是线段的结束坐标。坐标表示为两个值的元组,即(X坐标值ÿ坐标值)。
  • color:它是要绘制的线段的边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
  • thickness:它是设定线段的粗细像素。

3 源码地址

https://github.com/zhao302014/Classic_model_examples/tree/main/2021_Yolov5_CountAndTrackhttps://github.com/zhao302014/Classic_model_examples/tree/main/2021_Yolov5_CountAndTrack


 END 

以上是关于基于Yolov5的目标追踪(非Yolov5+DeepSort版)的主要内容,如果未能解决你的问题,请参考以下文章

简单易上手YOLOV5-deepsort(Windows)

YoloV5+GSConv:基于YoloV5GSConv得小目标检测算法训练

基于YOLOv5的水下海洋目标检测

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

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

YOLOV5详细解读