项目2:使用Yolov5和deepsort实现车辆和行人目标跟踪,实时计算目标运动速度和加速度(有检测超速功能)

news2024/9/21 1:28:47

项目演示视频

项目演示视频可以跳转到哔哩哔哩观看:https://www.bilibili.com/video/BV1RT411Z7kD/?vd_source=805c57038e291405fe38f3adefa0f2d2

项目简介

本项目使用Yolov5+DeepSort实现车辆、行人跟踪,并实时统计各类别目标数量,以及测量目标运动速度、加速度,对于超速的车辆进行标记保存。

  • 项目支持对高分辨率的视频进行检测,可以使用滑动窗口检测,具体的做法就是按照指定的滑动步长以及窗口大小,对每一帧的图片进行切割,例如切割成512*512的大小的切片输入到模型中进行推理,然后对所有切片的推理结果进行合并,合并时需要再进行一次非极大值抑制,以去掉不同切片检测到的重叠框。
  • 本项目的预训练模型使用的是YOLOv5官方提供的yolov5s预训练权重,用户可以自行更换自己的模型权重文件。
  • 本项目可以指定需要检测的类别,并实时统计每一帧中各类别的目标数量。
  • 本项目可以实时统计各个目标的移动速度、加速度。
  • 对于超速的车辆,可以将其进行标记保存,便于交通部门的管理。
    在这里插入图片描述

主函数

if __name__ == '__main__':
    #Adding necessary input arguments
    parser = argparse.ArgumentParser(description='test')
    parser.add_argument("--model_path", default="./weights/yolov5s.pt", type=str,help ='预训练模型的路径')
    parser.add_argument('--input_path',default='./mytest.mp4', type=str,help ='输入视频文件路径')
    parser.add_argument('--output_dir',default = './mytest', type=str,help='输出检测结果保存路径')
    parser.add_argument("--is_split",default=False, action="store_true",help="是否对视频的每一帧图片进行切割检测(自动合并)")
    parser.add_argument("--subsize",default=512, type=int, help="切割每一帧时指定的切片大小")
    parser.add_argument("--gap", default=100, type=int, help="滑动窗口的重叠部分的像素长度,值越大,滑动窗口步长越小")
    parser.add_argument("--num_process",default=8,type=int,help="使用的进程个数")
    parser.add_argument("--names", default=['bus', 'car', 'truck', "person"],type=list,help="需要检测的目标")
    parser.add_argument("--conf_thresh", default=0.2, type=float, help="合并切片时需要再次进行NMS去除重复框")
    parser.add_argument("--iou_thresh", default=0.4, type=float, help="合并切片时需要再次进行NMS去除重复框")
    parser.add_argument("--speed_thresh", default=10, type=int, help="设定车辆速度上限阈值,如果超过该阈值就会被记录下来, 单位是千米/小时,-1则表示关闭速度检测")
    parser.add_argument("--pro_speed_thresh", default=-1, type=int, help="设定车辆加速度上限阈值,如果超过该阈值就会被记录下来, 单位是米/平方秒,-1则表示关闭加速度检测")
    args = parser.parse_args()
    main(args)

主要函数

def update_tracker(args, target_detector, image, fps):
    new_faces = []
    allbboxes = []
    cls_idlist = []
    if args.is_split:
        # 首先将当前帧存入指定的临时文件夹中
        args.splitDir = os.path.join(args.output_dir,"splitDir")
        if not os.path.exists(args.splitDir):
            os.makedirs(args.splitDir)
        tmpdir = os.path.join(args.splitDir,"tmp")
        tmpdir2 = os.path.join(args.splitDir,"tmp_split")
        if not os.path.exists(tmpdir):
            os.makedirs(tmpdir)
        if not os.path.exists(tmpdir2):
            os.makedirs(tmpdir2)
        cv2.imwrite(os.path.join(tmpdir,"tmp.png"),image)
        split = splitbase(tmpdir,
                        tmpdir2,
                        gap=args.gap,
                        subsize=args.subsize,
                        num_process=args.num_process)
        split.splitdata(1) # 1表示不放缩原图进行裁剪
        for filename in os.listdir(tmpdir2):
            filepath = os.path.join(tmpdir2,filename) # tmp__1__0___0
            yshfit = int(filename.split("___")[1].split(".")[0])
            xshfit = int(filename.split("__")[2])
            img = cv2.imread(filepath)
            _, bboxes = target_detector.detect(img) # 检测器推理图片
            for x1, y1, x2, y2, cls_id, conf in bboxes:
                cls_idlist.append(cls_id)
                x1 += xshfit
                y1 += yshfit
                x2 += xshfit
                y2 += yshfit
                allbboxes.append([x1,y1,x2,y2,conf.cpu()])
    else:
        _, bboxes = target_detector.detect(image) # 检测器推理图片
        for x1, y1, x2, y2, cls_id, conf in bboxes:
            cls_idlist.append(cls_id)
            allbboxes.append([x1,y1,x2,y2,conf.cpu()])
    allbboxes = np.array(allbboxes)
    keep = list(range(allbboxes.shape[0])) if not args.is_split else py_cpu_nms(allbboxes,thresh=args.iou_thresh)
    bboxes = allbboxes[keep]            
    clss = []
    for idx in keep:
        clss.append(cls_idlist[idx])
    bbox_xywh = []
    confs = []
    for x1, y1, x2, y2, conf in bboxes:
        obj = [
            int((x1+x2)/2), int((y1+y2)/2),
            x2-x1, y2-y1
        ]
        bbox_xywh.append(obj)
        confs.append(conf)
        # clss.append(cls_id)

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

    outputs = deepsort.update(xywhs, confss, clss, image)

    bboxes2draw = []
    face_bboxes = []
    current_ids = []
    for value in list(outputs):
        x1, y1, x2, y2, cls_, track_id = value
        bboxes2draw.append(
            (x1, y1, x2, y2, cls_, track_id)
        )
        current_ids.append(track_id)
        if cls_ == 'face':
            if not track_id in target_detector.faceTracker:
                target_detector.faceTracker[track_id] = 0
                face = image[y1:y2, x1:x2]
                new_faces.append((face, track_id))
            face_bboxes.append(
                (x1, y1, x2, y2)
            )
    
    # 计算每个目标的速度和加速度大小
    speed_list,speed_pro_list,speed_pro_change_list = get_speed_for_obj(bboxes2draw, fps)

    ids2delete = []
    for history_id in target_detector.faceTracker:
        if not history_id in current_ids:
            target_detector.faceTracker[history_id] -= 1
        if target_detector.faceTracker[history_id] < -5:
            ids2delete.append(history_id)

    for ids in ids2delete:
        target_detector.faceTracker.pop(ids)
        print('-[INFO] Delete track id:', ids)

    image = plot_bboxes(args, image, speed_list, speed_pro_list, speed_pro_change_list, bboxes2draw)

    return image, new_faces, face_bboxes

完整项目的获取方式请查看:https://www.bilibili.com/video/BV1RT411Z7kD/?vd_source=805c57038e291405fe38f3adefa0f2d2

参考项目

https://blog.csdn.net/WhiffeYF/article/details/121346483
https://github.com/ultralytics/yolov5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人大金仓数据库的库、模式、表空间之间的关系

库、模式、表空间之间的关系 KES数据库结构图 列出集簇现有的数据库清单 \l 默认数据库的作用介绍 数据库定义以及相关操作 创建数据库并设置参数 设置属主、编码、参照模板template0、连接数为0 create database 数据库名 owner 属主用户名 template template0 encoding …

【二叉搜索树】BST相关题目

BST相关题目二叉搜索树中的众树二叉搜索树节点最小距离两数之和 IV - 输入二叉搜索树总结二叉搜索树中的众树 501.二叉搜索树中的众树 解题思路&#xff1a;中序遍历二叉搜索树&#xff0c;使得结果集是有序的&#xff0c;过程中将众数个数保存下来。利用两个变量&#xff0c…

Java---微服务---SpringCloud(2)

SpringCloud021.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置1.2.配置热更新1.2.1.方式一1.2.2.方式二1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&am…

域环境搭建

内网渗透基础——域环境搭建 第一步,配置IP地址 1.打开网络和共享中心 2.更改适配器设置 3.进入网络连接后,设置网卡属性 4.双击进入,修改IP地址 5.使用IP地址如下,IP地址设置为:192.168.1.1;子网掩码设置为:255.255.255.0;DNS属性设置为:192.168.1.1 6.设置好之后确…

Fisco Bcos区块链一(搭建单群组FISCO BCOS联盟链)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html推荐准备&#xff1a;1. 搭建单群组FISCO BCOS联盟链安装依赖创建操作目录, 下载安装脚本搭建单群组4节点联盟链启动FISCO BCOS链检查进程检查日志输出区块链开…

我的第一次真实对国外某购物平台web漏洞挖掘

&#xff08;真实世界&#xff09;我的第一次真实对国外某购物平台web漏洞挖掘 开放重定向 - 低危XSS - 低危 这两组合起来就完全不一样一点的&#xff0c;个人觉得比原本高一些 危害&#xff1a;窃取用户敏感数据、用户cookie、钓鱼操作 等… 前言 这是我第一次&#xff…

【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据 -…

VBA 自定义Add-in

1. 通过下面的链接下载工具&#xff1a;OfficeCustomUIEditorFiles VBA Ribbon - Microsoft Download 2.将上面下载的ZIP文件解压缩后&#xff0c;运行其中的 “CustomUIEditor.exe”&#xff0c; 打开事先准备好的.xlsm文件&#xff0c;例如&#xff1a;self.xlsm。 2-1.点…

Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

Ubuntu20.04MAVROSPX4Gazebo安装PX4步骤安装MAVROS安装QGCPX4仿真安装PX4步骤 从github上clone源码 git clone https://github.com/PX4/PX4-Autopilot.git --recursive进入PX4-Autopilot文件夹&#xff0c;继续下载未下载完的组件 cd PX4-Autopilot/ git submodule update -…

什么是数据库连接池?Druid(德鲁伊)连接池的使用详细解读

文章目录1. 数据库连接池2. 概念3. 实现4. Druid 连接池的使用5. 总结Java编程基础教程系列1. 数据库连接池 2. 概念 前面在 JDBC API 的使用详细解读文章中&#xff0c;获取的数据库连接对象 conn&#xff0c;在使用时创建&#xff0c;使用完毕就会将其销毁。这样重复创建和销…

Python if else对缩进的要求

Python 是以缩进来标记代码块的&#xff0c;代码块一定要有缩进&#xff0c;没有缩进的不是代码块。另外&#xff0c;同一个代码块的缩进量要相同&#xff0c;缩进量不同的不属于同一个代码块。不要忘记缩进if、elif 和 else 后面的代码块一定要缩进&#xff0c;而且缩进量要大…

【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++

第八章 数组 目录 第八章 数组 ●前言 ●一、数组是什么&#xff1f; 1.简要介绍 2.具体情况 ●二、数组典型例题——一维&二维&三维 1.一维数组&#xff08;校门外的树&#xff09; 2.二维数组&#xff08;彩票摇奖&#xff09; 3.三维数组&#xff08…

自己动手写一个操作系统——MBR(1)

文章目录前言MBR1) 512 字节镜像2) 0x55 和 0xAAqemu 运行参考前言 上篇《自己动手写一个操作系统——我们能做什么&#xff0c;我们需要做什么》我们介绍到 BIOS 会遍历每个磁盘的第一个扇区查找 MBR&#xff0c;找到后便将 MBR 加载到内存并跳转过去。如果没找到&#xff0c…

红黑树和平衡二叉树的区别

一.红黑树的定义 1.节点是红色或者黑色&#xff1b; 2.根节点和叶子节点是黑色&#xff0c;叶子节点为空节点&#xff1b; 3.每个红色节点的叶子节点都是黑色&#xff1b; 4.从任何节点到叶子节点的所有路径包含相同数目的黑色节点&#xff1b; 5.红黑树实现平衡和保持红黑…

代码随想录算法训练营三期 day 25 - 回溯 (2) (补)

216. 组合总和III 题目描述: 216. 组合总和 III 原文链接: 216. 组合总和 III 视频链接: 216. 组合总和 III 树形结构 回溯三部曲&#xff1a; ① 确定回溯函数参数及返回值 和 77. 组合 一样&#xff0c;依然需要一维数组 path 来存放符合条件的结果&#xff0c;二维数组 r…

leetcode-每日一题-计算应缴税款总额(简单,数学逻辑)

给你一个下标从 0 开始的二维整数数组 brackets &#xff0c;其中 brackets[i] [upperi, percenti] &#xff0c;表示第 i 个税级的上限是 upperi &#xff0c;征收的税率为 percenti 。税级按上限 从低到高排序&#xff08;在满足 0 < i < brackets.length 的前提下&am…

(19)go-micro微服务filebeat收集日志

文章目录一 Filebeat介绍二 FileBeat基本组成三 FileBeat工作原理四 Filebeat如何记录文件状态:五 Filebeat如何保证事件至少被输出一次六 安装Filebeat七 使用Filebeatfilebeat.yml编写八 最后一 Filebeat介绍 filebeat是Beats中的一员。 Beats在是一个轻量级日志采集器&…

2022——>2023

2022年对于我来说&#xff0c;是极其不平凡的一年&#xff0c;因为在这一年&#xff0c;我面临了人生的第一次重大的选择——高考。老师们常说&#xff1a;“一分压倒一操场人。”这句话是我高考看完自己的成绩之后深有体会的。超过湖南本科线没几分的我&#xff0c;志愿真的是…

剖析“类和对象” (中) -------- CPP

在上一篇博客中 (剖析“类和对象” (上) -------- CPP) 提到&#xff0c;一个类中什么成员都没有的称为“空类”。一个“空类”中真的什么都没有吗&#xff1f; 其实不然&#xff0c;任何类中什么都不写时&#xff0c;编译器会自动生成一下六个默认成员函数。 默认成员函数&am…

Fisco Bcos区块链二(搭建使用控制台,体验Holleworld合约调用)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html2. 配置及使用控制台准备依赖启动并使用控制台3. 部署及调用HelloWorld合约编写HelloWorld合约&#xff08;此处不需要编写&#xff0c;控制台已内置&#xff…