当前位置: 首页 > news >正文

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录

  • 一、情况介绍
  • 二、思路情况
  • 二、代码展示
  • 三、感受

一、情况介绍

前几天也是参加了研究生数学建模竞赛(也就是华为杯),也是和本校的两个数学学院的朋友在网上组的队伍。昨天(9.25)通宵干完论文(一条烂命就是干!),我们选择的是E题,题目内容简单点就是,高速公路上可能会堵车,对堵车情况进行预测,并且启动应急车道舒缓交通压力,通过的是4个监测点的视频。
emmm,这次比赛我想法是,队长担任模型,我是负责出图、做软件(知道我的人应该清楚,我本科就是软件),结果比赛第二天下午的时候,论文进展几乎为0,我就清楚了,这个队伍没有一个适合的模型,然后我就上了,当一次“不正规”的模型(至于为什么不正规,我下面会讲,不过也是圆梦了我本科的一个想法,就是软件转模型,当一次模型)

二、思路情况

这里我就不展示我的摘要了,哈哈哈哈,当然我的摘要,也是被指导老师夸奖了。
这里我说下思路情况:
对于第一问第一小问首先就是数据获取,和队友讨论下,确定了三个参数:车流量、车速、车流密度。(原本是想继续加的,但是实在想不到什么比较好的参数),嗯花了2天时间数据才处理完成,中间磕磕绊绊,出的数据都不符合实际,最后准备造的时候,发现出的数据正常了,然后出成折线图,对各个时间段的各参数的情况进行分析。比如什么时段到什么时段车速多少、车密度和之前对比怎么样。第二小问,首先使用肘部法则,确定聚类数(我看下图,确定为5),之后使用k-means聚类聚5类,最后按照数据使用ARIMA时间序列模型,预测5分钟的数据。第三小问,使用交叉验证验证有效性。

对于第二问:先说下,对于这题重点是,提供理论依据,想了下又需要第一问产生关联,所以就是介绍了基于时间序列预测结果的逻辑回归模型,并且都是二分类问题,把理论依据给说明了

对于第三问第一小问,就是首先用k-means聚类两类,之后使用逻辑回归,两者进行对比。第二小问,量化的话,我们使用了混淆矩阵,放入k-means作为真实值,逻辑回归作为预测值,带入混淆矩阵。

对于第四问:我乍一看,再一分析,我以为是最优化问题,有目标函数,也有约束条件。但是约束条件太空洞了。没有什么预算之类的,反正我没想到怎么搞,最后是确定预测精度随着时间的变化,确定安装视频监控点的位置。

二、代码展示

对于问题一,使用yolov5算法对视频数据进行检测

import torch
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import pandas as pd
from scipy.spatial import distance
import warnings# 忽略特定的FutureWarning
warnings.filterwarnings('ignore', category=FutureWarning)# 加载YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)# 定义观测区域的长度(单位:公里),假设为50米
observation_length = 0.05  # 50米等于0.05公里# 初始化OpenCV的多目标追踪器
tracker = cv2.legacy.MultiTracker_create()# 追踪车辆的结构
class Vehicle:def __init__(self, bbox, tracker):self.bbox = bbox  # 车辆的检测框self.tracker = tracker  # 对应的追踪器self.positions = []  # 存储每帧车辆中心的位置def add_position(self, center):self.positions.append(center)def calculate_speed(self, fps):# 如果追踪到的点少于2个,无法计算速度if len(self.positions) < 2:return 0# 计算速度,根据前后位置和时间差prev_center = self.positions[-2]current_center = self.positions[-1]pixel_distance = distance.euclidean(prev_center, current_center)speed = (pixel_distance / 1000) * fps / observation_length  # km/hreturn speed# 初始化车辆列表
vehicles = []def process_video_yolov5(video_path):cap = cv2.VideoCapture(video_path)if not cap.isOpened():print(f"无法打开视频文件 {video_path}")returnfps = int(cap.get(cv2.CAP_PROP_FPS))  # 获取视频帧率frame_count = 0vehicle_count_per_25_frames = []  # 每25帧的车辆总数speed_per_25_frames = []  # 每25帧通过蓝线的车辆平均速度density_per_25_frames = []  # 每25帧的车辆密度(蓝线以下车辆数)total_vehicle_count = 0# 获取视频帧的宽度和高度,用于绘制蓝线frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))blue_line_y = int(frame_height * 0.25)  # 在视频四分之一处画一根水平蓝线while True:ret, frame = cap.read()if not ret:break# 每25帧重新检测一次车辆,并更新跟踪器if frame_count % 25 == 0:# 使用YOLOv5进行车辆检测results = model(frame)detections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, conf, cls]# 清空旧的跟踪器并添加新检测到的车辆vehicles.clear()for *box, conf, cls in detections:if int(cls) in [2, 3, 5, 7]:  # 汽车, 卡车等车辆类x1, y1, x2, y2 = map(int, box)bbox = (x1, y1, x2 - x1, y2 - y1)  # 计算检测框tracker = cv2.TrackerCSRT_create()  # 使用CSRT追踪器tracker.init(frame, bbox)vehicle = Vehicle(bbox, tracker)vehicles.append(vehicle)total_vehicle_count += 1else:# 更新车辆的追踪位置for vehicle in vehicles:success, bbox = vehicle.tracker.update(frame)if success:# 计算中心点并保存x, y, w, h = map(int, bbox)center_x, center_y = (x + x + w) // 2, (y + y + h) // 2vehicle.add_position((center_x, center_y))# 绘制蓝线cv2.line(frame, (0, blue_line_y), (frame_width, blue_line_y), (255, 0, 0), 2)frame_count += 1# 每25帧,计算一次车辆数量、通过蓝线的车辆平均速度和车辆密度if frame_count % 25 == 0:# 统计当前帧的车辆数current_vehicle_count = len(vehicles)vehicle_count_per_25_frames.append(current_vehicle_count)# 计算每辆车的平均速度speeds = [vehicle.calculate_speed(fps) for vehicle in vehicles]avg_speed = np.mean(speeds) if speeds else 0speed_per_25_frames.append(avg_speed)# 计算蓝线以下的车辆密度vehicles_below_line = sum(1 for vehicle in vehicles if vehicle.bbox[1] > blue_line_y)density_per_25_frames.append(vehicles_below_line)print(f"每25帧车辆总数: {current_vehicle_count}, 平均速度: {avg_speed} km/h, 蓝线以下车辆数: {vehicles_below_line}")# 显示结果cv2.imshow('Vehicle Detection with YOLOv5', frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()print(f"视频 {video_path} 处理完成,车辆总数: {total_vehicle_count}")return vehicle_count_per_25_frames, speed_per_25_frames, density_per_25_frames# 绘制并保存车流密度、流量、速度的折线图到桌面,并生成Excel文件
def save_to_excel_and_plot(vehicle_counts, speed_counts, density_counts):time_points = list(range(1, len(vehicle_counts) + 1))  # X轴为每25帧的时间点# 创建DataFramedf = pd.DataFrame({'Time (every 25 frames)': time_points,'Vehicle Count (Flow)': vehicle_counts,'Average Speed (km/h)': speed_counts,'Vehicle Density (below blue line)': density_counts  # 添加蓝线以下车辆密度列})# 获取桌面路径desktop_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')  # Windowssave_dir = desktop_pathif not os.path.exists(save_dir):os.makedirs(save_dir)# 保存Excel文件excel_path = os.path.join(save_dir, 'vehicle_data_with_density.xlsx')df.to_excel(excel_path, index=False)print(f"数据已保存到 {excel_path}")# 绘制折线图plt.figure(figsize=(10, 6))# 绘制车辆流量plt.plot(time_points, vehicle_counts, marker='o', linestyle='-', color='b', label='Vehicle Count')# 绘制平均速度plt.plot(time_points, speed_counts, marker='s', linestyle='-', color='g', label='Average Speed')# 绘制蓝线以下车辆密度plt.plot(time_points, density_counts, marker='^', linestyle='-', color='r', label='Vehicle Density (below blue line)')plt.title('Vehicle Data over Time (every 25 frames)')plt.xlabel('Time (every 25 frames)')plt.ylabel('Value')plt.grid(True)plt.legend()# 保存图表到桌面save_path = os.path.join(save_dir, 'vehicle_data_with_density_plot.png')plt.savefig(save_path)print(f"图表已保存到 {save_path}")plt.show()# 处理视频
video_paths = ['20240501_20240501135236_20240501160912_135235.mp4']
for video_path in video_paths:vehicle_counts, speed_counts, density_counts = process_video_yolov5(video_path)save_to_excel_and_plot(vehicle_counts, speed_counts, density_counts)

在这里插入图片描述

下面这个代码是对于之前的物体识别进行的初稿,出的效果很好看

import torch
import cv2
import numpy as np# 加载YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)def process_video_yolov5(video_path):cap = cv2.VideoCapture(video_path)if not cap.isOpened():print(f"无法打开视频文件 {video_path}")returnvehicle_count = 0while True:ret, frame = cap.read()if not ret:break# 使用YOLOv5进行检测results = model(frame)# 解析检测结果,results.pandas().xyxy 返回检测结果的 DataFramedetections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, conf, cls]for *box, conf, cls in detections:# 检测类别ID,2: 汽车, 3: 摩托车, 5: 公共汽车, 7: 卡车if int(cls) in [2, 3, 5, 7]:x1, y1, x2, y2 = map(int, box)vehicle_count += 1# 在图像上绘制检测框cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)# 显示结果cv2.imshow('Vehicle Detection with YOLOv5', frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()print(f"视频 {video_path} 处理完成,车辆总数: {vehicle_count}")# 处理视频
video_paths = ['20240501_20240501135236_20240501160912_135235.mp4']
for video_path in video_paths:process_video_yolov5(video_path)

在这里插入图片描述
两者结合就是下面这个
在这里插入图片描述

三、感受

比赛真的是很锻炼人的能力,但是也是收获颇丰。
首先就是遇到两个很好很好的朋友,zxz,lsy,两个队友,哈哈哈哈哈感觉,比完赛感觉我们都认识三年了一样,很熟了。
其次就是我安装完成了torch、pycharm、以及虚拟环境的概念的、库的安装(这一点真的很关键,因为我也在想我发论文准备看着机器视觉的方向发展,而且我之前的深度之眼的专栏,也是到了安装anacoda、pycharm、cuda(原来我的电脑nvidia本来就有)、ptorch,之后就卡住了,因为感觉分不清他们,几个怕安装错了
然后,我队友也是帮我安装好类似公式编辑器的东西,还有一个公式识别的网站,两个搭配起来真的超级好用。
还有就是论文写作,也是相应的锻炼了自己论文写作能力把,也是完成了本科想当模型的梦想。哈哈哈哈哈,不想当模型的软件,不是好软件。也是写了数学建模方向的第一次的摘要,写的也是十分的充实,很开心的被认可了。(唯一的遗憾就是流程图、图啥的几乎是没有的,时间太少了)
最后,chatgpt真是神器,需要什么样的代码跟他说就行,报了什么错问他就行,提出问题,让他给出模型,,给他数据也能按照你的要求进行相应的处理,出图、分析,很牛逼。

相关文章:

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛&#xff08;也就是华为杯&#xff09;&#xff0c;也是和本校的两个数学学院的朋友在网上组的队伍。昨天&#xff08;9.25&#xff09;通宵干完论文&#xff08;一条…...

绝了,自从用了它,我每天能多摸鱼2小时!

大家好&#xff0c;我是可乐。 俗话说的好&#xff1a;“摸鱼一时爽&#xff0c;一直摸鱼一直爽”。 作为一个程序员&#xff0c;是否有过调试代码熬到深夜&#xff1f;是否有过找不到解决方案而挠秃头顶&#xff1f; 但现在你即将要解放了&#xff0c;用了这款工具——秘塔…...

C语言指针系列1——初识指针

祛魅&#xff1a;其实指针这块儿并不难&#xff0c;有人说难只是因为基础到进阶没有处理好&#xff0c;大家要好好跟着一步一步学习&#xff0c;今天我们先来认识一下指针 指针定义&#xff1a;指针就是内存地址&#xff0c;指针变量是用来存放内存地址的变量&#xff0c;在同一…...

传神论文中心|第26期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;传神社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自…...

NLP基础1

NLP基础1 深度学习中的NLP的特征输入 1.稠密编码&#xff08;特征嵌入&#xff09; 稠密编码&#xff08;Dense Encoding&#xff09;&#xff1a;指将离散或者高纬的稀疏数据转化为低纬度的连续、密集向量表示 特征嵌入&#xff08;Feature Embedding&#xff09; ​ 也称…...

001.docker30分钟速通版

docker简介 docker就是一个用于构建&#xff08;build&#xff09;&#xff0c;运行&#xff08;run&#xff09;&#xff0c;传送&#xff08;share&#xff09;应用程序的平台做一个不恰当的类比&#xff0c;就是外卖平台&#xff0c;如果你自己做华莱士不一定好吃&#xff0…...

Kafka 在 Linux 下的集群配置和安装

Kafka 在 Linux 下的集群配置和安装 Apache Kafka 是一个流行的分布式流处理平台&#xff0c;广泛用于实时数据管道和流处理应用。本文将详细讲解如何在 Linux 环境中配置和安装 Kafka 集群&#xff0c;并包括通过 Docker 安装和配置 Kafka 的步骤。每个步骤都将提供详细的解释…...

Python--操作列表

1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名&#xff0c;用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象&#xff0c;比如列表&#xff08;…...

JMeter(需要补充请在留言区发给我,谢谢)

一、学习工具 1、CinfigElement(HTTP Request Defaults、HTTP Header Manager、HTTP Authorization、CSV Data Set Config、User Defined Variables、JDBC Connection Configuration、HTTP Cookie Manager、Random Variable) 二、协议 1、HTTP协议&#xff08;消息体数据&am…...

线程池的执行流程和配置参数总结

一、线程池的执行流程总结 提交线程任务&#xff1b;如果线程池中存在空闲线程&#xff0c;则分配一个空闲线程给任务&#xff0c;执行线程任务&#xff1b;线程池中不存在空闲线程&#xff0c;则线程池会判断当前线程数是否超过核心线程数&#xff08;corePoolSize&#xff09…...

node-red-L3-重启指定端口的 node-red

重启指定端口 目的步骤查找正在运行的Node.js服务的进程ID&#xff08;PID&#xff09;&#xff1a;停止Node.js服务&#xff1a;启动Node.js服务&#xff1a; 目的 重启指定端口的 node-red 步骤 在Linux系统中&#xff0c;如果你想要重启一个正在运行的Node.js服务&#x…...

(done) 使用泰勒展开证明欧拉公式

问问神奇的 GPT&#xff0c;how to prove euler formula? 一个答案如下&#xff1a;...

红队apt--邮件钓鱼

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 免责声明: 本文仅供了解攻击方手法使用&#xff0c;切勿用于非授权情节 初步了解邮件基础 用途方面 这个我们应该比较熟悉&#xff0c;最常用于验证码接收&#xff0c;也有一些厂商会用这个来打广告&#xff0c;…...

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后&#xff1a; MyBatis 的官方文档&#xff1a;https://mybatis.p2hp.com/ 关于 MyBa…...

DNS协议解析

DNS协议解析 什么是DNS协议 IP地址&#xff1a;一长串唯一标识网络上的计算机的数字 域名&#xff1a;一串由点分割的字符串名字 网址包含了域名 DNS&#xff1a;域名解析协议 IP>域名 --反向解析 域名>IP --正向解析 域名 由ICANN管理&#xff0c;有级别&#xf…...

每日一题——第一百零八题

题目&#xff1a; 写几个函数&#xff0c; ①输入10个职工的姓名和职工号 ②按照职工号由小到大排列&#xff0c; 姓名顺序也随之调整 ③要求输入一个职工号&#xff0c; 用折半查找找出该职工的姓名 #include<stdio.h> #include<string.h> #define MAX_EMPOLYEES…...

使用Python免费将pdf转为docx

刚刚想将pdf转换为docx文档时&#xff0c;居然要收费 还好我学过编程&#xff0c;这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 &#xff08;1&#xff09;在终端上安装 pdf2docx 是一个 Python 库&#xff0c;它可以将 PDF 文件转换为 Word (…...

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…...

C#实现指南:将文件夹与exe合并为一个exe

在软件开发过程中&#xff0c;有时需要将多个文件&#xff08;如资源文件、配置文件等&#xff09;与可执行文件&#xff08;exe&#xff09;打包在一起&#xff0c;以便于分发和部署。在C#中&#xff0c;我们可以利用ILMerge或Costura.Fody等工具来实现这一目标。本文将介绍如…...

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言&#xff1a;本节内容是信号&#xff0c; 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识&#xff08;没有学过的友友可以查看我的前一篇文章&#xff09;。 以及我们还没有学习信号的第三个阶段——信…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...