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

基于PySide6的YOLOv8/11目标检测GUI界面——智能安全帽检测系统

📖 前言

在工业安全领域,智能安全帽检测是保障工人生命安全的重要技术手段。本文将介绍如何利用YOLOv8/YOLOv11目标检测算法PySide6 GUI框架,开发一套功能完整的智能安全帽检测系统。系统支持:

  • 动态切换检测模型(YOLOv8n/v8s/v11等)
  • 实时调整置信度(Confidence)和IOU阈值
  • 支持摄像头、图像、视频三种检测模式
  • 实时统计佩戴/未佩戴安全帽人数
  • 可视化系统日志及报警记录

通过本文,您将掌握PySide6界面设计与YOLO深度学习模型结合的实战技巧,并了解多线程处理、实时数据可视化等关键技术。

🎥 效果展示


检测结果如下图

🔧 实现步骤与核心代码

首先,需要安装PySide6库,可以使用以下命令进行安装:

pip install pyside6

接下来,可以创建一个Python脚本

import sys
import os
import time
import cv2
import numpy as np
from threading import Thread, Lock
from queue import Queue
from PySide6 import QtWidgets, QtCore, QtGui
from PIL import Image
from ultralytics import YOLO# 常量定义
DEFAULT_MODEL_PATH = 'weights/v11/helmet_v11_shuffleNetV2_CCFM_Bifformer.engine'
SETTINGS_FILE = "app_settings.ini"class MWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()self._load_settings()self._setup_ui()self._setup_vars()self._setup_connections()self._apply_styles()self._update_controls_state(False)# 初始化YOLO模型self.model_lock = Lock()self.load_model(self.model_path)# 启动处理线程Thread(target=self.frame_analyze_thread, daemon=True).start()def _load_settings(self):"""加载应用设置"""self.settings = QtCore.QSettings(SETTINGS_FILE, QtCore.QSettings.Format.IniFormat)self.model_path = self.settings.value("model/path", DEFAULT_MODEL_PATH)self.conf_threshold = float(self.settings.value("model/conf", 0.45))self.iou_threshold = float(self.settings.value("model/iou", 0.5))geometry = self.settings.value("window/geometry")if geometry:try:if isinstance(geometry, str):geometry = QtCore.QByteArray.fromHex(geometry.encode())if isinstance(geometry, QtCore.QByteArray):self.restoreGeometry(geometry)except Exception:passdef _save_settings(self):"""保存应用设置"""self.settings.setValue("model/path", self.model_path)self.settings.setValue("model/conf", self.conf_threshold)self.settings.setValue("model/iou", self.iou_threshold)geometry_bytes = self.saveGeometry()self.settings.setValue("window/geometry", geometry_bytes.toHex().data().decode())self.settings.sync()def _setup_ui(self):"""设置用户界面"""self.setWindowTitle('智能安全帽检测系统')self.setWindowIcon(QtGui.QIcon("helmet_icon.png"))central_widget = QtWidgets.QWidget()self.setCentralWidget(central_widget)main_layout = QtWidgets.QVBoxLayout(central_widget)main_layout.setContentsMargins(10, 10, 10, 10)main_layout.setSpacing(10)# 视频显示区域video_container = QtWidgets.QWidget()video_layout = QtWidgets.QHBoxLayout(video_container)video_layout.setContentsMargins(0, 0, 0, 0)video_layout.setSpacing(10)self.video_label_ori = self._create_video_label("实时视频流")self.video_label_proc = self._create_video_label("分析结果")video_layout.addWidget(self.video_label_ori, 1)video_layout.addWidget(self.video_label_proc, 1)# 控制面板control_panel = QtWidgets.QFrame()control_panel.setObjectName("controlPanel")control_panel.setFixedWidth(350)control_layout = QtWidgets.QVBoxLayout(control_panel)control_layout.setContentsMargins(10, 10, 10, 10)control_layout.setSpacing(15)# 模型设置组model_group = QtWidgets.QGroupBox("模型设置")model_layout = QtWidgets.QFormLayout(model_group)model_layout.setSpacing(10)# 模型路径选择self.model_path_label = QtWidgets.QLabel(os.path.basename(self.model_path))self.model_path_label.setToolTip(self.model_path)self.model_path_label.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse |QtCore.Qt.TextInteractionFlag.TextSelectableByKeyboard)self.model_select_btn = QtWidgets.QPushButton("模型")model_layout.addRow(self.model_select_btn, self.model_path_label)# 置信度滑动条self.conf_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)self.conf_slider.setRange(0, 100)self.conf_slider.setValue(int(self.conf_threshold * 100))self.conf_value_label = QtWidgets.QLabel(f"{self.conf_threshold:.2f}")conf_layout = QtWidgets.QHBoxLayout()conf_layout.addWidget(self.conf_slider)conf_layout.addWidget(self.conf_value_label)model_layout.addRow("置信度:", conf_layout)# IOU滑动条self.iou_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)self.iou_slider.setRange(0, 100)self.iou_slider.setValue(int(self.iou_threshold * 100))self.iou_value_label = QtWidgets.QLabel(f"{self.iou_threshold:.2f}")iou_layout = QtWidgets.QHBoxLayout()iou_layout.addWidget(self.iou_slider)iou_layout.addWidget(self.iou_value_label)model_layout.addRow("IOU阈值:", iou_layout)# 统计信息组stats_group = QtWidgets.QGroupBox("实时统计")stats_layout = QtWidgets.QFormLayout(stats_group)stats_layout.setSpacing(10)self.total_count_label = QtWidgets.QLabel("0")self.helmet_count_label = QtWidgets.QLabel("0")self.no_helmet_label = QtWidgets.QLabel("0")stats_layout.addRow("总人数:", self.total_count_label)stats_layout.addRow("佩戴安全帽:", self.helmet_count_label)stats_layout.addRow("未佩戴安全帽:", self.no_helmet_label)# 控制按钮组btn_group = QtWidgets.QGroupBox("设备控制")btn_layout = QtWidgets.QGridLayout(btn_group)btn_layout.setSpacing(10)self.cam_btn = self._create_tool_button("摄像头", "camera-video")self.video_btn = self._create_tool_button("图片/视频", "document-open")self.snapshot_btn = self._create_tool_button("截图", "camera-photo")self.stop_btn = self._create_tool_button("停止", "media-playback-stop")btn_layout.addWidget(self.cam_btn, 0, 0)btn_layout.addWidget(self.video_btn, 0, 1)btn_layout.addWidget(self.snapshot_btn, 1, 0)btn_layout.addWidget(self.stop_btn, 1, 1)# 日志区域log_group = QtWidgets.QGroupBox("系统日志")log_layout = QtWidgets.QVBoxLayout(log_group)self.log_text = QtWidgets.QTextBrowser()self.log_text.setObjectName("logText")self.log_text.setMaximumHeight(250)log_layout.addWidget(self.log_text)control_layout.addWidget(model_group)control_layout.addWidget(stats_group)control_layout.addWidget(btn_group)control_layout.addWidget(log_group)control_layout.addStretch(1)main_layout.addWidget(video_container, 3)main_layout.addWidget(control_panel, 1)self.status_bar_label = QtWidgets.QLabel("就绪")self.statusBar().addPermanentWidget(self.status_bar_label)self.statusBar().setObjectName("statusBar")# 添加标题标签title_label = QtWidgets.QLabel("智能安全帽检测系统")title_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)title_label.setStyleSheet("""QLabel {font-size: 30pt;font-weight: bold;color: #66B2FF;padding: 15px 0;border-bottom: 2px solid #555555;}""")main_layout.addWidget(title_label)# 添加水平容器放置视频和控制面板content_widget = QtWidgets.QWidget()content_layout = QtWidgets.QHBoxLayout(content_widget)content_layout.setContentsMargins(0, 0, 0, 0)content_layout.addWidget(video_container, 3)content_layout.addWidget(control_panel, 1)main_layout.addWidget(content_widget)def _setup_vars(self):"""初始化变量"""self.cap = Noneself.frame_queue = Queue(maxsize=3)self.is_processing = Falseself.fps = 0self.frame_count = 0self.start_time = time.time()self.stats = {'total': 0, 'helmet': 0, 'no_helmet': 0}self.last_processed_frame = Noneself.model = Noneself._model_ready = False  # 添加这一行# 定时器self.timer = QtCore.QTimer()self.timer.setInterval(30)  # 约33fpsself.current_image = None  # 新增:保存当前打开的原始图片self.is_image_mode = False  # 新增:标记当前是否为图片模式def _setup_connections(self):"""连接信号与槽"""self.cam_btn.clicked.connect(self.start_camera)self.video_btn.clicked.connect(self.open_image_or_video_file)self.snapshot_btn.clicked.connect(self.take_snapshot)self.stop_btn.clicked.connect(self.stop)self.timer.timeout.connect(self.update_frame)self.model_select_btn.clicked.connect(self._select_model)self.conf_slider.valueChanged.connect(self.update_conf_threshold)self.iou_slider.valueChanged.connect(self.update_iou_threshold)def _create_video_label(self, placeholder_text):"""创建视频显示标签"""label = QtWidgets.QLabel(placeholder_text)label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)label.setMinimumSize(480, 360)label.setObjectName("videoLabel")label.setProperty("placeholderText", placeholder_text)return labeldef _create_tool_button(self, text, icon_name):"""创建工具按钮"""btn = QtWidgets.QPushButton(text)icon = QtGui.QIcon.fromTheme(icon_name, QtGui.QIcon())if not icon.isNull():btn.setIcon(icon)btn.setIconSize(QtCore.QSize(20, 20))btn.setObjectName("toolButton")return btndef _apply_styles(self):"""应用样式表"""style_sheet = """QMainWindow { background-color: #2D2D2D; }QWidget#controlPanel { background-color: #3C3C3C; border-radius: 8px; }QGroupBox { color: #E0E0E0; font-weight: bold; border: 1px solid #555555; border-radius: 6px; margin-top: 10px; padding: 15px 5px 5px 5px; }QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; left: 10px; padding: 0 5px; color: #66B2FF; }QLabel { color: #D0D0D0; padding: 2px; }QLabel#videoLabel { background-color: #1A1A1A; border: 1px solid #444444; border-radius: 8px; color: #777777; font-size: 16pt; font-weight: bold; }QPushButton#toolButton { background-color: #555555; color: white; border: none; padding: 10px; border-radius: 5px; min-height: 30px; text-align: center; }QPushButton#toolButton:hover { background-color: #6A6A6A; }QPushButton#toolButton:pressed { background-color: #4A4A4A; }QPushButton#toolButton:disabled { background-color: #404040; color: #888888; }QPushButton { background-color: #007ACC; color: white; border: none; padding: 8px 15px; border-radius: 4px; }QPushButton:hover { background-color: #0090F0; }QPushButton:pressed { background-color: #0060A0; }QTextBrowser#logText { background-color: #252525; color: #C0C0C0; border: 1px solid #444444; border-radius: 4px; font-family: Consolas, Courier New, monospace; }QStatusBar { background-color: #252525; color: #AAAAAA; }QStatusBar::item { border: none; }QToolTip { background-color: #FFFFE1; color: black; border: 1px solid #AAAAAA; padding: 4px; border-radius: 3px; }"""self.setStyleSheet(style_sheet)def load_model(self, model_path):"""加载YOLO模型"""try:with self.model_lock:self.model = YOLO(model_path)self.log(f"模型加载成功: {os.path.basename(model_path)}", "success")self._model_ready = Trueself._update_controls_state(False)except Exception as e:self.log(f"模型加载失败: {str(e)}", "error")self._model_ready = Falseself._update_controls_state(False, force_disable_sources=True)def start_camera(self):"""启动摄像头"""if not self.cap:self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)if self.cap.isOpened():self.timer.start()self.is_processing = Trueself.log("摄像头已启动")self._update_controls_state(True)self.start_time = time.time()self.frame_count = 0else:self.log("无法打开摄像头", "error")def open_image_or_video_file(self):"""打开图片或视频文件"""path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片或视频文件", "","视频文件 (*.mp4 *.avi *.mov *.mkv);;图片文件 (*.jpg *.jpeg *.png *.bmp);;所有文件 (*.*)")if path:file_extension = os.path.splitext(path)[1].lower()if file_extension in ['.mp4', '.avi', '.mov', '.mkv']:  # 视频文件self.cap = cv2.VideoCapture(path)if self.cap.isOpened():self.timer.start()self.is_processing = Trueself.log(f"已打开视频文件: {path}")self._update_controls_state(True)self.start_time = time.time()self.frame_count = 0else:self.log("无法打开视频文件", "error")elif file_extension in ['.jpg', '.jpeg', '.png', '.bmp']:  # 图片文件image = cv2.imread(path)if image is not None:self._process_image(image)self.log(f"已加载图片文件: {path}")else:self.log("无法打开图片文件", "error")else:self.log("不支持的文件格式", "warning")def update_frame(self):"""更新视频帧"""ret, frame = self.cap.read()if not ret:self.stop()return# 计算FPSself.frame_count += 1if self.frame_count % 10 == 0:self.fps = 10 / (time.time() - self.start_time)self.start_time = time.time()h, w = frame.shape[:2]self.status_bar_label.setText(f"运行中 | FPS: {self.fps:.1f} | 分辨率: {w}x{h}")# 显示原始帧self._display_frame(frame, self.video_label_ori, "Original")# 添加到处理队列if self.frame_queue.qsize() < 3:self.frame_queue.put(frame.copy())def _display_frame(self, frame, label, label_name="Unknown"):"""显示帧到标签"""try:if frame.ndim == 3 and frame.shape[2] == 3:rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)q_image_format = QtGui.QImage.Format.Format_RGB888bytes_per_line = 3 * frame.shape[1]elif frame.ndim == 2:rgb_frame = frameq_image_format = QtGui.QImage.Format.Format_Grayscale8bytes_per_line = frame.shape[1]else:returnh, w = rgb_frame.shape[:2]if not rgb_frame.flags['C_CONTIGUOUS']:rgb_frame = np.ascontiguousarray(rgb_frame)qimg = QtGui.QImage(rgb_frame.data, w, h, bytes_per_line, q_image_format)label.setProperty("image_ref", qimg)pixmap = QtGui.QPixmap.fromImage(qimg)label_size = label.size()if label_size.width() > 0 and label_size.height() > 0:scaled_pixmap = pixmap.scaled(label_size, QtCore.Qt.AspectRatioMode.KeepAspectRatio,QtCore.Qt.TransformationMode.SmoothTransformation)label.setPixmap(scaled_pixmap)else:label.setPixmap(pixmap)except Exception as e:label.setText(f"显示错误 ({label_name})")def frame_analyze_thread(self):"""帧分析线程"""while True:if not self.frame_queue.empty():frame = self.frame_queue.get()# 如果是图片,直接处理if self.is_image_mode:# 使用模型推理(带当前参数)with self.model_lock:results = self.model.predict(frame,conf=self.conf_threshold,iou=self.iou_threshold,verbose=False)[0]# 绘制结果proc_frame = results.plot(line_width=2, labels=True)self.last_processed_frame = proc_frame# 更新统计信息self.update_stats(results)# 显示处理结果self._display_frame(proc_frame, self.video_label_proc, "Processed")# 跳过视频处理逻辑continue# 使用模型推理(带参数)with self.model_lock:results = self.model.predict(frame,conf=self.conf_threshold,iou=self.iou_threshold,verbose=False)[0]# 更新统计信息self.update_stats(results)# 绘制结果proc_frame = results.plot(line_width=2, labels=True)self.last_processed_frame = proc_frameself._display_frame(proc_frame, self.video_label_proc, "Processed")# 限制处理频率time.sleep(0.01)def _process_image(self, image):"""处理图片并显示结果"""self.is_image_mode = True  # 标记为图片模式self.current_image = image.copy()  # 保存原始图片副本self.is_processing = Trueself._update_controls_state(True)# 使用模型推理(带参数)with self.model_lock:results = self.model.predict(image,conf=self.conf_threshold,iou=self.iou_threshold,verbose=False)[0]# 更新统计信息self.update_stats(results)# 绘制结果proc_image = results.plot(line_width=2, labels=True)self._display_frame(image, self.video_label_ori, "Original")self.last_processed_frame = proc_imageself._display_frame(proc_image, self.video_label_proc, "Processed")def _select_model(self):"""选择模型文件"""if self.is_processing:QtWidgets.QMessageBox.warning(self, "警告", "请先停止当前处理,再选择新模型。")returnfilter_str = "YOLO 模型 (*.pt *.engine *.onnx);;所有文件 (*.*)"start_dir = os.path.dirname(self.model_path) if os.path.dirname(self.model_path) else ""path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "选择模型文件", start_dir, filter_str)if path and path != self.model_path:self.model_path = pathself.model_path_label.setText(os.path.basename(path))self.model_path_label.setToolTip(path)self.log(f"选择新模型: {path}", "info")self.load_model(path)self._save_settings()  # 保存新模型路径def update_stats(self, results):"""更新统计信息"""helmet_count = 0no_helmet_count = 0for box in results.boxes:cls = int(box.cls)if cls == 1:helmet_count += 1elif cls == 0:no_helmet_count += 1self.stats = {'total': helmet_count + no_helmet_count,'helmet': helmet_count,'no_helmet': no_helmet_count}# 更新界面self.total_count_label.setText(str(self.stats['total']))self.helmet_count_label.setText(str(self.stats['helmet']))self.no_helmet_label.setText(str(self.stats['no_helmet']))def update_conf_threshold(self, value):"""更新置信度阈值"""self.conf_threshold = value / 100.0self.conf_value_label.setText(f"{self.conf_threshold:.2f}")self.log(f"置信度阈值更新为: {self.conf_threshold:.2f}")self._trigger_async_reprocess()  # 新增:触发异步处理def update_iou_threshold(self, value):"""更新IOU阈值"""self.iou_threshold = value / 100.0self.iou_value_label.setText(f"{self.iou_threshold:.2f}")self.log(f"IOU阈值更新为: {self.iou_threshold:.2f}")self._trigger_async_reprocess()  # 新增:触发异步处理def _trigger_async_reprocess(self):"""触发异步重新处理(线程安全)"""if self.is_image_mode and self.current_image is not None:# 清空队列确保只处理最新图片with self.frame_queue.mutex:self.frame_queue.queue.clear()# 将原始图片放入处理队列self.frame_queue.put(self.current_image.copy())def take_snapshot(self):"""截图"""if self.last_processed_frame is not None:timestamp = time.strftime("%Y%m%d_%H%M%S")suggested_filename = f"snapshot_{timestamp}.png"path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "保存截图", suggested_filename, "PNG图像 (*.png);;JPEG图像 (*.jpg *.jpeg)")if path:try:save_frame = cv2.cvtColor(self.last_processed_frame, cv2.COLOR_RGB2BGR)success = Image.fromarray(save_frame)success.save(path)if success:self.log(f"截图已保存: {path}", "success")else:self.log(f"截图保存失败: {path}", "error")except Exception as e:self.log(f"保存截图时出错: {str(e)}", "error")def log(self, message, level="info"):"""记录日志"""color_map = {"info": "#A0A0FF","success": "#77FF77","warning": "#FFFF77","error": "#FF7777"}color = color_map.get(level, "#E0E0E0")timestamp = time.strftime('%H:%M:%S')formatted_message = f'<span style="color: #888;">[{timestamp}]</span> <span style="color:{color};">{message}</span>'self.log_text.append(formatted_message)self.log_text.moveCursor(QtGui.QTextCursor.MoveOperation.End)def _update_controls_state(self, is_running, force_disable_sources=False):"""更新控件状态"""disable_start_buttons = is_running or not self._model_ready or force_disable_sourcesself.cam_btn.setDisabled(disable_start_buttons)self.video_btn.setDisabled(disable_start_buttons)self.model_select_btn.setDisabled(is_running)self.stop_btn.setEnabled(is_running)self.snapshot_btn.setEnabled(is_running and self._model_ready)def stop(self):"""停止处理"""self.is_image_mode = False  # 新增:重置图片模式标记self.current_image = None  # 新增:清空缓存图片self.timer.stop()self.is_processing = Falseif self.cap:self.cap.release()self.cap = Noneself.frame_queue.queue.clear()self.video_label_ori.setText(self.video_label_ori.property("placeholderText"))self.video_label_proc.setText(self.video_label_proc.property("placeholderText"))self.last_processed_frame = Noneself._update_controls_state(False)self.status_bar_label.setText("已停止")self.log("系统已停止")def _select_model(self):"""选择模型文件"""if self.is_processing:QtWidgets.QMessageBox.warning(self, "警告", "请先停止当前处理,再选择新模型。")returnfilter_str = "YOLO 模型 (*.pt *.engine *.onnx);;所有文件 (*.*)"start_dir = os.path.dirname(self.model_path) if os.path.dirname(self.model_path) else ""path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "选择模型文件", start_dir, filter_str)if path and path != self.model_path:self.model_path = pathself.model_path_label.setText(os.path.basename(path))self.model_path_label.setToolTip(path)self.log(f"选择新模型: {path}", "info")self.load_model(path)def closeEvent(self, event):"""关闭事件处理"""self.stop()self._save_settings()event.accept()if __name__ == "__main__":if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):QtWidgets.QApplication.setAttribute(QtCore.Qt.ApplicationAttribute.AA_EnableHighDpiScaling, True)if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):QtWidgets.QApplication.setAttribute(QtCore.Qt.ApplicationAttribute.AA_UseHighDpiPixmaps, True)app = QtWidgets.QApplication(sys.argv)# 创建占位图标(如果不存在)if not os.path.exists("helmet_icon.png"):img = QtGui.QImage(64, 64, QtGui.QImage.Format.Format_ARGB32)img.fill(QtGui.QColor("blue"))painter = QtGui.QPainter(img)painter.setPen(QtGui.QColor("white"))painter.setFont(QtGui.QFont("Arial", 20))painter.drawText(img.rect(), QtCore.Qt.AlignmentFlag.AlignCenter, "H")painter.end()img.save("helmet_icon.png")# 创建模型目录(如果不存在)weights_dir = os.path.dirname(DEFAULT_MODEL_PATH)if weights_dir and not os.path.exists(weights_dir):os.makedirs(weights_dir)window = MWindow()window.show()sys.exit(app.exec())

相关文章:

基于PySide6的YOLOv8/11目标检测GUI界面——智能安全帽检测系统

&#x1f4d6; 前言 在工业安全领域&#xff0c;智能安全帽检测是保障工人生命安全的重要技术手段。本文将介绍如何利用YOLOv8/YOLOv11目标检测算法与PySide6 GUI框架&#xff0c;开发一套功能完整的智能安全帽检测系统。系统支持&#xff1a; 动态切换检测模型&#xff08;Y…...

AF3 generate_chain_data_cache脚本解读

AlphaFold3 generate_chain_data_cache 脚本在源代码的scripts文件夹下。该脚本从指定目录中批量解析 mmCIF/PDB 文件的工具,并将每个链的基本信息(序列、分辨率、是否属于聚类等)提取并写入 JSON 文件,主要用于后续蛋白质建模、过滤或训练数据准备。 源代码: import ar…...

C/C++不透明指针

今天在ESP32编程中又看到了这个词&#xff0c;这个词出现在cursor回答中。回答如下&#xff1a; struct esp_netif_obj; typedef struct esp_netif_obj esp_netif_t;esp_netif_obj的具体实现细节被隐藏了用户代码只能通过esp_netif_t类型指针来操作网络接口这种封装方式被称为…...

电力实习中需要注意哪些安全用电问题

电力实习中需要注意哪些安全用电问题 在电工实习中&#xff0c;由于涉及到电力设备和电气设施&#xff0c;安全问题尤为重要。 以下是电工实习中需要注意的安全问题&#xff1a; 一、电气设备及线路安全 使用电气设备前&#xff0c;应确保设备具有良好的电气绝缘&#xff0c…...

【版本控制】git命令使用大全

大家好&#xff0c;我是jstart千语。今天来总结一下git的使用命令&#xff0c;上文会先将git命令都列出来&#xff0c;便于快速寻找&#xff0c;然后还会对部分常用命令图文讲解&#xff0c;适合新手&#xff0c;让你快速地理解。最后还会总结在idea中使用git。如果有缺失的&am…...

Day09【基于Tripletloss实现的简单意图识别对话系统】

基于Tripletloss实现的表示型文本匹配 目标数据准备参数配置数据处理Triplet Loss目标Triplet Loss计算公式公式说明 模型构建网络结构设计网络训练目标损失函数设计 主程序推理预测类初始化加载问答知识库文本向量化知识库查询主程序main测试测试效果 参考博客 目标 在此之前…...

什么是HIGG验厂,HIGG验厂有什么要求?HIGG验厂有什么作用

什么是Higg验厂&#xff1f; Higg验厂&#xff08;Higg Facility Environmental Module, FEM & Higg Facility Social & Labor Module, FSLM&#xff09;是由可持续服装联盟&#xff08;SAC, Sustainable Apparel Coalition&#xff09;开发的一套评估工具&#xff0c…...

SmolVLM新模型技术解读笔记

原文地址&#xff1a;https://huggingface.co/blog/zh/smolervlm 一、核心发布概要 新成员亮相&#xff1a;推出256M&#xff08;2.56亿参数&#xff09;与500M&#xff08;5亿参数&#xff09;视觉语言模型关键定位&#xff1a;目前全球最小VLM&#xff08;256M&#xff09;…...

解决USG5150防火墙web无法连接问题

参考 防火墙usg5500&#xff08;V300R001C00SPC700&#xff09;WEB界面无法登陆 现象 Web防火墙突然无法web登录&#xff0c;Ping通&#xff0c;但是Tcpping端口不通。无论是从外网、还是内网都一样。 Probing 192.168.100.1:1234/tcp - No response - time2047.528ms Prob…...

Resilience4j与Spring Cloud Gateway整合指南:构建弹性的API网关

什么是Resilience4j&#xff1f; Resilience4j是一个轻量级的容错库&#xff0c;专为Java 8和函数式编程设计。它借鉴了Netflix Hystrix的设计理念&#xff0c;但更加轻量且专注于Java 8的函数式编程风格。Resilience4j提供了多种容错机制&#xff0c;帮助开发者构建弹性强健的…...

Quipus,LightRag的Go版本的实现

1 项目简介 奇谱系统当前版本以知识库为核心&#xff0c;基于知识库可以快构建自己的问答系统。知识库的Rag模块的构建算法是参考了LightRag的算法流程的Go版本优化实现&#xff0c;它可以帮助你快速、准确地构建自己的知识库&#xff0c;搭建属于自己的AI智能助手。与当前LLM…...

怎样完成本地模型知识库检索问答RAG

怎样完成本地模型知识库检索问答RAG 目录 怎样完成本地模型知识库检索问答RAG使用密集检索器和系数检索器混合方式完成知识库相似检索1. 导入必要的库2. 加载文档3. 文本分割4. 初始化嵌入模型5. 创建向量数据库6. 初始化大语言模型7. 构建问答链8. 提出问题并检索相关文档9. 合…...

研发效率破局之道阅读总结(2)流程优化

研发效率破局之道阅读总结(2)流程优化 Author: Once Day Date: 2025年4月15日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

解决PIP 安装出错ERROR: cp310-cp310-manylinux_2_28_x86_64.whl is not a supported wheel

ERROR: torch-2.8.0.dev20250325cu128-cp310-cp310-manylinux_2_28_x86_64.whl is not a supported wheel on this platform. 可以 pip debug --verbose | grep manylinux | grep cp310 WARNING: This command is only meant for debugging. Do not use this with automation f…...

b站golang后端开发一面

go和其他语言的对比 Golang&#xff08;也称为Go语言&#xff09;是一种静态类型、编译型语言&#xff0c;由Google开发&#xff0c;以其简洁、高效和强大的并发处理能力著称。 Golang的设计哲学强调简洁明了。与Python类似&#xff0c;Go语法简洁&#xff0c;易于学习和编写。…...

Vue3 SSR Serverless架构革命:弹性计算与量子加速

一、全维度Serverless SSR架构 1.1 蜂巢式弹性调度系统 1.2 冷启动时间优化表 优化策略Node.js冷启(ms)Deno冷启(ms)Bun冷启(ms)裸启动1800960420预编译二进制650380210内存快照预热22016090WASM实例池15011075量子状态预载453832 二、边缘渲染协议升级 2.1 流式SSR响应协议…...

深度大脑:AI大模型的设计与运行原理

AI大模型的设计与运行原理涉及多个复杂环节&#xff0c;以下是系统化的总结&#xff0c;结合核心要点与补充细节&#xff1a; 一、AI大模型的设计 1. 深度神经网络架构 Transformer&#xff1a;取代RNN/CNN&#xff0c;解决长程依赖问题。核心组件&#xff1a; 自注意力机制…...

Python网络编程从入门到精通:Socket核心技术+TCP/UDP实战详解

引言 网络编程是构建现代分布式系统的核心能力&#xff0c;而Socket作为通信的基石&#xff0c;其重要性不言而喻。本文将从零开始&#xff0c;通过清晰的代码示例、原理剖析和对比分析&#xff0c;带你彻底掌握Python中的Socket编程技术&#xff0c;涵盖TCP可靠连接、UDP高效…...

使用CMake生成Opencv对应库文件

opencv环境配置&#xff1a;版本3.4/3.2(OpenCV-3.4.3) CMake&#xff1a;3.12.1 D:\OpenCv\opencv\build\x64\vc16\bin路径添加至环境变量中 CMake环境配置&#xff1a; D:\Install_QT\bin路径添加至环境变量中&#xff08;path中即可&#xff09; QT5环境变量配置&#xff1a…...

MySQL 数据库备份和恢复全指南

MySQL 是一款常用的开源数据库系统&#xff0c;在日常运维中&#xff0c;数据备份和恢复是系统管理的重要一环。本文将细致介绍 MySQL 两大备份方案—— mysqldump 和 XtraBackup&#xff0c;包括备份方式、恢复步骤、定时脚本、远程备份和常见问题处理方案。 一、mysqldump 备…...

关于我的服务器

最近我买了台腾讯云服务器&#xff0c;然后新手小白只会用宝塔。。。 安装完之后默认的端口是8888&#xff0c;打开面板就会提示我有风险。然后 我改了端口之后&#xff0c;怎么都打不开。 于是 学到了几句命令可以使用&#xff1a; //查看端口是否已经修改成功 cat www/se…...

spring面试题

1&#xff0c;如何理解spring boot中的starter Starter是一种简化依赖管理和自动配置的核心机制&#xff0c;能快速集成特定功能模块&#xff0c;无需手动配置复杂依赖和xml文件。 依赖简化&#xff1a;将某个功能模块所需的所有依赖打包成一个“一站式”依赖&#xff0c;开发…...

python setup.py学习

Python-setup进阶打包命令 Python-setup进阶打包命令_python setup-CSDN博客 packages 需要处理的包目录&#xff08;包含__init__.py的文件夹&#xff09;&#xff0c;这里通常使用 find_packages()&#xff0c;它默认在和setup.py同一目录下搜索各个含有 __init__.py的包。…...

最简单的使用SDL2 播放原始音频数据程序

author: hjjdebug date: 2025年 04月 15日 星期二 14:02:05 CST description: 最简单的使用SDL2 播放原始音频数据程序 文章目录 1.最简单的播放音频的程序是什么样子的?2. 怎样用SDL 来编写音频播放器代码?2.1 SDL播放音频核心代码:混音函数2.2 先看看音频播放的可能的两种框…...

利用IDEA开发Spark-SQL

创建子模块Spark-SQL&#xff0c;并添加依赖 创建Spark-SQL的测试代码&#xff1a; 运行结果&#xff1a; 自定义函数&#xff1a; UDF&#xff1a; UDAF&#xff08;自定义聚合函数&#xff09; 强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数&#xff0c; …...

随身Wi-Fi能跑PCDN?

随身WiFi可以用于运行PCDN&#xff08;点对点内容分发网络&#xff09;&#xff0c;但存在技术限制和潜在风险&#xff0c;需谨慎操作。 可行性分析 技术基础 随身WiFi本质是便携式无线路由器&#xff0c;具备网络接入和分发能力&#xff0c;理论上可配置为PCDN节点。 部分用户…...

Google-A2A协议全面解析:一文掌握Agent-to-Agent协议的核心与应用

前言&#xff1a; 在当今人工智能技术飞速发展的时代&#xff0c;智能体&#xff08;Agent&#xff09;已悄然融入我们生活的各个角落。无论是个人智能助手&#xff0c;还是企业的自动化工具&#xff0c;各类AI代理的应用愈发广泛。但目前这些智能体之间大多处于孤立状态&…...

jmeter压测工具出现乱码

然后 prev.setDataEncoding(“utf-8”)...

大模型训练显存压缩实战:ZeRO-3 vs 梯度累积 vs 量化混合策略

一、显存瓶颈的本质与挑战 大模型训练面临的核心矛盾是模型参数量指数级增长与GPU显存容量线性提升之间的鸿沟。以175B参数模型为例&#xff0c;其显存消耗主要来自三个方面&#xff1a; 参数存储‌&#xff1a;FP32精度下需700GB显存‌梯度缓存‌&#xff1a;反向传播产生的…...

WPS JS宏编程教程(从基础到进阶)-- 第七部分:JS对象在WPS中的应用

目录 第7章 JS对象在WPS中的应用7-1 对象创建的几种方法从零理解对象&#xff1a;数据收纳盒两种基础创建方式代码解析表 7-2 对象属性的查、改、增、删像操作Excel单元格一样管理属性1. 点操作符&#xff08;静态键名&#xff09;2. 中括号操作符&#xff08;动态键名&#xf…...

网络编程(UDP)

server:服务器 # import socket # # 传递udp协议参数 # sk socket.socket(typesocket.SOCK_DGRAM) # # # 绑定ip及端口 # sk.bind(("127.0.0.1",8080)) # # print("等待客户端发送消息") # # # 直接发送 # msg,addr sk.recvfrom(1024) # # print(msg.d…...

深入讲解 CSS 选择器权重及实战

1. 权重计算规则详解 CSS 选择器的优先级由 三元组 (x, y, z) 决定&#xff0c;比较规则如下&#xff1a; 选择器类型权重值 (x, y, z)示例ID 选择器x 1#header → (1,0,0)类/伪类/属性y 1.active, :hover元素/伪元素z 1div, ::before 比较规则&#xff1a;从左到右逐级比…...

Mysql的查询

1.Mysql的基本查询 语法&#xff1a;select*from 表名;代表查询所有数据的所有列 SELECT * FROM classinfo; SELECT * FROM studentinfo; select 字段1&#xff0c;字段2.....from 表名;查询数据的指定字段 查询studentinfo表的学生姓名和年龄 SELECT stuname,age FROM stu…...

RaabitMQ 快速入门

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…...

LLM: 探索LLM视觉缺陷

文章目录 前言一、Constructing MMVP Benchmarks1、CLIP-blind pair 二、MMVP-VLM bench1、Model size influence2、correlation between CLIP MLLMs 三、Mixture of Features1、Additive MoF Experiment2、Interleaved MoF Experiment 总结 前言 在使用多模态大模型时候是否会…...

常用的 ​​SQL 语句分类整理​​

以下是常用的 ​​SQL 语句分类整理​​&#xff0c;覆盖数据查询、操作、表管理和高级功能&#xff0c;适用于大多数关系型数据库&#xff08;如 MySQL、PostgreSQL、SQL Server&#xff09;&#xff1a; 目录 ​​一、数据查询&#xff08;DQL&#xff09;​​ ​​1. 基础查…...

Go之defer关键字:优雅的资源管理与执行控制

在Go语言中&#xff0c;defer关键字是处理资源释放、错误恢复和代码逻辑清理的利器。它看似简单&#xff0c;却隐藏着许多设计哲学和底层机制。本文将深入剖析defer的执行原理、使用场景和常见陷阱&#xff0c;助你掌握这一关键特性。 一、defer基础&#xff1a;延迟执行的本质…...

T1结构像+RS-fMRI影像处理完整过程记录(数据下载+Matlab工具箱+数据处理)

最近需要仿真研究T1结构像RS-fMRI影像融合处理输出目标坐标的可行性。就此机会记录下来。 为了完成处理&#xff0c;首先需要有数据&#xff0c;然后需要准备对应的处理平台和工具箱。那么正文开始~ &#xff08;1&#xff09;下载满足要求的开源数据 去OpenNEURO https://open…...

Flowable进阶-网关、事件和服务

网关 并行网关 并行网关允许将流程拆分为多个分支&#xff0c;也可以将多个分支汇集到一起。并行网关的功能是基于流入流出的顺序流。fork分支&#xff1a;用于任务的开始。并行后所有外出的顺序流&#xff0c;为每个顺序流都创建一个并发分支。 join汇聚&#xff1a;用于任务…...

【三维重建与生成】GenFusion:SVD统一重建和生成

标题:《GenFusion: Closing the Loop between Reconstruction and Generation via Videos》 来源&#xff1a;西湖大学&#xff1b;慕尼黑工业大学&#xff1b;上海科技大学&#xff1b;香港大学&#xff1b;图宾根大学 项目主页&#xff1a;https://genfusion.sibowu.com 文章…...

常见的爬虫算法

1.base64加密 base64是什么 Base64编码&#xff0c;是由64个字符组成编码集&#xff1a;26个大写字母AZ&#xff0c;26个小写字母az&#xff0c;10个数字0~9&#xff0c;符号“”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节&#xff0c;然后…...

有序二叉树各种操作实现(数据结构C语言多文件编写)

1.先创建tree.h声明文件( Linux 命令&#xff1a;touch tree.h)。编写函数声明如下(打开文件 Linux 操作命令&#xff1a;vim tree.h): //树的头文件位置 #ifndef __TREE_H__ #define __TREE_H__ //节点 typedef struct node{int data;//数据struct node* left;//记录左侧子节…...

Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置

作者&#xff1a;濯光、翼严 Kubernetes 配置管理的局限 目前&#xff0c;在 Kubernetes 集群中&#xff0c;配置管理主要通过 ConfigMap 和 Secret 来实现。这两种资源允许用户将配置信息通过环境变量或者文件等方式&#xff0c;注入到 Pod 中。尽管 Kubernetes 提供了这些强…...

特殊文件以及日志——特殊文件

一、特殊文件 必要性&#xff1a;可以用于存储多个用户的&#xff1a;用户名、密码。这些有关系的数据都可以用特殊文件来存储&#xff0c;然后作为信息进行传输。 1. 属性文件.properties&#xff08;键值对&#xff09; &#xff08;1&#xff09;特点&#xff1a; 都只能…...

Spark-SQL核心编程语言

利用IDEA开发spark-SQL 创建spark-SQL测试代码 自定义函数UDF 自定义聚合函数UDAF 强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数&#xff0c; 如 count()&#xff0c; countDistinct()&#xff0c;avg()&#xff0c;max()&#xff0c;min()。除此之外&…...

jdk 安装

oracle官网 : Java Archive | Oracle 中国 export JAVA_HOME/Users/xxxxx/app/services/x86jdk/jdk1.8.0_431.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH 华为镜像网站&#xff1a;Index of java-local/jdk...

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间&#xff1a;4h学习内容&#xff1a; 今天先把昨天学的内容的课后习题做了&#xff0c;整整75道啊&#xff0c;然后学了OS第二章关于CPU调度部分的内容&#xff0c;这第二章太重要了&#xff0c;以至于每一小节的内容都比较多&am…...

双重路由引入的环路,选路次优的产生以及解决方法

描述 在R2,R3上双向引入ospf,以及rip,R5修改静态的优先级为180,在ospf中引入该静态路由 路由分析 选路次优问题 R5引入了静态路由,优先级是150 R2->R5->100.1.1.0,优先级是150 R3->R4->100.1.1.0,优先级是150 R3->R4->R5->100.1.1.0,优先级是150 R2-…...

环境变量概念以及获取环境变量(linux下解析)

目录 1 基本概念 2 常见的环境变量 3 查看环境变量方法 4 和环境变量相关的命令 5 环境变量的组织方式 6 通过代码如何获取环境变量 6.1 命令行参数 6.2 环境变量 7 通过系统调用获取或设置环境变量 1 基本概念 环境变量(environmentvariables)⼀般是指在操作系统中用来指…...

删除win11电脑上的阿尔巴尼亚输入法SQI

删除电脑自带的阿尔巴尼亚输入法 这个输入法在系统中并不显示&#xff0c;但是有时候会出现在右下角显示&#xff0c;删除这个输入法的流程如下&#xff0c;暂时没发现反复&#xff01; 第一步&#xff1a;打开注册表&#xff1a; winR打开运行&#xff0c;输入 regedit 第二…...