基于YOLOv5的视频计数 — 汽车计数实现

这篇具有很好参考价值的文章主要介绍了基于YOLOv5的视频计数 — 汽车计数实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单的步骤,使初学者能够轻松跟随。

本文将分为以下几个部分:

  • 需求

  • 启发式:汽车计数

  • 检测过滤

  • 启发式:实现

  • 结论

需求

在我们深入了解该过程之前,让我们确保已安装所需的库。主要需要:

  • PyTorch:通过PyTorch Hub,我们将访问Ultralytics存储库以下载Yolov5模型。

  • OpenCV:用于加载、操作和显示视频的所有实用程序。

  • Matplotlib(可选):我们将使用此实用程序在多边形内进行点验证。

如代码片段1所示,requirements.txt文件中列出了这些要求。

opencv-python==4.8.1.78
torch==2.1.0
matplotlib==3.8.0
ultralytics==8.0.203
pandas==2.1.2
requests==2.31.0

一旦我们查看了主要要求,就该了解我们将开发用于从视频中计数对象的启发式的时间了。

启发式:汽车计数

在此示例中,我们将使用一个视频场景,其中将对汽车进行计数。图2显示了一个示例帧。

yolov5视频计数统计,YOLO,音视频,汽车用于计数汽车的视频帧

为了计数汽车,我们将使用Yolov5来检测视频中的对象。基于检测到的对象,我们将过滤与汽车、公共汽车和卡车有关的类别。由于检测基于边界框(具有坐标xmin、ymin、xmax、ymax的多边形),我们将需要获取每个边界框的中心点(xc, yc),该中心点将是我们对象的参考点。

最后,我们将绘制一个多边形,该多边形将是计数对象的参考,也就是说,如果对象的参考点在多边形内,我们将增加对象计数器,否则计数器不受影响。在下图中,我们可以看到多边形和多边形内的汽车数量的表示。

yolov5视频计数统计,YOLO,音视频,汽车检测(绿色点)、多边形(红色线)和计数器

到此为止,我们已经知道了需求是什么,以及我们将实施用于计数对象的启发式的方法。现在可以加载模型:Yolov5 Nano

在本例中,我们将使用Yolov5的nano版本(即yolov5n),我们将通过PyTorch Hub从Ultralytics存储库中扩展它。同样,为了加载和在每一帧上生成迭代器,我们将使用OpenCV(即cv2),下述代码是具体的实现方式:

import cv2
import torch


VIDEO_PATH="data/traffic.mp4"
HUB="ultralytics/yolov5"
YOLO="yolov5n"


def count_cars(cap: cv2.VideoCapture):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)


    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        # Detection filtering and heuristic
        # will be implemented here.


        cv2.imshow("frame", frame)


        if cv2.waitKey(10) & 0xFF == ord('q'):
             break


    cap.release()




if __name__ == '__main__':


    cap = cv2.VideoCapture(VIDEO_PATH)
    count_cars(cap)

正如我们所看到的,我们已经定义了count_cars()函数,我们将在整个项目中对其进行更新。在4-6行,我们定义了视频所在路径、hub和模型名称的变量。从那里,让我们迅速跳到31-32行,在那里通过初始化cap对象加载视频,然后将其传递给count_cars()函数。

返回到第10行,通过PyTorch Hub,我们下载并初始化了yolov5n模型。随后,在第12行,我们生成一个迭代器,只要有要显示的帧,它就会保持活动状态。一旦帧完成,与迭代器相关的对象就会被释放(第26行)。

在第13行,我们读取帧,验证是否成功读取,并显示它们(第21行)。在这一部分,将出现一个窗口,用于查看从此迭代器显示的视频。最后,第23行是在按q键时删除弹出窗口。

检测过滤

过滤检测是指从Yolo预测中提取感兴趣的类别的过程。在这种情况下,我们将过滤掉分数大于0.5且类别为汽车、公共汽车或卡车的检测。同样,我们将需要找到边界框的中心点,我们将其用作对象的参考点。下面代码显示了这两个函数的实现。

import pandas as pd


def get_bboxes(preds: object):
    df = preds.pandas().xyxy[0]
    df = df[df["confidence"] >= 0.5]
    df = df[df["name"].isin(["car", "bus", "truck"])]


    return df[["xmin", "ymin", "xmax", "ymax"]].values.astype(int)


def get_center(bbox):
    center = ((bbox[0] + bbox[2]) // 2, (bbox[1] + bbox[3]) // 2)
    return center

正如我们所看到的,我们定义了两个函数get_bboxes()和get_center()。get_bboxes()函数(第3行)旨在提取所有分数大于0.5并过滤掉已经提到的类别的预测,返回一个坐标形式的边界框的numpy数组[xmin, ymin, xmax, ymax]。

get_center()函数(第10行)接收一个带有边界框坐标的numpy数组,并使用方程xc, yc = (xmin + xmax) // 2, (ymin + ymax) // 2分别计算中心点。

在这一点上,我们已经下载了模型,过滤了预测,并获得了每个对象的中心点。现在,我们唯一需要的是生成决定启发式区域的多边形。因此,让我们继续下一节!

启发式:实现

我们将定义的多边形可能会因视频、透视等而有所不同。在这种情况下,例如此示例,我们将使用8个点,如下图所示:

yolov5视频计数统计,YOLO,音视频,汽车 具有坐标的多边形 

一旦我们定义了多边形,我们唯一需要做的就是验证每个对象的参考点是否在多边形内。如果在多边形内,我们就会增加一个计数器,如果不在,我们就继续。

import cv2
import numpy as np
import matplotlib.path as mplPath


POLYGON = np.array([
    [333, 374],
    [403, 470],
    [476, 655],
    [498, 710],
    [1237, 714],
    [1217, 523],
    [1139, 469],
    [1009, 393],
])




def is_valid_detection(xc, yc):
    return mplPath.Path(POLYGON).contains_point((xc, yc))


def count_cars(cap: object):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)


    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        preds = model(frame)
        bboxes = get_bboxes(preds)


        detections = 0
        for box in bboxes:
            xc, yc = get_center(box)


            if is_valid_detection(xc, yc):
                detections += 1

让我们注意到在第5行,我们定义了多边形。在第17行,我们定义了关键函数:is_valid_detection(),它旨在验证参考点(xc, yc)是否在多边形内。这个函数在第37行调用,如果为真,它会增加有效检测计数器,否则什么也不做。

最后,为了可视化,我们将添加一些OpenCV行来显示计数器、每辆检测到的汽车的参考点和多边形。

def count_cars(cap: object):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)
    
    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        preds = model(frame)
        bboxes = get_bboxes(preds)


        detections = 0
        for box in bboxes:
            xc, yc = get_center(box)
            
            if is_valid_detection(xc, yc):
                detections += 1
                
            # Draw poit of reference for each detection
            cv2.circle(img=frame, center=(xc, yc), radius=5, color=(0,255,0), thickness=-1)
            # Draw bounding boxes for each detection
            cv2.rectangle(img=frame, pt1=(box[0], box[1]), pt2=(box[2], box[3]), color=(255, 0, 0), thickness=1)
        # Draw the counter
        cv2.putText(img=frame, text=f"Cars: {detections}", org=(100, 100), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=3, color=(0,0,0), thickness=3)
        # Draw the polygon
        cv2.polylines(img=frame, pts=[POLYGON], isClosed=True, color=(0,0,255), thickness=4)
        # Display frame
        cv2.imshow("frame", frame)

结论

在本文中,我们看到了如何从视频中实现一个对象计数器。我们开发了一种计算汽车、卡车和公共汽车的实现,基于一个定义的多边形,即如果对象在多边形内,计数器就会增加。

·  END  ·

HAPPY LIFE

yolov5视频计数统计,YOLO,音视频,汽车

本文仅供学习交流使用,如有侵权请联系作者删除文章来源地址https://www.toymoban.com/news/detail-765807.html

到了这里,关于基于YOLOv5的视频计数 — 汽车计数实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • yolov5无人机视频检测与计数系统(创新点和代码)

    标题:基于YOLOv5的无人机视频检测与计数系统 无人机技术的快速发展和广泛应用给社会带来了巨大的便利,但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控,本文提出了一种基于YOLOv5的无人机视频检测与计数系统。该系统通过使用YOLOv5目标检测算法,能够

    2024年02月02日
    浏览(51)
  • YOLOv5实现目标分类计数并显示在图像上

            有同学后台私信我,想用YOLOv5实现目标的分类计数,因此本文将在之前目标计数博客的基础上添加一些代码,实现分类计数。阅读本文前请先看那篇博客,链接如下: YOLOv5实现目标计数_Albert_yeager的博客         以coco数据集为例,其类别如下(共80类)。注意,每个

    2024年02月08日
    浏览(80)
  • 基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

    前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借鉴了不少项目,最终感觉Yolov5+Deepsort+Slowfast实现实时动作检测这个项目不错,因此进行了实现。 总的来说,我们需要能够实现实时检测视频中的人物,并且能够识别目标的动作,所以我们拆解需求后,整理核心

    2024年01月20日
    浏览(64)
  • 两百行C++代码实现yolov5车辆计数部署(通俗易懂版)

    本文是文章传统图像处理方法实现车辆计数的后续。这里用OpenCV实现了基于yolov5检测器的单向车辆计数功能,方法是撞线计数。该代码只能演示视频demo效果,一些功能未完善,离实际工程应用还有距离。 实现流程: (1)训练yolov5模型,这里就没有自己训练了,直接使用官方

    2024年02月06日
    浏览(69)
  • 目标检测YOLOV5 添加计数功能

    YOLOV5预测完图片想显示个数怎么办呢? 一行代码轻松解决!!!! 原来的Detect 没有计数功能 只需在源码 上加上下面这一段代码即可: 这样就可以加上计数功能了!!!!  

    2024年02月16日
    浏览(45)
  • 视频实时行为检测——基于yolov5+deepsort+slowfast算法

    前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借鉴了不少项目,于是打算通过 yolov5 实现目标检测, deepsort 实现目标跟踪以及 slowfast 实现动作识别,最终实现端到端的目标行为检测模型。 总的来说,我们需要能够实现实时检测视频中的人物,并且能够识别

    2024年02月03日
    浏览(46)
  • 使用YOLOv5实现图片、视频的目标检测

    接下来我将从官方代码开始,一步一步展示如何进行图片、视频识别 首先从GitHub下载官方代码(也可以从下面链接获取): 链接:https://pan.baidu.com/s/16wzV899D90TY2Xwhx4TwhA 提取码:vzvj (你的环境名可能和我不一样) 可以看到 \\\'--weights\\\' 参数(参数解读详见4.a)的默认值为\\\'yolov

    2023年04月15日
    浏览(39)
  • YOLOv5训练自己的数据集实现视频的识别

    写在前面 我本来是使用这个模型进行手写签名的定位,但是因为比赛的主办方原因,数据不允许公开,所以我使用动物世界的一段开头视屏来制作我的数据集。这整个模型跑通的过程中,我参考了很多不错的博客,写这篇博客的原因是记录一下我的所见所感。我的模型是在

    2024年02月02日
    浏览(76)
  • Yolov5实现视频中的指针式仪表读数 [python]

    背景:根据巡航机器人拍摄的视频,读出其中两个电流表和两个电压表的度数。 Yolov5的star数高达37.5k,是Yolo系列最为经典的版本。本项目在Yolov5 v5.0的基础上进行修改,来实现指针式仪表的读数功能。 prepare 数据集:对机器人拍摄的视频进行抽帧标注。 标注工具: labelImg 预

    2024年02月07日
    浏览(35)
  • 使用flask将Yolov5部署到前端页面实现视频检测(保姆级)

    首先,开发工具我们选择jetbrains公司的Pycharm,打开Pycharm,选择new Project,flask,路径根据自己的自身情况改,最好点击create创建成功! 此时,新建好的flask工程目录长这样 static文件夹下存放一些文件,比如css,js,images等,templates文件夹存放一些html的文件,便于日后flask部署。

    2024年01月24日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包