wordpress去頂部文字seo深度解析
文章目錄
- 一、情況介紹
- 二、思路情況
- 二、代碼展示
- 三、感受
一、情況介紹
前幾天也是參加了研究生數(shù)學(xué)建模競賽(也就是華為杯),也是和本校的兩個數(shù)學(xué)學(xué)院的朋友在網(wǎng)上組的隊(duì)伍。昨天(9.25)通宵干完論文(一條爛命就是干!),我們選擇的是E題,題目內(nèi)容簡單點(diǎn)就是,高速公路上可能會堵車,對堵車情況進(jìn)行預(yù)測,并且啟動應(yīng)急車道舒緩交通壓力,通過的是4個監(jiān)測點(diǎn)的視頻。
emmm,這次比賽我想法是,隊(duì)長擔(dān)任模型,我是負(fù)責(zé)出圖、做軟件(知道我的人應(yīng)該清楚,我本科就是軟件),結(jié)果比賽第二天下午的時候,論文進(jìn)展幾乎為0,我就清楚了,這個隊(duì)伍沒有一個適合的模型,然后我就上了,當(dāng)一次“不正規(guī)”的模型(至于為什么不正規(guī),我下面會講,不過也是圓夢了我本科的一個想法,就是軟件轉(zhuǎn)模型,當(dāng)一次模型)
二、思路情況
這里我就不展示我的摘要了,哈哈哈哈,當(dāng)然我的摘要,也是被指導(dǎo)老師夸獎了。
這里我說下思路情況:
對于第一問:第一小問首先就是數(shù)據(jù)獲取,和隊(duì)友討論下,確定了三個參數(shù):車流量、車速、車流密度。(原本是想繼續(xù)加的,但是實(shí)在想不到什么比較好的參數(shù)),嗯花了2天時間數(shù)據(jù)才處理完成,中間磕磕絆絆,出的數(shù)據(jù)都不符合實(shí)際,最后準(zhǔn)備造的時候,發(fā)現(xiàn)出的數(shù)據(jù)正常了,然后出成折線圖,對各個時間段的各參數(shù)的情況進(jìn)行分析。比如什么時段到什么時段車速多少、車密度和之前對比怎么樣。第二小問,首先使用肘部法則,確定聚類數(shù)(我看下圖,確定為5),之后使用k-means聚類聚5類,最后按照數(shù)據(jù)使用ARIMA時間序列模型,預(yù)測5分鐘的數(shù)據(jù)。第三小問,使用交叉驗(yàn)證驗(yàn)證有效性。
對于第二問:先說下,對于這題重點(diǎn)是,提供理論依據(jù),想了下又需要第一問產(chǎn)生關(guān)聯(lián),所以就是介紹了基于時間序列預(yù)測結(jié)果的邏輯回歸模型,并且都是二分類問題,把理論依據(jù)給說明了
對于第三問:第一小問,就是首先用k-means聚類兩類,之后使用邏輯回歸,兩者進(jìn)行對比。第二小問,量化的話,我們使用了混淆矩陣,放入k-means作為真實(shí)值,邏輯回歸作為預(yù)測值,帶入混淆矩陣。
對于第四問:我乍一看,再一分析,我以為是最優(yōu)化問題,有目標(biāo)函數(shù),也有約束條件。但是約束條件太空洞了。沒有什么預(yù)算之類的,反正我沒想到怎么搞,最后是確定預(yù)測精度隨著時間的變化,確定安裝視頻監(jiān)控點(diǎn)的位置。
二、代碼展示
對于問題一,使用yolov5算法對視頻數(shù)據(jù)進(jìn)行檢測
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)# 定義觀測區(qū)域的長度(單位:公里),假設(shè)為50米
observation_length = 0.05 # 50米等于0.05公里# 初始化OpenCV的多目標(biāo)追蹤器
tracker = cv2.legacy.MultiTracker_create()# 追蹤車輛的結(jié)構(gòu)
class Vehicle:def __init__(self, bbox, tracker):self.bbox = bbox # 車輛的檢測框self.tracker = tracker # 對應(yīng)的追蹤器self.positions = [] # 存儲每幀車輛中心的位置def add_position(self, center):self.positions.append(center)def calculate_speed(self, fps):# 如果追蹤到的點(diǎn)少于2個,無法計(jì)算速度if len(self.positions) < 2:return 0# 計(jì)算速度,根據(jù)前后位置和時間差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幀的車輛總數(shù)speed_per_25_frames = [] # 每25幀通過藍(lán)線的車輛平均速度density_per_25_frames = [] # 每25幀的車輛密度(藍(lán)線以下車輛數(shù))total_vehicle_count = 0# 獲取視頻幀的寬度和高度,用于繪制藍(lán)線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) # 在視頻四分之一處畫一根水平藍(lán)線while True:ret, frame = cap.read()if not ret:break# 每25幀重新檢測一次車輛,并更新跟蹤器if frame_count % 25 == 0:# 使用YOLOv5進(jìn)行車輛檢測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) # 計(jì)算檢測框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:# 計(jì)算中心點(diǎn)并保存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))# 繪制藍(lán)線cv2.line(frame, (0, blue_line_y), (frame_width, blue_line_y), (255, 0, 0), 2)frame_count += 1# 每25幀,計(jì)算一次車輛數(shù)量、通過藍(lán)線的車輛平均速度和車輛密度if frame_count % 25 == 0:# 統(tǒng)計(jì)當(dāng)前幀的車輛數(shù)current_vehicle_count = len(vehicles)vehicle_count_per_25_frames.append(current_vehicle_count)# 計(jì)算每輛車的平均速度speeds = [vehicle.calculate_speed(fps) for vehicle in vehicles]avg_speed = np.mean(speeds) if speeds else 0speed_per_25_frames.append(avg_speed)# 計(jì)算藍(lán)線以下的車輛密度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幀車輛總數(shù): {current_vehicle_count}, 平均速度: {avg_speed} km/h, 藍(lán)線以下車輛數(shù): {vehicles_below_line}")# 顯示結(jié)果cv2.imshow('Vehicle Detection with YOLOv5', frame)# 按 'q' 鍵退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()print(f"視頻 {video_path} 處理完成,車輛總數(shù): {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幀的時間點(diǎn)# 創(chuàng)建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 # 添加藍(lán)線以下車輛密度列})# 獲取桌面路徑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"數(shù)據(jù)已保存到 {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')# 繪制藍(lán)線以下車輛密度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)
下面這個代碼是對于之前的物體識別進(jìn)行的初稿,出的效果很好看
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進(jìn)行檢測results = model(frame)# 解析檢測結(jié)果,results.pandas().xyxy 返回檢測結(jié)果的 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)# 顯示結(jié)果cv2.imshow('Vehicle Detection with YOLOv5', frame)# 按 'q' 鍵退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()print(f"視頻 {video_path} 處理完成,車輛總數(shù): {vehicle_count}")# 處理視頻
video_paths = ['20240501_20240501135236_20240501160912_135235.mp4']
for video_path in video_paths:process_video_yolov5(video_path)
兩者結(jié)合就是下面這個
三、感受
比賽真的是很鍛煉人的能力,但是也是收獲頗豐。
首先就是遇到兩個很好很好的朋友,zxz,lsy,兩個隊(duì)友,哈哈哈哈哈感覺,比完賽感覺我們都認(rèn)識三年了一樣,很熟了。
其次就是我安裝完成了torch、pycharm、以及虛擬環(huán)境的概念的、庫的安裝(這一點(diǎn)真的很關(guān)鍵,因?yàn)槲乙苍谙胛野l(fā)論文準(zhǔn)備看著機(jī)器視覺的方向發(fā)展,而且我之前的深度之眼的專欄,也是到了安裝anacoda、pycharm、cuda(原來我的電腦nvidia本來就有)、ptorch,之后就卡住了,因?yàn)楦杏X分不清他們,幾個怕安裝錯了
然后,我隊(duì)友也是幫我安裝好類似公式編輯器的東西,還有一個公式識別的網(wǎng)站,兩個搭配起來真的超級好用。
還有就是論文寫作,也是相應(yīng)的鍛煉了自己論文寫作能力把,也是完成了本科想當(dāng)模型的夢想。哈哈哈哈哈,不想當(dāng)模型的軟件,不是好軟件。也是寫了數(shù)學(xué)建模方向的第一次的摘要,寫的也是十分的充實(shí),很開心的被認(rèn)可了。(唯一的遺憾就是流程圖、圖啥的幾乎是沒有的,時間太少了)
最后,chatgpt真是神器,需要什么樣的代碼跟他說就行,報了什么錯問他就行,提出問題,讓他給出模型,,給他數(shù)據(jù)也能按照你的要求進(jìn)行相應(yīng)的處理,出圖、分析,很牛逼。