如何构建深度学习 基于YOLOV8车辆汽车速度检测系统设计与实现实现具有车流计数,车辆跟踪,超速报警等功能,包含了yolov8算法,opencv,pyqt,速度匹配算法,语音报警_yolo8实现视频检测
文章目录
-
-
- 一、环境搭建
- 二、系统设计
-
- 1. YOLOv8模型加载与推理
- 2. 车辆跟踪与速度计算
- 3. 超速报警与语音提示
- 4. 数据库写入
- 5. PyQt GUI界面
- 6. HTML5前端展示
- 三、运行系统
- 1. `algorithm/car.py`
- 2. `utils/comUtil.py`
- 3. `utils/dataBaseService.py`
- 4. `utils/mythread.py`
- 5. `utils/playMusic.py`
- 6. `window/mainWindow.py`
- 7. `main.py`
- 8. `video`目录
- 9. `sound`目录
- 10. `car`目录
-
项目软件构建目标功能:
具有车流计数,车辆跟踪,超速报警等功能,包含了yolov8算法,opencv,pyqt,速度匹配算法,语音报警,数据库写入,html5等技术
以下为代码示例,仅供参考学习。
1
构建一个基于YOLO的车辆速度检测系统,包含车流计数、车辆跟踪、超速报警等功能,并结合OpenCV、PyQt、速度匹配算法、语音报警、数据库写入和HTML5等技术,是一个综合性很强的项目。以下是详细的实现步骤和代码示例。
一、环境搭建
确保安装了以下依赖库:
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu118pip install ultralytics opencv-python pyqt5 pandas sqlalchemy pyttsx3 flask
二、系统设计
1. YOLOv8模型加载与推理
from ultralytics import YOLO# 加载预训练的YOLOv8模型model = YOLO(\'yolov8s.pt\')
2. 车辆跟踪与速度计算
使用卡尔曼滤波器进行车辆跟踪,并通过连续帧之间的位置变化计算速度。
import cv2import numpy as npfrom collections import dequeclass VehicleTracker: def __init__(self): self.tracks = {} self.frame_count = 0 def update(self, detections): self.frame_count += 1 for det in detections: bbox_2d = det[:4] id = det[4] if id not in self.tracks: self.tracks[id] = deque(maxlen=2) self.tracks[id].append((bbox_2d, self.frame_count)) # 计算速度 speeds = {} for id, track in self.tracks.items(): if len(track) == 2: bbox1, frame1 = track[0] bbox2, frame2 = track[1] speed = self.calculate_speed(bbox1, bbox2, frame1, frame2) speeds[id] = speed return speeds def calculate_speed(self, bbox1, bbox2, frame1, frame2): # 简化版速度计算公式,实际应用中需要根据实际情况调整 distance = np.sqrt((bbox2[0] - bbox1[0])**2 + (bbox2[1] - bbox1[1])**2) time = frame2 - frame1 speed = distance / time return speed
3. 超速报警与语音提示
import pyttsx3class SpeedAlert: def __init__(self, threshold=60): self.threshold = threshold self.engine = pyttsx3.init() def check_speed(self, speeds): for id, speed in speeds.items(): if speed > self.threshold: self.alert(id, speed) def alert(self, id, speed): self.engine.say(f\"Vehicle {id} is speeding at {speed:.2f} km/h\") self.engine.runAndWait()
4. 数据库写入
from sqlalchemy import create_engine, Column, Integer, Float, Stringfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerBase = declarative_base()class VehicleSpeed(Base): __tablename__ = \'vehicle_speed\' id = Column(Integer, primary_key=True) vehicle_id = Column(String) speed = Column(Float)engine = create_engine(\'sqlite:///vehicles.db\')Base.metadata.create_all(engine)Session = sessionmaker(bind=engine)def log_speed(vehicle_id, speed): session = Session() new_record = VehicleSpeed(vehicle_id=vehicle_id, speed=speed) session.add(new_record) session.commit() session.close()
5. PyQt GUI界面
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QComboBoxfrom PyQt5.QtGui import QImage, QPixmapfrom PyQt5.QtCore import QTimerclass MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(\"Vehicle Speed Detection System\") self.label = QLabel(self) self.comboBox = QComboBox(self) self.comboBox.addItem(\"video1.mp4\") self.comboBox.addItem(\"video2.mp4\") self.button = QPushButton(\"Start\", self) layout = QVBoxLayout() layout.addWidget(self.label) layout.addWidget(self.comboBox) layout.addWidget(self.button) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) self.timer = QTimer(self) self.timer.timeout.connect(self.update_frame) self.cap = None self.button.clicked.connect(self.start_video) def start_video(self): video_path = self.comboBox.currentText() self.cap = cv2.VideoCapture(video_path) self.timer.start(30) def update_frame(self): ret, frame = self.cap.read() if ret: results = model(frame) detections = [] for r in results: boxes = r.boxes for box in boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) conf = box.conf[0] cls = int(box.cls[0]) if cls == 0: # 假设类别0为汽车 detections.append([x1, y1, x2, y2, cls]) speeds = tracker.update(detections) speed_alert.check_speed(speeds) for id, speed in speeds.items(): log_speed(id, speed) for det in detections: x1, y1, x2, y2 = det[:4] cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) qimage = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_BGR888) pixmap = QPixmap.fromImage(qimage) self.label.setPixmap(pixmap) else: self.timer.stop() self.cap.release()
6. HTML5前端展示
创建一个简单的Flask应用来展示数据。
from flask import Flask, render_templateapp = Flask(__name__)@app.route(\'/\')def index(): return render_template(\'index.html\')if __name__ == \'__main__\': app.run(debug=True)
templates/index.html
:
<!DOCTYPE html><html><head> <title>Vehicle Speed Detection</title></head><body> <h1>Vehicle Speed Detection System</h1> <table> <tr> <th>Vehicle ID</th> <th>Speed</th> </tr> </table></body></html>
三、运行系统
-
启动Flask应用:
python app.py
-
运行PyQt GUI:
if __name__ == \'__main__\': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
构建基于YOLO的车辆速度检测系统的详细步骤和代码示例。你可以根据实际需求进一步优化和扩展功能。
为了构建一个完整的基于YOLO的车辆速度检测系统,我们将按照项目结构逐步实现各个模块的功能。以下是详细的代码实现和说明。
1. algorithm/car.py
这个文件用于处理YOLO模型加载、车辆检测、跟踪和速度计算。
from ultralytics import YOLOimport cv2import numpy as npclass CarDetection: def __init__(self, model_path=\'yolov8n.pt\'): self.model = YOLO(model_path) self.tracker = VehicleTracker() def detect_and_track(self, frame): results = self.model(frame) detections = [] for r in results: boxes = r.boxes for box in boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) conf = box.conf[0] cls = int(box.cls[0]) if cls == 0: # 假设类别0为汽车 detections.append([x1, y1, x2, y2, cls]) speeds = self.tracker.update(detections) return detections, speedsclass VehicleTracker: def __init__(self): self.tracks = {} self.frame_count = 0 def update(self, detections): self.frame_count += 1 for det in detections: bbox_2d = det[:4] id = det[4] if id not in self.tracks: self.tracks[id] = deque(maxlen=2) self.tracks[id].append((bbox_2d, self.frame_count)) speeds = {} for id, track in self.tracks.items(): if len(track) == 2: bbox1, frame1 = track[0] bbox2, frame2 = track[1] speed = self.calculate_speed(bbox1, bbox2, frame1, frame2) speeds[id] = speed return speeds def calculate_speed(self, bbox1, bbox2, frame1, frame2): distance = np.sqrt((bbox2[0] - bbox1[0])**2 + (bbox2[1] - bbox1[1])**2) time = frame2 - frame1 speed = distance / time return speed
2. utils/comUtil.py
通用工具函数,例如日志记录等。
import loggingdef setup_logger(name, log_file, level=logging.INFO): \"\"\"Setup a logger.\"\"\" formatter = logging.Formatter(\'%(asctime)s %(levelname)s %(message)s\') handler = logging.FileHandler(log_file) handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(level) logger.addHandler(handler) return logger
3. utils/dataBaseService.py
数据库操作类,用于存储车辆速度信息。
from sqlalchemy import create_engine, Column, Integer, Float, Stringfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerBase = declarative_base()class VehicleSpeed(Base): __tablename__ = \'vehicle_speed\' id = Column(Integer, primary_key=True) vehicle_id = Column(String) speed = Column(Float)engine = create_engine(\'sqlite:///vehicles.db\')Base.metadata.create_all(engine)Session = sessionmaker(bind=engine)def log_speed(vehicle_id, speed): session = Session() new_record = VehicleSpeed(vehicle_id=vehicle_id, speed=speed) session.add(new_record) session.commit() session.close()
4. utils/mythread.py
多线程处理,例如语音报警。
import threadingimport pyttsx3class SpeedAlertThread(threading.Thread): def __init__(self, threshold=60): super().__init__() self.threshold = threshold self.engine = pyttsx3.init() def run(self): while True: # 检查超速并报警 pass
5. utils/playMusic.py
播放语音报警。
import pyttsx3def play_alert(text): engine = pyttsx3.init() engine.say(text) engine.runAndWait()
6. window/mainWindow.py
PyQt GUI界面。
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QComboBoxfrom PyQt5.QtGui import QImage, QPixmapfrom PyQt5.QtCore import QTimerimport cv2class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(\"Vehicle Speed Detection System\") self.label = QLabel(self) self.comboBox = QComboBox(self) self.comboBox.addItem(\"video1.mp4\") self.comboBox.addItem(\"video2.mp4\") self.button = QPushButton(\"Start\", self) layout = QVBoxLayout() layout.addWidget(self.label) layout.addWidget(self.comboBox) layout.addWidget(self.button) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) self.timer = QTimer(self) self.timer.timeout.connect(self.update_frame) self.cap = None self.car_detection = CarDetection() self.button.clicked.connect(self.start_video) def start_video(self): video_path = self.comboBox.currentText() self.cap = cv2.VideoCapture(video_path) self.timer.start(30) def update_frame(self): ret, frame = self.cap.read() if ret: detections, speeds = self.car_detection.detect_and_track(frame) for id, speed in speeds.items(): log_speed(id, speed) if speed > 60: play_alert(f\"Vehicle {id} is speeding at {speed:.2f} km/h\") for det in detections: x1, y1, x2, y2 = det[:4] cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) qimage = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_BGR888) pixmap = QPixmap.fromImage(qimage) self.label.setPixmap(pixmap) else: self.timer.stop() self.cap.release()
7. main.py
主程序入口。
import sysfrom PyQt5.QtWidgets import QApplicationfrom window.mainWindow import MainWindowif __name__ == \'__main__\': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
8. video
目录
存放视频文件,如video1.mp4
, video2.mp4
等。
9. sound
目录
存放语音报警音频文件。
10. car
目录
存放训练数据集和输出结果。
通过以上代码和目录结构,你可以构建一个完整的基于YOLO的车辆速度检测系统。根据实际需求,可以进一步优化和扩展功能。