wordpress 移動(dòng)app網(wǎng)絡(luò)優(yōu)化工程師吃香嗎
結(jié)合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技術(shù),可以實(shí)現(xiàn)一個(gè)高效的車(chē)輛檢測(cè)和測(cè)速系統(tǒng)。這樣的系統(tǒng)適用于交通監(jiān)控、智能交通管理系統(tǒng)(ITS)等領(lǐng)域,能夠?qū)崟r(shí)識(shí)別并跟蹤車(chē)輛,并估算其速度。
項(xiàng)目介紹
本項(xiàng)目旨在開(kāi)發(fā)一個(gè)綜合性的車(chē)輛檢測(cè)和測(cè)速系統(tǒng),該系統(tǒng)利用先進(jìn)的目標(biāo)檢測(cè)和多目標(biāo)跟蹤技術(shù),能夠?qū)崿F(xiàn)在視頻流中對(duì)車(chē)輛進(jìn)行實(shí)時(shí)檢測(cè)、跟蹤,并計(jì)算車(chē)輛的速度。系統(tǒng)主要分為以下幾個(gè)部分:
- 目標(biāo)檢測(cè):使用YOLOv8模型進(jìn)行車(chē)輛檢測(cè)。
- 目標(biāo)跟蹤:結(jié)合DeepSORT、BoTSORT和ByteTrack算法實(shí)現(xiàn)多目標(biāo)跟蹤。
- 測(cè)速:基于車(chē)輛在視頻中的位移和時(shí)間差來(lái)計(jì)算速度。
- 用戶(hù)界面:使用PyQt5構(gòu)建GUI,便于用戶(hù)操作和查看結(jié)果。
關(guān)鍵功能
- 實(shí)時(shí)車(chē)輛檢測(cè):通過(guò)YOLOv8模型實(shí)時(shí)檢測(cè)視頻中的車(chē)輛。
- 多目標(biāo)跟蹤:利用DeepSORT、BoTSORT和ByteTrack算法同時(shí)跟蹤多個(gè)車(chē)輛。
- 速度估計(jì):根據(jù)車(chē)輛在視頻中的運(yùn)動(dòng)軌跡和時(shí)間差計(jì)算速度。
- 用戶(hù)界面:提供圖形用戶(hù)界面供用戶(hù)啟動(dòng)分析并查看結(jié)果。
技術(shù)棧
- 目標(biāo)檢測(cè):YOLOv8(You Only Look Once v8)
- 多目標(biāo)跟蹤:DeepSORT、BoTSORT、ByteTrack
- 圖形用戶(hù)界面:PyQt5
- 視頻處理:OpenCV
- 編程語(yǔ)言:Python
關(guān)鍵代碼示例
1. 安裝依賴(lài)
首先確保安裝了所有必要的庫(kù):
1pip install opencv-python torch torchvision pyqt5 numpy scikit-learn filterpy
2pip install ultralytics # 用于YOLOv8
3git clone https://github.com/nwojke/deep_sort.git # DeepSORT
4git clone https://github.com/ifzhang/ByteTrack.git # ByteTrack
5git clone https://github.com/ifzhang/BoT-SORT.git # BoTSORT
2. 導(dǎo)入庫(kù)
1import sys
2import cv2
3import numpy as np
4import torch
5from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton
6from PyQt5.QtCore import QTimer
7from PyQt5.QtGui import QImage, QPixmap
8from ultralytics import YOLO # 使用YOLOv8的最新版本
9from deep_sort_pytorch.deep_sort import DeepSort # DeepSORT
10from botsort import BoTSORT # BoTSORT
11from bytetrack import BYTETracker # ByteTrack
3. 初始化模型
假設(shè)YOLOv8模型的權(quán)重文件位于weights/yolov8.pt
。
1device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2yolo_model = YOLO('weights/yolov8.pt').to(device)
3
4# 初始化跟蹤器
5deepsort = DeepSort(
6 "deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7",
7 max_dist=0.2,
8 max_iou_distance=0.7,
9 max_age=70,
10 n_init=3,
11 nn_budget=100,
12 use_cuda=True
13)
14
15botsort = BoTSORT(device, max_age=1, min_hits=3, iou_threshold=0.1)
16bytetrack = BYTETracker(device, fp16=True, track_thresh=0.5, track_buffer=30, match_thresh=0.8)
4. 創(chuàng)建GUI
創(chuàng)建一個(gè)簡(jiǎn)單的GUI來(lái)顯示視頻流和檢測(cè)結(jié)果。
1class VideoAnalysisWindow(QMainWindow):
2 def __init__(self):
3 super().__init__()
4 self.initUI()
5
6 def initUI(self):
7 self.setWindowTitle('車(chē)輛檢測(cè)與測(cè)速系統(tǒng)')
8 self.setGeometry(100, 100, 800, 600)
9
10 layout = QVBoxLayout()
11 self.label = QLabel(self)
12 layout.addWidget(self.label)
13
14 button = QPushButton('開(kāi)始分析', self)
15 button.clicked.connect(self.start_analysis)
16 layout.addWidget(button)
17
18 container = QWidget()
19 container.setLayout(layout)
20 self.setCentralWidget(container)
21
22 def start_analysis(self):
23 self.capture = cv2.VideoCapture(0) # 使用攝像頭0作為視頻源
24 self.timer = QTimer()
25 self.timer.timeout.connect(self.update_frame)
26 self.timer.start(20) # 每50毫秒更新一次畫(huà)面
27
28 def update_frame(self):
29 ret, frame = self.capture.read()
30 if ret:
31 # 檢測(cè)車(chē)輛
32 results = yolo_model(frame)
33 detections = results.xyxy[0].cpu().numpy()
34
35 # 跟蹤車(chē)輛
36 tracks = deepsort.update(detections, frame)
37 tracks_botsort = botsort.update(detections, frame)
38 tracks_bytetrack = bytetrack.update(detections, frame)
39
40 # 繪制邊界框
41 self.draw_boxes(frame, tracks)
42 self.draw_boxes(frame, tracks_botsort)
43 self.draw_boxes(frame, tracks_bytetrack)
44
45 # 顯示結(jié)果
46 self.display_results(frame)
47
48 def draw_boxes(self, frame, tracks):
49 for track in tracks:
50 bbox = track[:4]
51 id = int(track[4])
52 x1, y1, x2, y2 = [int(i) for i in bbox]
53 cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
54 cv2.putText(frame, f"ID: {id}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
55
56 def display_results(self, frame):
57 height, width, channel = frame.shape
58 bytesPerLine = 3 * width
59 qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_BGR888)
60 pixmap = QPixmap.fromImage(qImg)
61 self.label.setPixmap(pixmap)
62
63if __name__ == '__main__':
64 app = QApplication(sys.argv)
65 window = VideoAnalysisWindow()
66 window.show()
67 sys.exit(app.exec_())
測(cè)速邏輯
測(cè)速邏輯可以通過(guò)計(jì)算車(chē)輛在視頻中的位移和時(shí)間差來(lái)實(shí)現(xiàn)。具體來(lái)說(shuō),可以跟蹤車(chē)輛的軌跡,并記錄其在不同時(shí)間點(diǎn)的位置,然后使用這些信息來(lái)估算速度。
1def estimate_speed(tracks, fps):
2 speeds = []
3 for track in tracks:
4 # 獲取軌跡點(diǎn)
5 positions = track['positions']
6 timestamps = track['timestamps']
7
8 # 計(jì)算速度
9 for i in range(len(positions) - 1):
10 distance = np.linalg.norm(positions[i + 1] - positions[i])
11 time_diff = timestamps[i + 1] - timestamps[i]
12 speed = distance / time_diff * fps
13 speeds.append(speed)
14
15 return speeds
結(jié)論
通過(guò)結(jié)合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技術(shù),本項(xiàng)目實(shí)現(xiàn)了一個(gè)功能完備的車(chē)輛檢測(cè)和測(cè)速系統(tǒng)。該系統(tǒng)能夠?qū)崟r(shí)檢測(cè)視頻中的車(chē)輛,跟蹤它們的運(yùn)動(dòng),并計(jì)算速度。此外,系統(tǒng)還提供了一個(gè)簡(jiǎn)單的圖形用戶(hù)界面,使得用戶(hù)可以輕松啟動(dòng)分析并查看結(jié)果。隨著技術(shù)的不斷發(fā)展和完善,這樣的系統(tǒng)將在智能交通管理、公共安全等領(lǐng)域發(fā)揮越來(lái)越重要的作用。