YOLO11+QT6+Opencv+C++训练加载模型全过程讲解

实现效果:

Yolov11环境搭建(搭建好的可以直接跳过)

最好使用Anconda进行包管理,安装可参考【文章】。下面简单过一下如何快速部署环境。如果搭建过或可以参考其他文章可以跳过Yolo11环境搭建这一章节。总体来说Yolov11环境搭建越来越容易了。

Anconda创建环境

  1. 打开Anaconda prompt
  2. 使用下面命令创建新环境,这里指定python版本为3.11.9。不一定使用这个版本的python,3.10、3.9、3.12都可以。具体请看【详细说明】,这里展示了部分需求Install the ultralytics package, including all requirements, in a Python>=3.8 environment with PyTorch>=1.8
    ## 注意我在Anconda配置了环境了安装位置,如果没有配置的可能创建的环境是在C盘,如果没有设置这里创建环境时候需要指定环境的路径## 不指定Python版本(默认是比较新的Pyhton版本)
    conda create --name 环境名
    #示例,创建一个名为yolov11的环境:
    conda create --name yolov11## 指定python版本
    conda create --name 环境名 python=环境版本
    # 示例,创建一个名为yolov11的环境,并指定python版本为3.11.9
    conda create --name yolov11 python=3.11.9
  3. 切换到自己刚才创建的环境中
    ## 指令
    conda activate 环境名
    # 不清楚的可以使用下面指令列出所有环境
    conda env list## 示例,激活刚才创建的环境yolov11
    conda activate yolov11
  4. 安装ultralytics,详细请参考【ultralytics官网快速入门教程】
    ## 直接安装ultralytics,默认最新版本的,也可以指定版本,这里使用最新的
    pip install ultralytics## 上面安装的有一点慢,可以指定国内源,这里使用清华源
    pip install ultralytics -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
  5. 安装过程中的警告(这个警告是多打了some-package导致的,正常没有,可以跳过)
    DEPRECATION: Building 'some-package' using the legacy setup.py bdist_wheel mechanism, which will be removed in a future version. pip 25.3 will enforce this behaviour change. A possible replacement is to use the standardized build interface by setting the `--use-pep517` option, (possibly combined with `--no-build-isolation`), or adding a `pyproject.toml` file to the source tree of 'some-package'. Discussion can be found at https://github.com/pypa/pip/issues/6334##含义:你正在安装的包(如some-package)使用了旧的setup.py bdist_wheel方式构建 wheel 包,这种方式将在未来版本中被移除。从 pip 25.3 版本开始,将强制要求使用新的构建标准(PEP 517/518),旧方式可能导致安装失败。## 临时解决:
    pip install some-package --use-pep517## 这里没有使用,不影响正常使用
  6. 上面会默认安装Pytorch,但是只能使用CPU。如果只想使用CPU进行训练,至此,所有环境配置完成。
  7. 卸载安装ultralytics是默认安装的torchvision,因为下面安装CUDA版本的Pytorch不会卸载torchvision,后面训练和使用模型的时候会报错。
    pip uninstall torchvision##如果不卸载安装的话会报错,后面使用代码会报错:
    NotImplementedError: Could not run 'torchvision::nms' with arguments from the 'CUDA' backend. This could be because the operator doesn't exist for this backenden...
  8. 安装Pytorch GPU版本,查看支持的最高的CUDA版本
    ## 查看支持最高的CUDA版本,使用下面指令(这里需要在开一个终端,使用Win+R快捷键,输入cmd就可以打开)
    nvidia-smi## 不出意外得到下面结果
    +-----------------------------------------------------------------------------------------+
    | NVIDIA-SMI 576.80                 Driver Version: 576.80         CUDA Version: 12.9     |
    |-----------------------------------------+------------------------+----------------------+
    | GPU  Name                  Driver-Model | Bus-Id          Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
    |                                         |                        |               MIG M. |
    |=========================================+========================+======================|
    # 可以看到这里支持的最高的CUDA版本为12.9。如果想要显卡支持比较高的CUDA版本,需要更新显卡驱动就可以。
  9. 打开【Pytorch官网】,如下
  10. 可以看到我最高支持的为12.9版本,所以12.9以下的都可以,这里安装12.6。安装完成后环境就配置完成了。
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126

 下载Yolov11源码

 github上链接在这里【yolov11源码】,好像最近不用魔法很难登进去,也有可能是我网络的原因。

测试

这里使用pycharm打开下载后的源码,配置Python环境为上面conda创建的环境。如下:

编写代码测试一下环境,在ultralytics-main目录下创建python文件名为env_verification.py。其他目录下注意修改图片的目录,这里使用的是自带的目录。注意yolo11n.pt是在工程文件内容没有的,代码会自行下载,如果下载不成功需要自己下载,移植到根目录下。

from ultralytics import YOLO
import cv2# Load a pretrained YOLO11n model
model = YOLO("yolo11n.pt")# Perform object detection on an image
results = model("ultralytics/assets/")  # Predict on an image# 逐帧显示
for result in results:annotated_frame = result.plot()# 使用OpenCV显示cv2.imshow("YOLOv11 Result", annotated_frame)cv2.waitKey(0)  # 等待按键,0表示无限等待cv2.destroyAllWindows()

训练自己的模型(检测)

准备好训练数据

和之前yolo系列没有什么太大区别。第一找开源的数据集,第二种自己标注。

这里使用自己标注,可以使用软件(labelimg)或者【标注网站】,这里使用网站makesense,可以自行搜索使用方法,标注完成后导出。格式如下,上面是文件,下面是文件内容。

 建立训练文件夹

在ultralytics-main新建datasets文件夹,文件夹内容如下:

images文件夹下存放图片,labels文件夹下存放标签,train文件夹下存放训练数据,val是验证集,注意文件夹图片和标签是一一对应的。

新建训练Python文件

在根目录ultralytics-main下新建train.py文件,内容如下:

from ultralytics import YOLOif __name__ == '__main__':# Load a modelmodel = YOLO("yolo11.yaml")  # build a new model from YAMLmodel = YOLO("yolo11n.pt")  # load a pretrained model (recommended for training)model = YOLO("yolo11.yaml").load("yolo11n.pt")  # build from YAML and transfer weights# Train the modelresults = model.train(data="coco128.yaml", epochs=100, imgsz=640, batch=8)

注意有两个文件复制到根目录下,并需要进行修改。一个是yolo11.yaml(在目录下:ultralytics/cfg/models/11/yolo11.yaml),一个是coco128.yaml(在目录下:ultralytics/cfg/datasets/coco128.yaml),之后需要修改文件内容:

## yolo11.yaml文件nc: 2 # 原文件第8行,修改检测的类别个数,看自己标签打了多少个这里就改为多少
## cocol28.yaml文件# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license# COCO128 dataset https://www.kaggle.com/datasets/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco/
# Example usage: yolo train data=coco128.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco128  ← downloads here (7 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: D:/Python_Project/yolov11/ultralytics-main/datasets # 数据集的根目录,最好用绝对路径
train: images/train # 训练图片在的目录,和上面的path需要组成一个完整的目录,当然也可以直接写成绝对路径
val: images/val # 验证集图片
test: # test images (optional)# Classes  类别,这个是2,冒号右边是检测框上面会出现的标识,注意和自己打好的标签相互对应
names:0: circle1: rect# Download script/URL (optional)
#download: https://github.com/ultralytics/assets/releases/download/v0.0.0/coco128.zip

 运行就可以进行训练了,最后训练完成后会显示存储位置:Results saved to runs\detect\train27

追训

一般情况下训练的时候,加载预训练模型,上面使用的是官方的,所以效果没有那么好。训练完成后可以加载自己训练好的模型,继续训练。

from ultralytics import YOLOif __name__ == '__main__':# Load a modelmodel = YOLO("yolo11.yaml")  # build a new model from YAMLmodel = YOLO("last.pt")  # load a pretrained model (recommended for training)model = YOLO("yolo11.yaml").load("last.pt")  # build from YAML and transfer weights# Train the modelresults = model.train(data="coco128.yaml", epochs=100, imgsz=640, batch=8)

QT中使用训练好的模型

这里是在Qt Creator 15.0.1 (Community)进行UI设计和加载模型,使用的c++。当然还有一种是直接在Python环境中进行设计的,在上面常见的yolov11环境中使用pip安装Pyside2/6就可以,比使用Qt Creator调用训练好的模型要方便一点。

看一下官方说明,下面有对应的yolo模型在不同平台和编程语言中的各种使用案例和部署策略。这里使用第一个。

转换模型

选练好的模型为pt,不能够直接使用,需要转换为onnx格式的。

首先安装依赖库

pip install onnx==1.17.0  # 这里我的要求为['onnx>=1.12.0,<1.18.0'],运行转换代码报错后注意版本
pip install onnxslim
pip install onnxruntime

在根目录下,新建pt_to_onnx.py文件,转换代码如下:
 

from ultralytics import YOLO# 加载一个训练好的模型
model = YOLO("runs/detect/train28/weights/best.pt")path = model.export(format="onnx")  # 返回导出模型的路径
print(f"导出的路径为:{path}")

代码会自动打印转换后模型所在的目录,自己到相应目录中去找就可以。

QT界面设计(可以不用看,设计好自己的界面就可以)

设计自己的界面就可以了,这里完全不用看

打开Qt Creator,创建工程,这里是使用cmake,不用qmake。设计的界面如下:

配置文件

如果在qt中加载训练好的模型,需要额外的库文件,之前说使用YOLO ONNX Detection Inference with C++,对应的就是在yolov11目录下examples文件中,需要把下面两个文件拷贝到qt文件夹下

拷贝的记结果如下:

然后把转换后的模型也放入到该目录中,其实也可以不放,程序里面写的是绝对路径就可以

 安装opencv

因为上面两个文件依赖opencv,需要安装opencv。这里使用了一种比较好的方法就是直接把opencv库移植到项目中,不需要安装到其他位置和配置环境变量。

  1. 下载exe版本的opecnv,这里有【链接】,这里下载exe文件
  2. 下载会后直接点击exe文件,然后选择解压的目录,下面是我的解压的目录(之前下载的是4.11.0版本,这里没有换图片),4.11.0会有点问题,所以推荐是4.8.1版本:
  3. 进入到解压的opencv文件中,复制build文件夹,粘贴到qt项目中。这里我放入到了opencv目录中,因为该文件夹下已经存在一个build,新建opencv目录。下面是我的qt项目文件:

配置CMakeLists.txt文件

## 第一处是增添inference.cpp和inference.h文件set(PROJECT_SOURCESmain.cppmainwindow.cppinference.cppmainwindow.hinference.hmainwindow.ui
)# =======================  OpenCV 配置开始 ========================
# 设置 OpenCV 路径(请修改成你实际的路径)
set(OpenCV_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv/build/include")
set(OpenCV_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv/build/x64/vc16/lib")
set(OpenCV_DLL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv/build/x64/vc16/bin")# 添加头文件路径
include_directories(${OpenCV_INCLUDE_DIR})
include_directories(${OpenCV_INCLUDE_DIR}/opencv4)# 添加库路径
link_directories(${OpenCV_LIB_DIR})# 添加要链接的库(可按需精简)
# Debug下使用opencv_world481会有错误
# opencv_world481和opencv_world481d不能同时使用,否则会出错
set(OpenCV_LIBS# opencv_world481opencv_world481d
)
# =======================  OpenCV 配置结束 ========================## 第三处修改链接部分,链接 Qt + OpenCV
target_link_libraries(KeyboardTemplateMatching PRIVATE Qt${QT_VERSION_MAJOR}::Widgets ${OpenCV_LIBS})

 编写QT代码程序

因为使用qt设计师设计了界面,如上面QT界面设计小结所示,这里给出关键代码:

mainwindow.cpp

注意: Inf_ = new Inference("D:/programming_learning/QT/KeyboardTemplateMatching/best.onnx", cv::Size(640, 640), "D:/classes.txt", false);中的D:/classes.txt没有用,直接用一个空字符代替就好,细看代码就知道,程序没有使用这个文件。然后就是最后一个参数设置为false,就是使用CPU,如果为true会有点警告:[ WARN:0@6.279] global net_impl.cpp:178 cv::dnn::dnn4_v20230620::Net::Impl::setUpNet DNN module was not built with CUDA backend; switching to CPU,不过是警告,所以功能正常。

#include "mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);try {Inf_ = new Inference("D:/programming_learning/QT/KeyboardTemplateMatching/best.onnx", cv::Size(640, 640), "D:/classes.txt", false);}catch (const std::exception& e) {std::cerr << "创建 Inference 实例时发生异常: " << e.what() << std::endl;QMessageBox::critical(this, "异常", QString("模型加载失败: %1").arg(e.what()));}catch (...) {std::cerr << "创建 Inference 实例时发生未知异常。" << std::endl;QMessageBox::critical(this, "异常", "发生未知错误,无法初始化模型。");}// 这里实现了读取图片和进行检测QObject::connect(ui->action_select_img, &QAction::triggered, this, [=](){QString imagePath = QFileDialog::getOpenFileName(this,"选择图片","","图像文件 (*.png *.jpg *.jpeg *.bmp *.gif)");if (!imagePath.isEmpty()) {QPixmap pixmap(imagePath);if (pixmap.isNull()) {QMessageBox::warning(this, "错误", "无法加载图片!");return;}ui->original_image_label->setPixmap(pixmap.scaled(ui->original_image_label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));std::string stdStr = imagePath.toUtf8().constData();cv::Mat img_mat = cv::imread(stdStr, cv::IMREAD_COLOR);if (img_mat.empty()) {qDebug() << "图像读取失败,路径:" << imagePath;}// 执行检测任务std::vector<Detection> output = Inf_->runInference(img_mat);int detections = output.size();std::cout << "Number of detections: " << detections << std::endl;// 类别计数字典(class_id -> count)std::map<int, int> class_counts;for (const Detection& detection : output){const cv::Rect& box = detection.box;const cv::Scalar& color = detection.color;int class_id = detection.class_id;std::string className = detection.className;float confidence = detection.confidence;// 累计计数class_counts[class_id]++;// 绘制框cv::rectangle(img_mat, box, color, 2);// 构建标签文字std::string label = className + ' ' + std::to_string(confidence).substr(0, 4);cv::Size textSize = cv::getTextSize(label, cv::FONT_HERSHEY_DUPLEX, 1, 2, 0);cv::Rect textBox(box.x, box.y - 40, textSize.width + 10, textSize.height + 20);// 绘制背景框和文字cv::rectangle(img_mat, textBox, color, cv::FILLED);cv::putText(img_mat, label, cv::Point(box.x + 5, box.y - 10), cv::FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 0, 0), 2, 0);}// Inference ends here...QString resultText = "类别统计结果:\n";for (const auto& [class_id, count] : class_counts) {QString line = QString("- %1: %2\n").arg(QString::fromStdString(Inf_->getClassName(class_id))).arg(count);resultText += line;}// 将结果显示到 QLabel 上ui->result_label->setText(resultText);// 将 cv::Mat 转换为 QImage,再显示在 QLabel 上QImage qimg(img_mat.data,img_mat.cols,img_mat.rows,static_cast<int>(img_mat.step),QImage::Format_BGR888);  // 注意格式要匹配 OpenCV 的 BGR// 设置 QLabel 显示图像(自动缩放至 label 尺寸)ui->detect_imag_label->setPixmap(QPixmap::fromImage(qimg).scaled(ui->detect_imag_label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));}});
}MainWindow::~MainWindow()
{delete ui;delete Inf_;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "inference.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;Inference *Inf_;
};
#endif // MAINWINDOW_H

修改inference.h里面内容(非常重要)

根据实际情况修改自己的类别,注意要和yolo训练的时候类别保持一致,否则会出现全屏都是框框的情况。

std::vector<std::string> classes{"circle", "rect"};

一些其他的工作

为了实现汇总每个类别个体的数量,我在inference.h里面增加了一个getClassName函数,在mainwindow.cpp里面进行了调用。

具体实现:

std::string Inference::getClassName(int class_id) const {if (class_id >= 0 && class_id < classes.size()) {return classes[class_id];} else {return "Unknown";}
}

Over

至此工作全部完成,其中也踩了不少坑。

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

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

相关文章

Python 脚本,用于将 PDF 文件高质量地转换为 PNG 图像

import os import fitz # PyMuPDF from PIL import Image import argparse import logging from tqdm import tqdm# 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(PDF2PNG)def convert_pdf_…

【CUDA GPU 支持安装全攻略】PyTorch 深度学习开发者指南

PyTorch 的 CUDA GPU 支持 安装五条铁律&#xff08;最新版 2025 修订&#xff09;&#xff08;适用于所有用户&#xff09;-CSDN博客 是否需要预先安装 CUDA Toolkit&#xff1f;——按使用场景分级推荐及进阶说明-CSDN博客 “100% 成功的 PyTorch CUDA GPU 支持” 安装攻略…

Cyberith 运动模拟器Virtualizer2:提升虚拟现实沉浸体验

奥地利Cyberith公司是一家专注于虚拟现实&#xff08;VR&#xff09;互动解决方案的创新型科技企业&#xff0c;以其研发的Virtualizer虚拟现实步态模拟设备而闻名。该公司的核心技术体现在其设计和制造的全方位跑步机式VR交互平台上&#xff0c;使得用户能够在虚拟环境中实现自…

常见的数据处理方法有哪些?ETL中的数据处理怎么完成

在数字化转型纵深推进的背景下&#xff0c;数据作为新型生产要素已成为驱动企业战略决策、科研创新及智能化运营的核心战略资产。数据治理价值链中的处理环节作为关键价值节点&#xff0c;其本质是通过系统化处理流程将原始观测数据转化为结构化知识产物&#xff0c;以支撑预测…

WHAT - 为甲方做一个官网(二)- 快速版

文章目录 一、明确需求优先级&#xff08;快速决策&#xff09;二、推荐零代码/低代码工具&#xff08;附对比&#xff09;方案1&#xff1a;低代码建站平台&#xff08;适合无技术用户&#xff0c;拖拽式操作&#xff09;方案2&#xff1a;CMS系统&#xff08;适合内容更新频繁…

音视频之H.264视频编码传输及其在移动通信中的应用

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 3、音视频之H.264/AVC编码器原理 4、音视频之H.264的句法和语义 5、音视频之H.264/AVC解码器的原理和实现 6、音视频之H.264视频编码传输及其在移动通信中的应用 7、音视…

C#语言入门-task2 :C# 语言的基本语法结构

下面从四个方面对C#的基本语法进行简单介绍&#xff1a; 1. 数据类型 C#的类型可分为值类型和引用类型。值类型变量直接存储数据&#xff0c;引用类型变量则存储对象的引用。 值类型&#xff1a;涵盖整数类型&#xff08;像int、long&#xff09;、浮点类型&#xff08;例如…

c#笔记之类的常量、字段和属性

学习内容: 一、字段 字段是为了对象或者类型存储数据的,可以表达一个对象或者类型的状态;也叫做成员变量;注意字段是在类里面声明的;在方法里声明的是局部变量; 1.1实例字段 用来表示每个实例的状态;比如一个students类;要了解一个学生一般看名字和成绩;所以名字和…

Linux 常用命令(入门)

Linux 常用命令 一、Linux 命令基础 (一)命令格式 Linux 命令的一般格式为:command [-options] [parameter1] … 。其中,command 是命令名,通常是相应功能的英文单词或其缩写;[-options] 是选项,用于对命令进行控制,可省略;parameter1 … 是传给命令的参数,可以是…

CppCon 2016 学习:Parallelism in Modern C++

这段介绍的是 HPX (High Performance ParalleX)&#xff0c;一个现代C的通用并行运行时系统&#xff0c;重点包括&#xff1a; 通用性&#xff1a;适用于各种规模的应用&#xff0c;从小型到超大规模分布式系统。统一标准API&#xff1a;符合C标准&#xff0c;方便编写异步、并…

机器学习监督学习实战七:文本卷积神经网络TextCNN对中文短文本分类(15类)

本文介绍了一个基于TextCNN模型的文本分类项目&#xff0c;使用今日头条新闻数据集进行训练和评估。项目包括数据获取、预处理、模型训练、评估测试等环节。数据预处理涉及清洗文本、中文分词、去除停用词、构建词汇表和向量化等步骤。TextCNN模型通过卷积层和池化层提取文本特…

iot-dc3 项目Bug修复保姆喂奶级教程

一.Uncaught (in promise) ReferenceError: TinyArea is not defined 1.触发场景 前端设备模块,点击关联模板、关联位号、设备数据,无反应,一直切不过去,没有报错通知,F12查看控制台报错如下: 2.引起原因 前端导入的库为"@antv/g2": "^5.3.0",在 P…

Spring Boot + MyBatis Plus + SpringAI + Vue 毕设项目开发全解析(源码)

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Spring Boot MyBatis Plus SpringAI Vue 毕设项目开发全解析 目录 一、项目概述与技术选型 项目背景与需求分析技术栈选择…

Vitess数据库部署与运维深度指南:构建可伸缩、高可用与安全的云原生数据库

摘要 Vitess是一个为MySQL和MariaDB设计的云原生、水平可伸缩的分布式数据库系统&#xff0c;它通过分片&#xff08;sharding&#xff09;实现无限扩展&#xff0c;同时保持对应用程序的透明性&#xff0c;使其无需感知底层数据分布。该项目于2019年从云原生计算基金会&#…

SpringAI+DeepSeek大模型应用开发——6基于MongDB持久化对话

持久化对话 默认情况下&#xff0c;聊天记忆存储在内存中ChatMemory chatMemory new InMemoryChatMemory()。 如果需要持久化存储&#xff0c;可以实现一个自定义的聊天记忆存储类&#xff0c;以便将聊天消息存储在你选择的任何持久化存储介质中。 MongoDB 文档型数据库&…

Mac电脑-音视频剪辑编辑-Final Cut Pro X(fcpx)

Final Cut Pro Mac是一款专业的视频剪辑工具&#xff0c;专为苹果用户设计。 它具备强大的视频剪辑、音轨、图形特效和调色功能&#xff0c;支持整片输出&#xff0c;提升创作效率。 经过Apple芯片优化&#xff0c;利用Metal引擎动力&#xff0c;可处理更复杂的项目&#xff…

不同程度多径效应影响下的无线通信网络电磁信号仿真数据生成程序

生成.mat数据&#xff1a; %创建时间&#xff1a;2025年6月19日 %zhouzhichao %遍历生成不同程度多径效应影响的无线通信网络拓扑推理数据用于测试close all clearsnr 40; n 30;dataset_n 100;for bias 0.1:0.1:0.9nodes_P ones(n,1);Sampling_M 3000;%获取一帧信号及对…

Eureka 和 Feign(二)

Eureka 和 Feign 是 Spring Cloud 微服务架构中协同工作的两个核心组件&#xff0c;它们的关系可以通过以下比喻和详解来说明&#xff1a; 关系核心&#xff1a;服务发现 → 动态调用 组件角色核心功能Eureka服务注册中心服务实例的"电话簿"Feign声明式HTTP客户端根…

Springboot仿抖音app开发之RabbitMQ 异步解耦(进阶)

Springboot仿抖音app开发之评论业务模块后端复盘及相关业务知识总结 Springboot仿抖音app开发之粉丝业务模块后端复盘及相关业务知识总结 Springboot仿抖音app开发之用短视频务模块后端复盘及相关业务知识总结 Springboot仿抖音app开发之用户业务模块后端复盘及相关业务知识…

1.部署KVM虚拟化平台

一.KVM原理简介 广义的KVM实际上包含两部分&#xff0c;一部分是基于Linux内核支持的KVM内核模块&#xff0c;另一部分就是经过简化和修改的Qemuo KVM内核模块是模拟处理器和内存以支持虚拟机的运行&#xff0c;Qemu主要处理丨℃以及为用户提供一个用户空间工具来进行虚拟机的…