【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现

news2024/9/23 18:39:22

在这里插入图片描述

题目

【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析

【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析

1 问题一

(1) 第一小问

  1. 首先,需要将视频文件转换为帧,以便进行后续处理。
  2. 然后,使用算法对视频帧进行检测车辆。代码实现了YOLO5算法,尝试了FastRCNN算法非常耗时,不建议运行。
  3. 使用跟踪算法跟踪车辆。以下采用的SORT,或者DeepSORT等算法。
  4. 计算特征
  • 时间戳:通过视频帧的位置获取。
  • 车流密度:车流密度通常是检测到的车辆数量与区域面积的比值。
  • 车流量:在一定时间段内通过的车辆数量。
  • 平均速度:首先计算车辆的位移:通过跟踪的车辆ID在每一帧之间的位置信息,计算每辆车在相邻帧之间的位移。然后计算时间间隔:根据时间戳计算相邻帧之间的时间间隔。最后计算速度:使用位移除以时间间隔得到车辆的速度。

(2) 第二、三小问

可以使用时序预测模型(例如LSTM、ARIMA)或传统的回归模型(如线性回归、决策树)来预测交通流拥堵情况。下面是一个基于随机森林回归的实现,提取的车流参数(车流密度、车流量、速度)来预测未来是否会发生拥堵。使用从四个观测点视频中提取的车流密度、车流量和速度等数据作为模型输入,进行时序建模,并预测未来的交通拥堵状态。基于历史数据预测下一时间点的交通流参数(车流密度、车流量和速度),并结合定义的拥堵条件,发出实时预警。

定义拥堵状态:当车流密度大于0.7且速度小于40 km/h时

使用测试集验证模型预测的车流密度、车流量和速度,并结合可视化方法来评估模型的表现。计算混淆矩阵和ROC曲线,分析模型的拥堵预测能力。

import cv2
import torch
from sort.sort import Sort
import numpy as np
import pandas as pd
from datetime import datetime
from tqdm import tqdm  # 用于显示进度条
device = torch.device("cuda" if True else "cpu")
# 使用 YOLOv5 作为目标检测模型
def load_model():
    # 使用 Ultralytics 的 YOLOv5 模型,确保已安装 'yolov5' 包
    # pip install yolov5
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
    model.to(device)
    model.eval()
    return model

# 将检测结果格式化为 SORT 算法接受的格式
def format_detections(predictions, score_threshold=0.5):
    detections = []
    for *box, score, cls in predictions:
        if score > score_threshold and int(cls) == 2:  # COCO中 'car' 的类别ID通常为2
            x1, y1, x2, y2 = box
            detections.append([x1, y1, x2, y2, score])
    return detections

# 计算车辆速度 (像素/秒)
def calculate_speed(track, prev_track, fps):
    if prev_track is None:
        return 0
    # 计算位移 (欧几里得距离)
    x1, y1, _, _ = track[:4]
    prev_x1, prev_y1, _, _ = prev_track[:4]
    displacement = np.sqrt((x1 - prev_x1)**2 + (y1 - prev_y1)**2)
    time_interval = 1 / fps  # 时间间隔(秒)
    return displacement / time_interval  # 像素/秒

# 处理视频,提取车辆流量信息
def detect_and_track(video_path, model, tracker, device, score_threshold=0.5, resize_width=640):
    # 打开视频
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise IOError(f"无法打开视频文件 {video_path}")
    
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    
    # 初始化数据存储
    timestamps = []
    densities = []
    flows = []
    speeds = []
    
    tracked_objects = {}  # 存储每个车辆的历史轨迹
    total_flow = 0  # 总车流量
    
    # 使用 tqdm 显示处理进度
    for _ in tqdm(range(frame_count), desc=f"Processing {video_path}"):
        ret, frame = cap.read()
        if not ret:
            break
        
        # 记录时间戳(可以选择只记录关键帧的时间戳以减少开销)
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
        
        # 调整图像大小以加快处理速度
        if resize_width:
            height, width = frame.shape[:2]
            scale = resize_width / width
            frame_resized = cv2.resize(frame, (resize_width, int(height * scale)))
        else:
            frame_resized = frame
        
        # 转换颜色格式(BGR -> RGB)
        img_rgb = cv2.cvtColor(frame_resized, cv2.COLOR_BGR2RGB)
        
        # 使用模型进行检测
        results = model(img_rgb, size=640)  # size可以根据需求调整
        
        # 获取预测结果
        detections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, confidence, class]
        detections = format_detections(detections, score_threshold)
        
        if len(detections) > 0:
            ...else:
            # 如果当前帧没有检测到车辆,存储默认值
            timestamps.append(timestamp)
            densities.append(0)
            flows.append(0)
            speeds.append(0)
    
    cap.release()
    
    # 返回结果 DataFrame
    data = pd.DataFrame({
        'timestamp': timestamps,
        'density': densities,
        'flow': flows,
        'speed': speeds
    })
    
    return data

def extract_vehicle_data(video_paths, score_threshold=0.5, resize_width=640):
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = load_model()
    tracker = Sort()
    
    all_vehicle_data = []
    for video in video_paths:
        vehicle_data = detect_and_track(
            video_path=video,
            model=model,
            tracker=tracker,
            device=device,
            score_threshold=score_threshold,
            resize_width=resize_width
        )
        all_vehicle_data.append(vehicle_data)
    
    # 合并所有视频的数据
    all_vehicle_data = pd.concat(all_vehicle_data, ignore_index=True)
    
    return all_vehicle_data


可视化提取出来的特征

import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = 'SimSun' # 换成自己环境下的中文字体,比如'SimHei'

# 第一个观测点数据可视化

# result_df = pd.read_csv('data/data_point1.csv')
# result_df = pd.read_csv('data/data_point1.csv')
# result_df = pd.read_csv('data/data_point3.csv')
result_df = pd.read_csv('data/data_point4.csv')
# 可视化车流密度、流量和平均速度
plt.figure(figsize=(10, 8))
plt.subplot(3, 1, 1)
plt.plot(range(len(result_df)), result_df['density'], label='车流密度', color='blue')
plt.title('车流密度随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('车流密度')
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(range(len(result_df)), result_df['flow'], label='车流量', color='orange')
plt.title('车流量随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('车流量')
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(range(len(result_df)), result_df['speed'], label='平均速度', color='green')
plt.title('平均速度随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('平均速度 (像素/秒)')
plt.legend()

plt.tight_layout()
plt.savefig('img/第4个观测点数据可视化.png',dpi=200)
plt.show()

在这里插入图片描述

问题二 、三

传统应急车道的启用多是静态的,且缺少区域路网联动分析,难以动态应对不同场景下的交通需求。因此,模型需要集成多情景的动态分析,包括节假日高峰、突发事故、排队消散等情景。 对不同情景的处理逻辑,如在节假日高峰期通过流量监测系统提前识别大流量,启用应急车道;对于已经拥堵的路段,采取临时开放应急车道的策略来消散车流,恢复主线运行。

虚拟应急车道能够通过主动交通管理技术提升救援效率,缩短事故响应时间。因此,模型可考虑集成虚拟应急车道的控制策略,利用车辆通信系统动态引导车辆临时进入虚拟应急车道,提升通行效率。 在紧急情况下,模型通过仿真预测未来交通流量,并决定是否虚拟启用应急车道,结合事故发生时的流量、速度等关键参数决定应急车道的开放时长与区域。

应急车道管控不仅需要考虑实时流量与交通状况,还需结合历史数据,分析拥堵易发节点,构建拥堵中断模型。对于应急车道的开放时机和时长,需基于具体的交通状况预测。 集成实时交通数据与历史拥堵数据,构建交通流概率中断模型,动态调整应急车道的开放时长和开放区域。

可以通过VISSIM仿真分析不同车道配置下虚拟应急车道的效益优化,表明在不同事故情景下,适时开启虚拟应急车道可有效减少平均延误和排队长度。模型可以根据车道封闭数量和流量密度优化启用条件。引入VISSIM仿真结果,基于流量密度、封闭车道数和v/C值优化应急车道的启用条件,进一步提升模型的精度。

import pandas as pd
import numpy as np
import warnings

warnings.filterwarnings('ignore')
# 设置阈值
density_threshold = 0.7  # 车流密度阈值
speed_threshold = 40  # 速度阈值,单位:km/h

# 拥堵风险计算函数
def compute_congestion_risk(density, speed, density_threshold, speed_threshold):
   ...return congestion_risk

# 添加高峰期和事故判断函数
def is_peak_hour(timestamp):
    """假设高峰时段为每天的7-9点和17-19点"""
    hour = pd.to_datetime(timestamp).hour
    return (7 <= hour <= 9) or (17 <= hour <= 19)

def is_accident_scene(density, speed):
    """假设当速度为0且密度很高时为事故"""
    return (speed == 0) and (density > density_threshold)

# 动态管控模型:应急车道启用判断
def dynamic_control(data, density_threshold, speed_threshold, time_window=10):
    # 计算每个时刻的拥堵风险
    data['congestion_risk'] = data.apply(
        lambda row: compute_congestion_risk(row['density'], row['speed'], density_threshold, speed_threshold), axis=1)

    # 判断是否为高峰时段
    data['peak_hours'] = data['timestamp'].apply(is_peak_hour)

    # 判断是否为事故现场
    data['accident_scene'] = data.apply(lambda row: is_accident_scene(row['density'], row['speed']), axis=1)

    # 滑动窗口计算未来time_window分钟内的平均拥堵风险
    data['avg_risk'] = data['congestion_risk'].rolling(window=time_window).mean()

    # 如果未来的平均风险超过1,且为高峰期或事故现场,启用虚拟应急车道
    data['virtual_lane'] = np.where((data['avg_risk'] > 1) & (data['peak_hours'] | data['accident_scene']), True, False)
    return data



# 读取数据并应用模型
data_point = pd.read_csv('data/data_point1.csv')
data = data_point[(data_point['speed'] > 0) & (data_point['density'] > 0)]


# 应用动态控制模型
result = dynamic_control(data, density_threshold, speed_threshold)
# 输出结果
print(result[['timestamp', 'virtual_lane']])


在这里插入图片描述

问题四

  1. 问题分析

原有四个采集点的布置方案中,前三个采集点之间相隔 1000m,最后一个点与第三个点之间相隔 3000m。但是这样的布置在前1000m 的路段可以较好地捕捉交通状态变化,但在距离较长的第三点和第四点之间,可能会丢失大量交通流变化的信息。

优化数据采集点的布置,确保在第三点和第四点之间的 3000m 路段上能够精确采集数据,以便做出更科学的应急车道启用决策。优化模型的核心目标是:

  • 精度:确保关键路段(第三点到第四点)的交通状态能够被准确地监控。
  • 成本控制:在精度要求下,尽量减少新采集点的数量,降低安装与维护的成本。
  1. 建模算法步骤

(1)初始化参数:

  • 设定采集点的最小间隔 D min = 1000   m D_{\text{min}} = 1000 \, m Dmin=1000m
  • 设定应急响应时间 T response = 10   分钟 T_{\text{response}} = 10 \, \text{分钟} Tresponse=10分钟
  • 获取现有四个采集点的交通流量、速度和密度数据。

(2)计算每个路段的交通状态变异性:
根据变异性公式,计算各个路段的变异性 V i V_i Vi

(3)判断是否需要增加采集点:
如果某个路段的变异性 V i V_i Vi 超过预定阈值 V threshold V_{\text{threshold}} Vthreshold,则需要在该路段新增数据采集点。

(4)优化布点方案:

  • 在第三点到第四点之间,若变异性较大( V 2 > V threshold V_2 > V_{\text{threshold}} V2>Vthreshold),则在1500m处增加新的采集点。
  • 保证数据采集点的间隔 D new ≥ D min D_{\text{new}} \geq D_{\text{min}} DnewDmin

(5)输出新的采集点布置方案。

import pandas as pd
import numpy as np

# 初始化参数
D_min = 1000  # 最小采集点间隔,单位:米
T_response = 10  # 应急响应时间,单位:分钟
V_threshold = 0.2  # 变异性阈值

# 读取数据
data_point1 = pd.read_csv('data/data_point1.csv')
data_point2 = pd.read_csv('data/data_point2.csv')
data_point3 = pd.read_csv('data/data_point3.csv')
data_point4 = pd.read_csv('data/data_point4.csv')

# 计算交通状态变异性
def compute_variability(data):
   ...# 计算每个路段的变异性
V1 = compute_variability(data_point1)
V2 = compute_variability(data_point2)
V3 = compute_variability(data_point3)
V4 = compute_variability(data_point4)

# 判断是否需要增加采集点
def check_new_point(V, V_threshold, D_current, D_min):
    if V > V_threshold and D_current > D_min:
        return True
    return False

# 路段间隔(第三点到第四点为3000m,其他为1000m)
D1, D2, D3 = 1000, 1000, 3000

# 判断第三点和第四点之间是否需要新增采集点
new_point_needed = check_new_point(V3, V_threshold, D3, D_min)

# 输出优化的布置方案
if new_point_needed:
    print("建议在第三点到第四点之间新增采集点")
else:
    print("现有采集点布置合理,无需新增采集点")

完整资料

转到B站视频介绍
bilibili.com/video/BV16AskeMEPN/?share_source=copy_web&vd_source=d2dd5fcbeeeec396792650b25c110a13
在这里插入图片描述

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

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

相关文章

杰发科技——Eclipse环境安装

文件已传到网盘&#xff1a; 1. 安装文件准备 2. 安装Make 默认路径&#xff1a;C:\Program Files (x86)\GnuWin32\bin\ 不复制的话会报错 Error: Program "make" not found in PATH 3. 安装工具链 默认路径&#xff1a;C:\Program Files (x86)\Arm GNU Toolchain…

阅读CVPR论文——mPLUG-Owl2:革命性的多模态大语言模型与模态协作

读后感悟&#xff1a; 1&#xff09;实验部分非常丰富&#xff0c;并且论文中的图制作的非常精美&#xff0c;论文开篇的图制作的别出心裁&#xff0c;将几种不同的方法表现出的性能差异不是以普通的表格形式展现&#xff0c;而是制作成了一副环状折线图&#xff0c;论文中其他…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19 1. SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation Authors: Yi-Chia Chen, Wei-Hua Li, Cheng Sun, Yu-Chiang Frank Wang, Chu-Song Chen SAM4MLLM: 增强多模…

网络通信——NAT(网络地址转换)

一.NAT是什么 1.首先运营商维护的网络时公网的&#xff0c;使用的是公网的IP地址&#xff0c;而私有的IP地址的不能的在公网上路由&#xff0c;为了保证网络互通&#xff0c;所以有了NAT技术。 2.NAT一般部署在公网和私网上的网关设备上面。 二.为什么会这样 因为你只要出到…

CAD图纸防泄密如何实现?六个措施杜绝泄密风险!

在工程设计领域&#xff0c;CAD图纸作为企业的核心机密之一&#xff0c;其安全性直接关系到企业的技术优势和商业竞争力。 然而&#xff0c;随着信息技术的不断发展&#xff0c;CAD图纸的泄密风险也日益增加。 为了确保CAD图纸的安全&#xff0c;企业必须采取一系列有效的防泄…

ubuntu下使用qt编译QOCI(libqsqloci.so)驱动详解及测试

1、系统及软件版本:ubuntu16.04LTS 安装在WMare虚拟机上,qt的版本是QT5.12.11 2、下载编译libqsqloci.so驱动所需的oracle相关sdk包和basic包,我下载的是11.2.0.4版本,下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.htm…

(done) 声音信号处理基础知识(1) (course overview)

来源&#xff1a;https://www.youtube.com/watch?viCwMQJnKk2c 声学处理应用场景如下 这个系列的内容包括如下&#xff1a; 作者的 slack 频道 油管主的 github repo: https://github.com/musikalkemist/AudioSignalProcessingForML

GRE隧道协议学习笔记

使用场景 分布在不同地理位置的总公司和分公司怎么通过网络连接起来&#xff1f; 可以使用ISP网络连接。在豆包中可以看到如下回答通俗的讲就是运营商收费提供网络服务&#xff0c;有个人的有企业的&#xff0c;企业的很贵 为什么要使用GRE隧道 当然你也可以用其他隧道协议…

使用PyTorch检测和验证多GPU环境的Python脚本

使用PyTorch检测和验证多GPU环境的Python脚本 在深度学习和机器学习中&#xff0c;GPU的计算能力对模型训练和推理的速度有着极大的影响。随着多GPU系统的普及&#xff0c;如何确保多GPU能被正确识别并使用&#xff0c;是一个非常关键的问题。本文将为大家介绍一段简洁的Pytho…

新一代图像生成E2E FT:深度图微调突破

文章地址&#xff1a;Fine-Tuning Image-Conditional Diffusion Models is Easier than You Think 项目主页&#xff1a;https://gonzalomartingarcia.github.io/diffusion-e2e-ft/ 代码地址&#xff1a;https://github.com/VisualComputingInstitute/diffusion-e2e-ft 机构&am…

【常见框架漏洞】ThinkPHP、struts2、Spring、Shiro

一、ThinkPHP 1.环境配置 靶场:vulhub/thinkphp/5-rcedocker-compose up -d #启动环境 访问靶场:http://ip:8080/index.php2.远程命令执行 执行whoami命令 poc: http://47.121.211.205:8080/index.php?sindex/think\app/invokefunction&functioncall_user_func_array&…

物联网(IoT)中基于深度学习的入侵检测系统的综合综述

这篇论文是一篇全面的综述&#xff0c;标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”&#xff0c;作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…

Python自动化-操作Excel

在数据处理和报表生成过程中&#xff0c;Excel是一个经常使用的工具。Python中的openpyxl库可以让您通过编程方式读取、写入和操作Excel文件&#xff0c;从而实现自动化的数据处理和报表生成。本文将介绍openpyxl库的基本用法和常见操作&#xff0c;帮助您快速上手使用Python处…

蘑菇成熟待收检测系统源码分享

蘑菇成熟待收检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

TQRFSOC开发板47DR PS端DDR4测试

本例程实现对PS端的DDR4进行测试&#xff0c;包括内存读写测试&#xff0c;读写眼图测试等。 创建vivado项目与vitis平台项目的流程与hello world相同&#xff0c;我就不在此处重复演示&#xff0c;也可以在hello world 项目基础上添加应用程序项目。在vitis中创建平台项目后新…

隐私计算相关知识

WOE&#xff08; Weight of Evidence&#xff09;编码 一种在数据分析&#xff0c;尤其是信用评分和欺诈检测等领域中常用的特征编码方法。它的主要目的是将分类变量转换为数值变量&#xff0c;从而使得模型能够更好地理解类别与目标变量之间的关系 IV&#xff08; Informatio…

二.python基础语法

目录 1.第一个python实例 2.python编码规范 2.1.编写规则 2.2.命名规范 2.3. 空格 2.4. 缩进 2.5. 注释 3.python关键字和标识符 3.1.标识符 3.2.关键字 4.python变量 4.1. 定义变量 4.2. 变量类型是可变的 4.3. 多个变量指向同一个值 5.python基本数据类型 5.…

通过组态王在ARMxy边缘计算网关上实现设备集成

随着工业4.0和智能制造理念的普及&#xff0c;设备集成已成为提高生产效率、优化资源配置的重要手段之一。ARMxy系列中的BL340边缘计算网关&#xff0c;以其强大的处理能力和丰富的接口资源&#xff0c;成为实现设备集成的理想平台。 1. BL340边缘计算网关概述 BL340系列是AR…

rce漏洞进阶-玩法思路-绕过姿态

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要是整理rce的一些绕过&#xff0c;以及思路等 用于实战中对着测漏洞用 偏进阶&#xff0c;不涉及基础的漏洞原理等内容 玩法思路 代码执行转化命令执行 遇到代码执行漏洞&#xff0c;我们可以传递syste…

计算机毕业设计选题推荐-基于python+Django的全屋家具定制服务平台

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、全屋家具定制…