毕业设计-基于机器视觉的行人车辆跟踪出入双向检测计数

news2025/1/12 5:53:40

目录

前言

课题背景和意义

实现技术思路

实现效果图样例


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯机器视觉的行人进出双向计数系统

课题背景和意义

行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,无人驾驶汽车通过提前检测到行人及时避让来避免交通事故的发生;安防保护方面,通过行人检测来防止可疑人员进入;公共场所管理方面,通过行人检测统计人流量数据,优化人力物力等资源的分配。

对于目标检测的方法,从2013年Ross Girshick提出R-CNN开始,人们在短短几年内相继提出Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO等算法,其中两步检测的目标检测方法(R-CNN系列算法)需要先产生大量候选框之后再用卷积神经网络对候选框进行分类和回归处理;单步检测的方法(SSD、YOLO系列算法)则直接在卷积神经网络中使用回归的方法一步就预测出目标的位置以及目标的类别。虽然两步检测的目标检测方法在大多数的场景下精确率更高,但是它需要分两个步骤进行,因此,这种方法将耗费大量的时间成本和昂贵的硬件成本,不适合对视频文件进行实时的检测。而YOLO系列的网络速度更快,可以适应实时视频的检测,泛化能力更强。

对于人员跟踪,2016年Alex Bewley提出了简单在线实时跟踪算法,这种算法把传统的卡尔曼滤波和匈牙利算法结合到一起, 能在视频帧序列中很好地进行跨检测结果的关联, 而且它的速度比传统的算法快20倍左右,可以快速地对目标检测反馈的数据进行处理。

实现技术思路

环境要求

opencv模块。在计算机视觉项目的开发中,opencv作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。

pillow模块。PIL是理想的图像存档和批处理应用程序。您可以使用库创建缩略图,在文件格式、打印图像等之间进行转换。它提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。

Scipy库。Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

keras模块。Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。

算法设计

使用卷积神经网络对视频中的行人进行检测和跟踪。视频帧输入之后首先进入YOLOv3目标检测的网络,经过Darknet-53提取特征;其次,进行上采样和特征融合,再进行回归分析;再次,把得出的预测框信息输入SORT算法进行目标特征建模,匹配和跟踪;最后,输出结果。下图为算法流程设计图:

 

 行人检测

常见的两阶段检测首先是使用候选区域生成器生成的候选区集合,并从每个候选区中提取特征,然后使用区域分类器预测候选区域的类别。而YOLO作为单阶段检测器,则不用生成候选区域,直接对特征图的每个位置上的对象进行分类预测,效率更高。在这里使用labelme标注行人数据集,然后通过搭建好的YOLO算法产生模型并进行训练即可。

def yolo_body(inputs, num_anchors, num_classes):
    """Create YOLO_V3 model CNN body in Keras."""
    darknet = Model(inputs, darknet_body(inputs))
    x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5))
    x = Concatenate()([x,darknet.layers[152].output])
    x, y2 = make_last_layers(x, 256, num_anchors*(num_classes+5))
    x = compose(
            DarknetConv2D_BN_Leaky(128, (1,1)),
            UpSampling2D(2))(x)
    x = Concatenate()([x,darknet.layers[92].output])
    x, y3 = make_last_layers(x, 128, num_anchors*(num_classes+5))
    return Model(inputs, [y1,y2,y3])

 Deepsort行人跟踪

行人多目标跟踪算法设计的步骤如下:

(1) 检测阶段:目标检测算法会分析每一个输入帧,并识别属于特定类别的对象,给出分类和坐标。

(2) 特征提取/运动轨迹预测阶段:采用一种或者多种特征提取算法用来提取表观特征,运动或者交互特征。此外,还可以使用轨迹预测器预测该目标的下一个位置。

(3) 相似度计算阶段:表观特征和运动特征可以用来计算两个目标之间的相似性。

(4) 关联阶段:使用计算得到的相似性作为依据,将属于同一目标的检测对象和轨迹关联起来,并给检测对象分配和轨迹相同的ID。

使用卡尔曼滤波类跟踪的估计状态系统和估计的方差或不确定性。用于预测。

这里dist_thresh为距离阈值。当超过阈值时,轨道将被删除,并创建新的轨道;Max_frames_to_skip为允许跳过的最大帧数对于跟踪对象未被检测到;max_trace_length为跟踪路径历史长度;trackIdCount为每个轨道对象的标识。

def Update(self, detections):
    if (len(self.tracks) == 0):
        for i in range(len(detections)):
            track = Track(detections[i], self.trackIdCount)
            self.trackIdCount += 1
            self.tracks.append(track)
    N = len(self.tracks)
    M = len(detections)
    cost = np.zeros(shape=(N, M)) 
    for i in range(len(self.tracks)):
        for j in range(len(detections)):
            try:
                diff = self.tracks[i].prediction - detections[j]
                distance = np.sqrt(diff[0][0]*diff[0][0] +
                                   diff[1][0]*diff[1][0])
                cost[i][j] = distance
            except:
                pass
    cost = (0.5) * cost
    assignment = []
    for i in range(len(row_ind)):
        assignment[row_ind[i]] = col_ind[i]
    un_assigned_tracks = []
    for i in range(len(assignment)):
        if (assignment[i] != -1):
            if (cost[i][assignment[i]] > self.dist_thresh):
                assignment[i] = -1
                un_assigned_tracks.append(i)
            pass
        else:
            self.tracks[i].skipped_frames += 1
    del_tracks = []

结果显示

将YOLO行人检测和deepsort算法结合,并通过设置基本阈值参数控制轨迹预测的欧式距离。通过搭建本项目可应用于城市商业街道、人行道、校园道路场景,使用其得出的人员流动数据,帮助公共交通和安全管理。

track_colors = get_colors_for_classes(max_colors)
result = np.asarray(image)
font = cv2.FONT_HERSHEY_SIMPLEX
result0 = result.copy()
result1=result.copy()
img_position=np.zeros([result.shape[0],result.shape[1],3])
if (len(centers) > 0):
    tracker.Update(centers)
    for i in range(len(tracker.tracks)):
        if (len(tracker.tracks[i].trace) > 1):
            x0, y0 = tracker.tracks[i].trace[-1][0][0], tracker.tracks[i].trace[-1][1][0]
            cv2.putText(result0, "ID: "+str(tracker.tracks[i].track_id-99), (int(x0), int(y0)), font, track_id_size,
                        (255, 255, 255), 2)
            cv2.putText(result1, "ID: " + str(tracker.tracks[i].track_id - 99), (int(x0), int(y0)), font,
                        track_id_size,
                        (255, 255, 255), 2)
            color_random = tracker.tracks[i].track_id % 9
            cv2.circle(img_position, (int(x0), int(y0)), 1, track_colors[color_random], 8)
          
            result0=result0.copy()
            for j in range(len(tracker.tracks[i].trace) - 1):
                x1 = tracker.tracks[i].trace[j][0][0]
                y1 = tracker.tracks[i].trace[j][1][0]
                x2 = tracker.tracks[i].trace[j + 1][0][0]
                y2 = tracker.tracks[i].trace[j + 1][1][0]
                clr = tracker.tracks[i].track_id % 9
                distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
                if distance < max_point_distance:
                    cv2.line(result1, (int(x1), int(y1)), (int(x2), int(y2)),
                             track_colors[clr], 4)
            result1=result1.copy()

实现效果图样例

 

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

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

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

相关文章

网格化微型空气质量站 浅谈工作原理

产品简介 网格化微型空气质量站是一种集数据采集、存储、传输和管理于一体的无人值守的环境监测系统&#xff0c;能全天候、连续、自动地监测环境&#xff0c;在提供PM10、PM2.5、 SO2、 NO2、CO、O3等参数数据的基础上&#xff0c;可扩展对VOCs、氯气、硫化氢、氨气等多种特征…

[附源码]Python计算机毕业设计Django勤工俭学管理小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Nginx的常用命令和配置文件

常用命令 1.查看 nginx版本号 在/usr/local/nginx/sbin 目录下执行 ./nginx -v 2.启动命令 在/usr/local/nginx/sbin 目录下执行 ./nginx 3.关闭命令 在/usr/local/nginx/sbin 目录下执行 ./nginx -s stop 4.重新加载命令 在/usr/local/nginx/sbin 目录下执行 ./nginx …

主流时序数据库分析及选型

目录一、当前主流的时序数据库二、主流时序数据库分析1、[Influxdb](https://docs.influxdata.com/influxdb)2、[Timescale](https://docs.timescale.com/)3、[Apache Druid](https://druid.apache.org/docs/latest/design/index.html)4、[Kdb](https://code.kx.com/home/)5、[…

牛客网基础知识强化巩固-周结04

链表强化训练 2022-11-28 打卡 知识点总结 磁盘字节和比特的问题 文件分配表FAT是管理磁盘空间的一种数据结构&#xff0c;用在以链接方式存储文件的系统中记录磁盘分配和跟踪空白磁盘块。整个磁盘仅设一张FAT表&#xff0c;其结构如下图所示。如果文件块号为2&#xff0c;查找…

使用 Echarts 插件实现柱状图功能

目录前言&#xff1a;什么是 Echarts 插件柱状图成品展示步骤&#xff1a;柱状图代码&#xff1a;总结&#xff1a;前言&#xff1a; 大家都知道&#xff0c;一般情况下&#xff0c;想要使用前端设置一个 柱状图 需要使用 canvas 画布进行编写&#xff0c;不仅代码多&#xff…

Python实现基于用户的协同过滤推荐算法构建电影推荐系统

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 基于用户的协同过滤推荐&#xff08;User-based CF&#xff09;的原理假设&#xff1a;跟你喜好相似的人…

RNA-seq 详细教程:搞定count归一化(5)

学习目标 了解如何在归一化过程中列出不同的 uninteresting factors(无关因素)了解常用的归一化方法&#xff0c;已经如何使用了解如何创建 DESeqDataSet 对象及其结构了解如何使用 DESeq2 进行归一化1. 归一化 差异表达分析工作流程的第一步是计数归一化&#xff0c;这是对样本…

exploit-db图文教程

一、ExploitDB 简介 ExploitDB 是一个面向全世界黑客的漏洞提交平台&#xff0c;该平台会公布最新漏洞的相关情况&#xff0c;这些可以帮助企业改善公司的安全状况&#xff0c;同时也以帮助安全研究者和渗透测试工程师更好的进行安全测试工作。Exploit-DB 提供一整套庞大的归档…

Spring框架(十):Spring注解开发配置MyBatis框架等第三方框架

Spring注解开发配置MyBatis框架等第三方框架引子注解配置MyBatis注解整合Mapper的原理Import注解整合第三方框架引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#xff0c;以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾&#xf…

IDEA常用插件(持续更新中......)

再使用idea办公后&#xff0c;会发现安装一些插件&#xff0c;对我们来说会事半功倍。同时也会让同事也开始情不自禁的嘚瑟了。 1.Free Mybatis plugin mybatis和mybatis-plus基本上是目前最主流的ORM框架了&#xff0c;相比于Hibernate更加灵活&#xff0c;性能也更好。所以…

爬虫入门——1、基本概念

1、爬虫是什么 网络爬虫&#xff08;又称网络机器人&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取网络信息的程序或者脚本。 通俗地讲&#xff0c;我们把互联网比作一张大蜘蛛网&#xff0c;每个站点资源比作蜘蛛网上的一个结点&#xff0c;爬虫就像一…

【spark】第二章——SparkCore之运行架构及核心编程

文章目录1. Spark 运行架构1.1 1 运行架构1.2 核心组件1.2.1 Driver1.2.2 Executor1.2.3 Master & Worker1.2.4 ApplicationMaster1.3 核心概念1.3.1 Executor 与 Core1.3.2 并行度&#xff08;Parallelism&#xff09;1.3.3 有向无环图&#xff08;DAG&#xff09;1.4 提交…

Compiere的应用字典介绍

模型驱动架构介绍 本章介绍了Compiere的模型驱动架构和Compiere的数据字典功能。 在大多数应用程序中&#xff0c;开发人员必须设计代码并测试每个屏幕。这可能是非常耗时的&#xff0c;并导致整个应用程序在外观和感觉以及功能方面的不一致。 这也会使用户难以学习像ERP这样复…

H5 Canvas 垂直箭头绘制

效果 ⚠ 因为使用的是斜率来处理的垂直逻辑 tan&#xff0c;当为被除数为0时做了特殊处理&#xff0c;两点自由变换时到达零界点会有卡顿。 推导 开始复习初中二年级数学知识 斜率k的公式&#xff1a;k(y1−y2)(x1−x2)k \dfrac{(y_1 -y_2)}{(x_1 - x_2)}k(x1​−x2​)(y1​…

【三维目标检测】VoteNet(一)

VoteNet是用于点云三维目标检测模型算法&#xff0c;发表在ICCV 2019《Deep Hough Voting for 3D Object Detection in Point Clouds》&#xff0c;论文地址为“https://arxiv.org/abs/1904.09664”。VoteNet核心思想在于通过霍夫投票的方法实现了端到端3D对象检测网络&#xf…

LeetCode 852. 山脉数组的峰顶索引

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 852. 山脉数组的峰顶索引 &#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 Leet…

[Error]适配iPad时调用UIAlertController和UIActivityViewController软件崩溃问题

问题&#xff1a; 适配iPad时&#xff0c;调用UIAlertController和UIActivityViewController软件崩溃。iPhone设备上软件运行正常。 错误打印如下&#xff1a; Thread 1: "UIPopoverPresentationController (<UIPopoverPresentationController: 0x12f33b020>) sho…

管道模式 流处理

&#xff08;一&#xff09;介绍 管道这个名字源于自来水厂的原水处理过程。原水要经过管道&#xff0c;一层层地过滤、沉淀、去杂质、消毒&#xff0c;到管道另一端形成纯净水。我们不应该把所有原水的过滤都放在一个管道中去提纯&#xff0c;而应该把处理过程进行划分&#…

Pytorch Bert 中文分类 运行代码时候遇到的问题

问题1 bert AutoModel.from_pretrained(bert-base-chinese) 报错信息如下&#xff1a; RuntimeError: Error(s) in loading state_dict for BertModel: size mismatch for bert.embeddings.word_embeddings.weight: copying a param with shape torch.Size([21128, 768…