python3GUI--基于YOLO的火焰与烟雾检测系统By:PyQt5(详细图文介绍)

文章目录

  • 一.前言
    • 1.引言
    • 2.正文
  • 二.核心内容
    • 1.数据集
    • 2.模型训练
    • 3.界面窗口
      • 1.登录注册界面
      • 2.核心功能界面
      • 3.检测告警提示窗口
  • 三..核心界面模块介绍
    • 1.顶部信息区域
    • 2.数据输入
    • 3.参数配置
    • 4.告警设置
    • 5.操作台
    • 6.关于
    • 7.指标变化
    • 8.异常速览
    • 9.日志输出
    • 10.检测结果
    • 11.核心内容显示区域
  • 四.问题回答
    • 1.项目结构是怎样的,好上手么?
    • 2.项目依赖
    • 3.我想更改背景图或文字
      • 1.改文字
      • 2.改图片
  • 五.总结


一.前言

1.引言

火灾作为威胁人类生命和财产安全的主要灾害之一,早期识别对减少损害至关重要。传统的烟雾探测器作用范围有限,而基于计算机视觉的火焰与烟雾识别系统能够覆盖更广泛区域,实现及时预警。本项目的开发具有多方面重要价值:它可应用于商场、学校、地铁站等公共场所,实现全天候监测,快速发现火情隐患,争取人员疏散的宝贵时间;在石油化工、电力及制造等高风险行业,能够实时监控异常火焰和烟雾,防止严重事故发生;结合无人机及监控设备,可用于大范围森林火灾防控,解决传统人工巡逻效率低及覆盖面窄的问题;系统还能集成到智能家居平台,提升家庭火灾报警能力,尤其适合无人居住的场景;此外,本项目验证了YOLOv8算法在火焰烟雾检测中的适用性,为相关领域研究提供了宝贵的实践经验和技术支持;从经济角度来看,该视觉检测方案相较传统火灾报警系统安装维护成本更低,覆盖范围更广,显著降低安全保障投入;社会层面上,它通过技术手段有效降低火灾发生频率及损失,有助于营造更加安全的社会环境,保障人民生命与财产安全。

2.正文

朋友们好!本次给大家介绍我开发的“基于YOLO的火焰与烟雾检测系统”,本系统通过自行训练YOLO目标检测模型,使用PyQt5制作交互界面,设置了多种告警方式以及数据可视化方案,用户能够设置详细的目标检测参数配置,系统支持多种输入数据源,主打美观实用!接下来我以详细图文的方式和大家介绍我开发的系统~
在这里插入图片描述

二.核心内容

1.数据集

我们的数据集包括了包含烟雾和火焰的图像共909张,其中训练集为673张,验证集为236张,每张图都进行了详细的标注,标注的目标为烟雾(0)和火焰(1)下面截图为训练集图像示例,数据集已经打包!
在这里插入图片描述
我们按照训练集:测试集8:2的比例对全集进行划分,最后产出两个目录
在这里插入图片描述
数据集当然不是手动划分的,因为太机械了,我们可以先把标注好的图像放到一起,把标注好的txt(YOLO格式)文件也放到一起,最后使用脚本设置好相关数量,就能实现自动划分啦!

import os
import shutil
import random# 输入路径
labels_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\labels'           # 输入YOLO标签文件目录
images_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\JPEGImages'           # 对应图像文件目录
output_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\output_dataset2'   # 输出目录# 分配数量
train_count = 400
val_count = 100# 创建输出目录结构
for split in ['train', 'val']:os.makedirs(os.path.join(output_dir, split, 'images'), exist_ok=True)os.makedirs(os.path.join(output_dir, split, 'labels'), exist_ok=True)# 获取所有标注文件(假设图像和标签同名)
label_files = [f for f in os.listdir(labels_dir) if f.endswith('.txt')]
random.shuffle(label_files)# 检查数量是否足够
total_needed = train_count + val_count
if len(label_files) < total_needed:raise ValueError(f"标签文件不足,共有 {len(label_files)} 个,要求至少 {total_needed} 个。")# 分配训练和验证
train_files = label_files[:train_count]
val_files = label_files[train_count:train_count + val_count]def copy_samples(file_list, split_name):for label_file in file_list:base_name = os.path.splitext(label_file)[0]image_file = None# 尝试匹配图像扩展名for ext in ['.jpg', '.png', '.jpeg']:possible_image = os.path.join(images_dir, base_name + ext)if os.path.exists(possible_image):image_file = possible_imagebreakif image_file is None:print(f"⚠️ 图像文件 {base_name} 不存在,跳过。")continue# 拷贝标签和图像shutil.copy(os.path.join(labels_dir, label_file), os.path.join(output_dir, split_name, 'labels', label_file))shutil.copy(image_file, os.path.join(output_dir, split_name, 'images', os.path.basename(image_file)))print(f"✅ {split_name} 集合完成,共复制 {len(file_list)} 张图像。")# 执行复制
copy_samples(train_files, 'train')
copy_samples(val_files, 'val')

这里多说一句,如果大家拿到的是VOC格式的数据集也不要慌,我们可以使用下面的脚本将VOC数据集转化成YOLO数据集以供模型训练。

import os
import xml.etree.ElementTree as ET
from PIL import Image# VOC 类别列表(顺序必须固定)
classes = ['fire']  # 替换成你自己的类别# 输入路径
voc_anno_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\Annotations'
voc_img_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\JPEGImages'# 输出路径
yolo_label_dir = r'C:\Users\13978\Downloads\fire_detection\VOC2020\labels'
os.makedirs(yolo_label_dir, exist_ok=True)def convert_box(size, box):"""将VOC边界框坐标转为YOLO格式"""dw = 1. / size[0]dh = 1. / size[1]x_center = (box[0] + box[1]) / 2.0y_center = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]return (x_center * dw, y_center * dh, w * dw, h * dh)def convert_annotation(xml_path, img_path, output_path):tree = ET.parse(xml_path)root = tree.getroot()img = Image.open(img_path)w, h = img.sizewith open(output_path, 'w') as out_file:for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:continuecls_id = classes.index(cls)xml_box = obj.find('bndbox')b = (float(xml_box.find('xmin').text),float(xml_box.find('xmax').text),float(xml_box.find('ymin').text),float(xml_box.find('ymax').text))bb = convert_box((w, h), b)out_file.write(f"{cls_id} {' '.join(map(str, bb))}\n")# 遍历VOC标注文件夹
for filename in os.listdir(voc_anno_dir):if not filename.endswith('.xml'):continuexml_path = os.path.join(voc_anno_dir, filename)img_filename = filename.replace('.xml', '.jpg')img_path = os.path.join(voc_img_dir, img_filename)output_path = os.path.join(yolo_label_dir, filename.replace('.xml', '.txt'))if not os.path.exists(img_path):print(f"Warning: image {img_path} not found, skipping.")continueconvert_annotation(xml_path, img_path, output_path)print(f"Converted {filename} to {output_path}")

By:如有需要,本人可提供标注好的VOC(XML)格式火焰数据集2059张,欢迎了解!

2.模型训练

我们使用yolov8n.pt作为基础模型,对标注好的数据集进行深度学习模型训练,训练的话需要准备
data.yaml配置文件,此文件内容可以参考我的:

path: C:\Users\13978\Downloads\fire_detection\VOC2020\output_dataset2  # 数据集的根目录
train: train                 # 相对于 path 的训练图像路径
val: val                     # 相对于 path 的验证图像路径names:0: smoke1: fire

然后执行下面的命令,就可以开始训练模型了

yolo task=detect mode=train model=../data/models/yolov8n.pt data=./data.yaml epochs=50 imgsz=640  batch=16 lr0=0.01

下表为上面命令的详细解读

参数解释
yolo-调用 YOLOv8 的命令行接口工具。
task=detectdetect任务类型为“目标检测”(可选值还有:segment, classify 等)。
mode=traintrain模式为训练模式(其他模式有 predict, val, export 等)。
model=../data/models/yolov8n.pt../data/models/yolov8n.pt指定预训练模型的路径,这里是 YOLOv8n(nano)版本的权重。
data=./data.yaml./data.yaml数据集配置文件的路径,定义了训练集、验证集的路径及类别等信息。
epochs=5050模型将训练 50 个 epoch。
imgsz=640640输入图像尺寸为 640×640 像素。
batch=1616每个 batch 包含 16 张图像(batch size)。
lr0=0.010.01初始学习率设置为 0.01。

害,由于博主电脑不支持GPU加速,所以确实花费了一些时间成本,最终训练50轮我们花费了将近3个小时,好在功夫不负有心人,训练任务如期结束。
在这里插入图片描述
下面的数图为模型输出目录和文件

卷 Data 的文件夹 PATH 列表
卷序列号为 9AD9-E265
D:\PROJECTS\GITEE\YOLO_PROJECTS\YOLOV8-FIRE-SMOKE-DETECTION\TRAIN\RUNS\DETECT\TRAIN3
│  args.yaml
│  confusion_matrix.png
│  confusion_matrix_normalized.png
│  events.out.tfevents.1753497631.Admin.16932.0
│  F1_curve.png
│  labels.jpg
│  labels_correlogram.jpg
│  PR_curve.png
│  P_curve.png
│  results.csv
│  results.png
│  R_curve.png
│  train_batch0.jpg
│  train_batch1.jpg
│  train_batch1720.jpg
│  train_batch1721.jpg
│  train_batch1722.jpg
│  train_batch2.jpg
│  val_batch0_labels.jpg
│  val_batch0_pred.jpg
│  val_batch1_labels.jpg
│  val_batch1_pred.jpg
│  val_batch2_labels.jpg
│  val_batch2_pred.jpg
│
└─weightsbest.ptlast.pt

简单介绍一下输出文件、目录内容

文件/文件夹名类型说明用途
best.pt模型权重验证集表现最佳的模型,推荐用于推理部署
last.pt模型权重最后一轮训练后保存的模型
args.yaml配置文件本次训练的参数配置(batch size、epoch、数据路径等)
results.png图像训练过程关键指标(Loss、mAP、Precision、Recall)趋势图
results.csv表格数据results.png 对应的原始数据(每个 epoch 的指标)
confusion_matrix.png图像混淆矩阵,展示预测 vs 真实类别的关系
confusion_matrix_normalized.png图像归一化混淆矩阵,更易观察类别预测比例
F1_curve.png图像F1 分数曲线,衡量精度与召回的平衡
P_curve.png图像Precision(准确率)随阈值变化曲线
R_curve.png图像Recall(召回率)随阈值变化曲线
PR_curve.png图像PR 曲线(Precision vs Recall)
labels.jpg图像各类别标注的分布频率图
labels_correlogram.jpg图像类别之间的共现关系图(哪些类别常一起出现)
train_batch0.jpg图像训练集部分图像及其标注框(训练样本可视化)
val_batch*_labels.jpg图像验证集图像+真实标签框
val_batch*_pred.jpg图像验证集图像+模型预测框(用于与真实值对比)
events.out.tfevents.*日志文件TensorBoard 日志文件,支持训练过程可视化
weights/ 文件夹文件夹存放训练过程中生成的模型权重文件(包含 best.pt, last.pt

下图为results.png
在这里插入图片描述
我们最关心的当然是weights/best.pt模型文件,这是我们火焰与烟雾检测系统的核心。

3.界面窗口

在本章节仅简单介绍一下界面:
我们的核心界面包括:
1.登录注册界面
2.核心功能界面
3.检测告警提示窗口
提示:为了使用不同需求的用户,我们这里为大家设置了方便的设置开关,具体来说是代码里面的system_conf.py我们设置了一个SHOW_LOGIN_FLAG用来控制“是否启用登录系统”,当此标志位为True时,启用登录系统,反之不启用。
在这里插入图片描述

1.登录注册界面

我们为用户设计了美观简约的登录注册界面,用户可以选择注册或者登录,拿到代码的小伙伴可以自行调整系统相关文字以及图标和背景图片,系统附带了登录注册使用的数据库,默认用户名和密码为

用户名:admin
密码:admin

在这里插入图片描述

2.核心功能界面

只有用户名和密码匹配并且成功登录的用户才能使用我们系统的核心功能,我们的和弦功能界面采用PyQt5开发,包含多个功能模块和显示区域,这些子模块我会在下一个章节详细介绍。
在这里插入图片描述

3.检测告警提示窗口

我们设置了多种告警提示方案,下图为“系统弹窗提示”方案,当发现画面中有烟雾或者火情时,系统会自动在桌面右下角弹出警告提示窗,发出声音进行告警提示。
在这里插入图片描述

三..核心界面模块介绍

本章节是我们系统的核心章节,我会使用图文的方式介绍每个核心界面的子模块,让大家了解我设计的目的和具体代码实现方案,大家能够了解到我具体的设计初衷以及想法。

1.顶部信息区域

顶部信息区域由三部分组成,分别为:标题区域、日期与系统指标区域、用户信息区域。

首先,系统名称以大号字体居中展示,并采用半透明背景样式,以突出系统标识和整体视觉效果。其下方左侧显示当前时间和日期,实现实时更新。
在底部,系统会每秒刷新一次当前 CPU 和内存使用率,数据精确到小数点后一位,方便用户实时掌握系统运行状态。

右侧为用户信息区域,显示当前登录用户的姓名。旁边的小三角图标为功能入口,点击后可选择 “退出登录” 或 “退出系统” 两项操作:
退出登录:系统将跳转回登录界面,用户需重新输入正确的用户名和密码以重新登录;
退出系统:系统会弹出确认提示,询问用户“是否确定退出”。点击 YES 后,系统将完全关闭。
在这里插入图片描述

2.数据输入

该区域为系统的整体数据输入控制面板,支持四种数据输入方式,具体包括:
图片
视频
RTMP/RTSP 视频流
本机摄像头
多样化的输入方式极大地扩展了系统的数据接入能力与应用场景。

在下方区域,用户可以选择博主提供的预训练模型 best.pt 作为目标检测模型,也可加载自行训练的模型文件。系统在模型选择方面提供了较高的灵活性,只要模型符合系统支持的格式与规范,即可顺利接入使用。
在这里插入图片描述

3.参数配置

在参数配置子模块中,用户可以灵活调整输入参数,包括重叠度(IOU)和置信度(Confidence),这些参数的变动将直接影响最终的目标检测结果。
我们提供了两种参数调节方式:SpinBox 和 Slider。这两个组件基于 Vue 的双向绑定机制,实现了数据的同步更新——当用户调整其中一个组件时,另一个组件的数值也会自动联动变化。
这种便捷的参数调节方式大大降低了用户配置系统输入参数的操作难度,提升了使用效率和体验。

请添加图片描述

4.告警设置

在告警设置模块中,用户需手动选择所需的告警方式。系统内置了五种告警方式,具体如下:
语音播报:通过语音播放具体的告警内容;
声音告警:播放预设的告警音效;
系统弹窗提醒:在屏幕右下角弹出告警提示窗口;
短信提醒:调用第三方服务发送短信(需进行相关配置);
邮件提醒:通过第三方服务发送邮件通知(需进行相关配置)。
这些可多选的组件为复选框(QCheckBox),用户可以根据需求选择多个。
在这里插入图片描述

5.操作台

用户可在操作台上直接对系统进行操作,包括:
停止任务
导出数据(支持 TXT、CSV、Excel 格式)
保存画面(将当前画面保存为本地文件)
清空画面(清除当前显示内容)
为提升功能辨识度,我们贴心地为不同功能设置了颜色区分的交互按钮,帮助用户更高效地完成操作。
在这里插入图片描述

6.关于

此处展示了若干信息入口,包括:
关于作者:点击后将提示用户是否前往作者博客;
技术支持:可直接通过 QQ 与作者联系,进行在线咨询;
关于软件:展示当前软件的基本信息和简介;
关于 Qt:调用系统原生的 Qt 信息弹窗。
通过这些入口,用户可以方便地了解软件背景,并快速获取开发者的技术支持。

在这里插入图片描述

7.指标变化

我们为系统设置了高颜值的折线图可视化界面,用于实时展示 CPU 与内存占用情况 的变化趋势。图表采用 ECharts 实现,背景为透明样式,整体风格简洁美观,提升了系统界面的视觉体验。
CPU 利用率 以发光黄色折线展示;
内存使用率 以发光紫色折线展示;
数据每秒更新一次,通过多线程方式刷新,确保图表实时性同时不会阻塞主线程,避免界面卡顿。
当鼠标悬停于折线图上时,将自动显示对应时间点的详细指标值,方便用户精确查看系统资源变化。

请添加图片描述

8.异常速览

此模块为博主的一个巧思,旨在于快速让用户看到汇总起来的每个目标图像数据,用户可以使用点击图像的方式按需保存每一块截取出来的图像,我们为每个图像进行了编号,这里的编号和检测结果表格里的编号是对应的,如果有多个会自动添加滚动条进行展示。
在这里插入图片描述

9.日志输出

顾名思义,该模块用于展示实时检测结果日志,包括检测出的目标数量及相关告警信息。
每条新日志在展示前,都会自动添加精确到时分秒的时间戳,便于用户后续回溯与分析。新生成的日志将按时间顺序追加至日志末尾,并支持自动滚动显示,确保用户始终能够查看到最新的检测信息。

请添加图片描述

10.检测结果

在此区域,我们以二维表格的形式展示当前图像检测的结果,所有检测到的目标均以列表方式呈现,便于统一查看。

图像数据采用 Base64 编码 方式进行切割与嵌入,用户可以直观地查看每个目标的图像片段,并与当前画面进行快速比对,便于问题定位与分析。
表格基于简约的 HTML <table> 结构构建,设计轻量,显著降低了系统资源开销。
当检测结果较多时,表格右侧会自动显示滚动条,用户可通过拖动滚动条查看更多内容,保证良好的交互体验与数据可读性。
请添加图片描述

11.核心内容显示区域

本区域用于展示每次目标检测的结果,采用 堆栈组件(QStackedWidget) 实现多页面切换。具体包括:
第一页:用于显示图像检测结果;
第二页:用于显示视频、视频流或摄像头检测结果。

通过这种设计,系统能够灵活支持 静态图像 与 动态视频流 两种类型的内容展示。
该区域是整个软件中占据界面面积最大的部分,同时也是用户最为关注的核心功能区域。
在这里插入图片描述

四.问题回答

在这个章节我将对大家关注的问题进行回答

1.项目结构是怎样的,好上手么?

请放心,项目好上手!
我们的项目定义为yolov8-fire-smoke-detection,我们使用包、类和函数对主要功能进行区分,核心代码位于src目录下,项目根目录的main.py为程序入口,每个目录的功能和作用大家见名知意,我们的代码采用标准格式的编码,比如类名就是大驼峰,函数名就是小写加下划线,下图为项目结构
在这里插入图片描述

2.项目依赖

我们的项目核心为PyQt5+YOLOv8,下面是我们项目的依赖

PyQt5==5.15.11
PyQt5_sip==12.15.0
QtAwesome==1.3.1
torch==2.4.1
torchvision==0.19.1
Pillow==9.3.0
PyQtWebEngine==5.15.5
opencv-python==4.10.0.82
ultralytics==8.3.98
pyttsx3==2.71

大家拿到代码之后直接执行下面的命令,即可一键安装依赖!

pip install -r requirements.txt

请你放心,我们的项目一定能运行!

3.我想更改背景图或文字

这个需求还是很常见的

1.改文字

改文字很简单,比如要更改项目名字,就去代码中全局搜索指定的字符串,下图为PyCharm全局搜索的方式
Edit-Find-Replace in Files在这里插入图片描述
然后搜索要替换的字符串
在这里插入图片描述
然后重新启动项目验证一下,生效
在这里插入图片描述

2.改图片

这里以更改背景图片为例,给大家演示如何更改主界面背景图
首先要现有一张背景图,然后放到imgs/目录下替换同名文件
在这里插入图片描述

然后执行script/create_qrc.py脚本,重新生成qrc二进制资源文件,最后验证一下
ok没问题!
在这里插入图片描述

五.总结

这次和大家详细分享了我使用PyQt5+YOLOV8开发的火焰与烟雾检测系统,本系统实用性强、可拓展性强、能够满足不同用户的差异化需求。

在这里插入图片描述
需要源码可以点击下方二维码加我好友带数据集,非无偿请理解!
在这里插入图片描述

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

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

相关文章

基于Transform、ARIMA、LSTM、Prophet的药品销量预测分析

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、数据准备与预处理三、模型选择与方法设计1. ARIMA 模型&#xff1a;传统统计方法的基线构建2. LSTM 模型&#xff1a;引入记忆机制的深度学习方法3. Transformer 模型&#…

LLM隐藏层与logits数值的简单理解

LLM的“隐藏层数值”和“logits数值” 代表什么,范围是多少 “隐藏层数值”和“logits数值”是两个关键概念——它们分别对应模型“理解信息”和“输出决策”的核心环节。 一、先明确基础:LLM的“思考”流程 LLM本质是“输入文本→处理信息→输出结果”的神经网络。简单说…

Vue》》@ 用法

使用 别名导入 // 导入 src/components/Button.vue import Button from /components/Button.vue// 导入 src/utils/helper.js import { helperFunc } from /utils/helper// 导入 src/store/index.js import store from /store

20250726-1-Kubernetes 网络-Service存在的意义_笔记

一、Service控制器 1. Service存在的意义 1)基本场景  动态IP问题:Pod IP具有短暂性,销毁重建后IP会变化(示例:原IP 169.130重建后变为169.132) 服务发现需求:需要稳定入口访问同一服务的多个Pod,避免因Pod变动导致服务中断 负载均衡需求:多个Pod副本需要统一访…

在一个存在的包里面编写msg消息文件

前言尽管最佳实践是在专门的接口包中声明接口&#xff0c;但有时在同一个包中完成接口的声明、创建和使用会更为便捷。创建文件创建好msg/AddressBook.msg文件&#xff0c;在你的包的目录下package.xml<buildtool_depend>rosidl_default_generators</buildtool_depend…

华为服务器操作系统openEuler介绍与安装

一、openEuler概述 1.1、openEuler介绍 openEuler&#xff08;简称 “欧拉”&#xff09;是华为开源的服务器操作系统&#xff0c;是基于Linux稳定系统内核的、面向企业级的通用服务器架构平台。能够满足客户从传统IT基础设施到云计算服务的需求&#xff0c;打造了完善的从芯…

CUDA杂记--FP16与FP32用途

FP16&#xff08;半精度浮点数&#xff09;和FP32&#xff08;单精度浮点数&#xff09;是计算机中用于表示浮点数的两种常见格式&#xff0c;它们在存储空间、数值范围、精度、计算效率等方面有显著区别。以下从核心差异、适用场景等方面详细说明&#xff1a; 一、核心差异&am…

Android开发中技术选型的落地方案

技术选型不是简单地“哪个库最火就用哪个”&#xff0c;而是一个需要综合考虑业务、团队、技术、维护、未来等多维度因素的系统工程。 核心目标&#xff1a; 选择最适合当前及可预见未来项目需求的技术栈&#xff0c;确保应用高质量、高效率、可维护、可扩展、安全稳定地开发和…

Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成

在微服务架构盛行的今天&#xff0c;单元测试已成为保障代码质量的核心环节。Spring Boot 生态提供了完整的测试工具链&#xff0c;结合 JUnit5 的现代化测试框架和 Mockito 的行为模拟能力&#xff0c;可实现从方法级到模块级的全链路测试覆盖。本文将通过实战案例解析 JUnit5…

八股文整理——计算机网络

目录 OSI&#xff0c;TCP/IP&#xff0c;五层协议的体系结构 TCP/IP模型和OSI参考模型的对应关系 OSI每一层的作用如下&#xff08;理解顺序依次往下&#xff09;&#xff1a; OSI分层及对应协议 以 “寄快递” 为例类比七层模型 TCP与UDP的区别&#xff1f; TCP对应的…

进制间的映射关系

✅ 问题一&#xff1a;为什么不同进制之间会有特定的映射关系&#xff1f; ✅ 问题二&#xff1a;为什么八进制和十六进制可以被看作是二进制的简化形式&#xff1f;&#x1f50d; 一、为什么不同进制之间有特定的映射关系&#xff1f; 这是因为 所有进制本质上只是表示数的不同…

RabbitMQ-交换机(Exchange)

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。中间件&#xff0c;我给它的定义就是为了实现某系业务功能依赖的软件&#xff0c;包括如下部分:Web服务器代理…

分类预测 | MATLAB实现DBO-SVM蜣螂算法优化支持向量机分类预测

分类预测 | MATLAB实现DBO-SVM蜣螂算法优化支持向量机分类预测 目录 分类预测 | MATLAB实现DBO-SVM蜣螂算法优化支持向量机分类预测 分类效果 基本介绍 算法步骤 参数设定 运行环境 应用场景 程序设计 参考资料 分类效果 基本介绍 该MATLAB代码实现了基于蜣螂优化算法(DBO)优…

变频器实习DAY15

目录变频器实习DAY15一、工作内容柔性平台常规测试柔性平台STO测试自己犯的一个特别离谱的错STO的功能了解为什么STO的故障叫做基极已封锁二、学习内容2.1 火线接断路器 vs. 接地/悬空的区别小内容分点附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)变频器实习DAY15 STO 板…

一文学会c++list

文章目录list简介list接口迭代器失效&#x1f6a9;模拟实现list简介 1&#xff0c;list是可以在常数时间复杂度任何位置随意插入的序列式容器&#xff0c;可以双向迭代 2&#xff0c;底层是双向链表结构&#xff0c;每个节点都是独立的&#xff0c;通过前后指针链接 3&#xf…

数据集分享 | 智慧农业实战数据集精选

【导读】 在智慧农业的发展浪潮下&#xff0c;AI视觉算法正逐步渗透进作物生长监控、病虫害检测、采摘成熟评估等细分任务。相较于工业或城市场景&#xff0c;农业视觉更具挑战性&#xff1a;自然环境复杂、目标形态多变、时空尺度差异大。 为实现精准农业管理&#xff0c;一…

CCFRec-人大高瓴-KDD2025-序列推荐中充分融合协同信息与语义信息

文章目录1. 背景与问题2. 方法2.1 多视图 sid2.2 Code-Guided Semantic Fusion核心创新&#xff1a;常规操作&#xff1a;2.3 Enhanced Representation Learning via Code Masking2.3.1 Masked Code Modeling (MCM)2.3.2 Masked Sequence Alignment (MSA)2.4 复杂度分析2.4.1 训…

Python深入 Tkinter 模块

目录 一、为什么要写 Tkinter 二、最小可运行示例&#xff1a;Hello World 不是终点&#xff0c;而是起点 三、布局三板斧&#xff1a;pack、grid、place 四、事件与回调&#xff1a;让按钮“响”起来 五、实战案例&#xff1a;秒表 文件批量重命名器 六、样式进阶&…

LeetCode 面试经典 150_数组/字符串_删除有序数组中的重复项(3_26_C++_简单)

LeetCode 面试经典 150_删除有序数组中的重复项&#xff08;3_26_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;双指针&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;双指…

架构篇(一):告别MVC/MVP,为何“组件化”是现代前端的唯一答案?

架构篇(一)&#xff1a;告别MVC/MVP&#xff0c;为何“组件化”是现代前端的唯一答案&#xff1f; 引子&#xff1a;一个困扰前端工程师的“幽灵” 在上一章《序章&#xff1a;抛弃UI&#xff0c;我们来构建一个“看不见”的前端应用》中&#xff0c;我们从零开始构建了一个纯…