QT+Yolov8 实例分割、目标检测推理。QT源码。

程序准备/版本:QT creator QT6.8 编译器:MSVC2022 opencv:4.7 onnxruntime:1.16.0 cpu版本

QT+yolo推理部署

程序部分源码:

#include "aitoolinterface.h"
#include "ui_aitoolinterface.h"
#include <QDebug>
#include <QDateTime>
#include <QFileInfo>AIToolInterface::AIToolInterface(QWidget *parent): QWidget(parent), ui(new Ui::AIToolInterface), m_yoloModel(nullptr), m_modelLoaded(false), m_yoloModel2(nullptr), m_modelLoaded2(false)
{ui->setupUi(this);// 初始化状态ui->label_status->setText("状态: 未加载模型");ui->label_status->setStyleSheet("color: red;");// 禁用测试按钮,直到模型加载ui->pushButton_test->setEnabled(false);ui->pushButton_test_2->setEnabled(false);logMessage("AI分割检测工具已启动");
}AIToolInterface::~AIToolInterface()
{if (m_yoloModel) {delete m_yoloModel;m_yoloModel = nullptr;}if (m_yoloModel2) {delete m_yoloModel2;m_yoloModel2 = nullptr;}delete ui;
}void AIToolInterface::on_pushButton_browseModel_clicked()
{QString modelPath = QFileDialog::getOpenFileName(this,"选择ONNX模型文件","./Bin/x64/Models/","ONNX Files (*.onnx);;All Files (*)");if (!modelPath.isEmpty()) {ui->lineEdit_modelPath->setText(modelPath);logMessage("已选择模型文件: " + modelPath);}
}void AIToolInterface::on_pushButton_loadModel_clicked()
{QString modelPath = ui->lineEdit_modelPath->text();if (modelPath.isEmpty()) {QMessageBox::warning(this, "警告", "请先选择模型文件路径");return;}// 检查文件是否存在QFileInfo fileInfo(modelPath);if (!fileInfo.exists()) {QMessageBox::critical(this, "错误", "模型文件不存在: " + modelPath);return;}try {// 创建YOLO模型实例if (m_yoloModel) {delete m_yoloModel;}m_yoloModel = new Yolov8SegOnnx();// 加载模型logMessage("正在加载模型...");bool success = m_yoloModel->ReadModel(modelPath.toStdString(), false, 0, false);if (success) {m_modelLoaded = true;ui->label_status->setText("状态: 模型已加载");ui->label_status->setStyleSheet("color: green;");ui->pushButton_test->setEnabled(true);logMessage("模型加载成功!");} else {m_modelLoaded = false;ui->label_status->setText("状态: 模型加载失败");ui->label_status->setStyleSheet("color: red;");ui->pushButton_test->setEnabled(false);logMessage("模型加载失败!");delete m_yoloModel;m_yoloModel = nullptr;}} catch (const std::exception& e) {m_modelLoaded = false;ui->label_status->setText("状态: 模型加载异常");ui->label_status->setStyleSheet("color: red;");ui->pushButton_test->setEnabled(false);logMessage("模型加载异常: " + QString(e.what()));if (m_yoloModel) {delete m_yoloModel;m_yoloModel = nullptr;}}
}void AIToolInterface::on_pushButton_browseImage_clicked()
{QString imagePath = QFileDialog::getOpenFileName(this,"选择图片文件","./Bin/x64/Pic/","Image Files (*.jpg *.jpeg *.png *.bmp);;All Files (*)");if (!imagePath.isEmpty()) {ui->lineEdit_imagePath->setText(imagePath);m_currentImagePath = imagePath;// 加载并显示图片m_currentImage = cv::imread(imagePath.toStdString());if (m_currentImage.empty()) {QMessageBox::warning(this, "警告", "无法加载图片: " + imagePath);logMessage("图片加载失败: " + imagePath);return;}// 检查图片是否有效if (m_currentImage.rows <= 0 || m_currentImage.cols <= 0) {QMessageBox::warning(this, "警告", "图片尺寸无效: " + imagePath);logMessage("图片尺寸无效: " + imagePath);m_currentImage = cv::Mat();return;}logMessage(QString("已加载图片: %1 (尺寸: %2x%3)").arg(imagePath).arg(m_currentImage.cols).arg(m_currentImage.rows));displayImage(m_currentImage, ui->label_originalImage, "原始图片");}
}void AIToolInterface::on_pushButton_test_clicked()
{if (!m_modelLoaded || !m_yoloModel) {QMessageBox::warning(this, "警告", "请先加载模型");logMessage("检测失败: 模型未加载");return;}if (m_currentImage.empty()) {QMessageBox::warning(this, "警告", "请先选择图片");logMessage("检测失败: 未选择图片");return;}// 额外检查图片有效性if (m_currentImage.rows <= 0 || m_currentImage.cols <= 0) {QMessageBox::warning(this, "警告", "当前图片无效,请重新选择");logMessage("检测失败: 当前图片无效");return;}try {logMessage("开始检测...");// 执行检测std::vector<OutputParams> results;bool success = m_yoloModel->OnnxDetect(m_currentImage, results);if (success) {logMessage(QString("检测完成,发现 %1 个目标").arg(results.size()));qDebug()<<"准备绘制结果";// 绘制检测结果cv::Mat resultImage = drawDetectionResult(m_currentImage, results);qDebug()<<"绘制结果完成";cv::imwrite("D:/OtherFiles/QTFile/AI_Solder/AI_Solder_v0/Bin/x64/Pic/result.jpg",resultImage);// 显示结果displayImage(resultImage, ui->label_resultImage, "检测结果");qDebug()<<"显示结果完成";// 输出检测详情for (size_t i = 0; i < results.size(); ++i) {const auto& result = results[i];QString className = QString::fromStdString(m_yoloModel->_className[result.id]);logMessage(QString("目标 %1: %2, 置信度: %3, 位置: (%4,%5,%6,%7)").arg(i + 1).arg(className).arg(result.confidence, 0, 'f', 3).arg(result.box.x).arg(result.box.y).arg(result.box.width).arg(result.box.height));}} else {logMessage("检测失败!");QMessageBox::warning(this, "错误", "检测失败");}} catch (const std::exception& e) {logMessage("检测异常: " + QString(e.what()));QMessageBox::critical(this, "错误", "检测过程中发生异常: " + QString(e.what()));}
}//检测模型加载---
void AIToolInterface::on_pushButton_browseModel_2_clicked()
{QString modelPath = QFileDialog::getOpenFileName(this,"选择ONNX模型文件","./Bin/x64/Models/","ONNX Files (*.onnx);;All Files (*)");if (!modelPath.isEmpty()) {ui->lineEdit_modelPath_2->setText(modelPath);logMessage("已选择模型文件: " + modelPath);}
}void AIToolInterface::on_pushButton_browseImage_2_clicked()
{QString imagePath = QFileDialog::getOpenFileName(this,"选择图片文件","./Bin/x64/Pic/","Image Files (*.jpg *.jpeg *.png *.bmp);;All Files (*)");if (!imagePath.isEmpty()) {ui->lineEdit_imagePath_2->setText(imagePath);m_currentImagePath2 = imagePath;// 加载并显示图片m_currentImage2 = cv::imread(imagePath.toStdString());if (m_currentImage2.empty()) {QMessageBox::warning(this, "警告", "无法加载图片: " + imagePath);logMessage("图片加载失败: " + imagePath);return;}// 检查图片是否有效if (m_currentImage2.rows <= 0 || m_currentImage2.cols <= 0) {QMessageBox::warning(this, "警告", "图片尺寸无效: " + imagePath);logMessage("图片尺寸无效: " + imagePath);m_currentImage2 = cv::Mat();return;}logMessage(QString("已加载图片: %1 (尺寸: %2x%3)").arg(imagePath).arg(m_currentImage2.cols).arg(m_currentImage2.rows));displayImage(m_currentImage2, ui->label_originalImage, "原始图片");}
}void AIToolInterface::on_pushButton_loadModel_2_clicked()
{QString modelPath = ui->lineEdit_modelPath_2->text();if (modelPath.isEmpty()) {QMessageBox::warning(this, "警告", "请先选择模型文件路径");return;}// 检查文件是否存在QFileInfo fileInfo(modelPath);if (!fileInfo.exists()) {QMessageBox::critical(this, "错误", "模型文件不存在: " + modelPath);return;}try {// 创建YOLO模型实例if (m_yoloModel2) {delete m_yoloModel2;}m_yoloModel2 = new Yolov8Onnx();qDebug()<<"实例化检测模型";// 加载模型logMessage("正在加载模型...");bool success = m_yoloModel2->ReadModel(modelPath.toStdString(), false, 0, false);if (success) {m_modelLoaded2 = true;ui->label_status_2->setText("状态: 模型已加载");ui->label_status_2->setStyleSheet("color: green;");ui->pushButton_test_2->setEnabled(true);logMessage("模型加载成功!");} else {m_modelLoaded2 = false;ui->label_status_2->setText("状态: 模型加载失败");ui->label_status_2->setStyleSheet("color: red;");ui->pushButton_test_2->setEnabled(false);logMessage("模型加载失败!");delete m_yoloModel2;m_yoloModel2 = nullptr;}} catch (const std::exception& e) {m_modelLoaded2 = false;ui->label_status_2->setText("状态: 模型加载异常");ui->label_status_2->setStyleSheet("color: red;");ui->pushButton_test_2->setEnabled(false);logMessage("模型加载异常: " + QString(e.what()));if (m_yoloModel2) {delete m_yoloModel2;m_yoloModel2 = nullptr;}}
}void AIToolInterface::on_pushButton_test_2_clicked()
{if (!m_modelLoaded2 || !m_yoloModel2) {QMessageBox::warning(this, "警告", "请先加载模型");logMessage("检测失败: 模型未加载");return;}if (m_currentImage2.empty()) {QMessageBox::warning(this, "警告", "请先选择图片");logMessage("检测失败: 未选择图片");return;}// 额外检查图片有效性if (m_currentImage2.rows <= 0 || m_currentImage2.cols <= 0) {QMessageBox::warning(this, "警告", "当前图片无效,请重新选择");logMessage("检测失败: 当前图片无效");return;}try {logMessage("开始检测...");// 执行检测std::vector<OutputParams> results;bool success = m_yoloModel2->OnnxDetect(m_currentImage2, results);if (success) {logMessage(QString("检测完成,发现 %1 个目标").arg(results.size()));qDebug()<<"准备绘制结果";// 绘制检测结果 - 使用专门的目标检测绘制函数cv::Mat resultImage = drawDetectionResult2(m_currentImage2, results);qDebug()<<"绘制结果完成";cv::imwrite("D:/OtherFiles/QTFile/AI_Solder/AI_Solder_v0/Bin/x64/Pic/result2.jpg",resultImage);// 显示结果displayImage(resultImage, ui->label_DetecResult, "检测结果");qDebug()<<"显示结果完成";// 输出检测详情for (size_t i = 0; i < results.size(); ++i) {const auto& result = results[i];QString className = QString::fromStdString(m_yoloModel2->_className[result.id]);logMessage(QString("目标 %1: %2, 置信度: %3, 位置: (%4,%5,%6,%7)").arg(i + 1).arg(className).arg(result.confidence, 0, 'f', 3).arg(result.box.x).arg(result.box.y).arg(result.box.width).arg(result.box.height));}} else {logMessage("检测失败!");QMessageBox::warning(this, "错误", "检测失败");}} catch (const std::exception& e) {logMessage("检测异常: " + QString(e.what()));QMessageBox::critical(this, "错误", "检测过程中发生异常: " + QString(e.what()));}
}//日志打印
void AIToolInterface::logMessage(const QString& message)
{QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");ui->textEdit_log->append(QString("[%1] %2").arg(timestamp, message));// 自动滚动到底部QTextCursor cursor = ui->textEdit_log->textCursor();cursor.movePosition(QTextCursor::End);ui->textEdit_log->setTextCursor(cursor);
}void AIToolInterface::displayImage(const cv::Mat& image, QLabel* label, const QString& text)
{if (image.empty()) {label->setText(text.isEmpty() ? "无图片" : text);return;}// 转换为QImageQImage qimg = cvMatToQImage(image);// 缩放图片以适应标签大小QPixmap pixmap = QPixmap::fromImage(qimg);QPixmap scaledPixmap = pixmap.scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);label->setPixmap(scaledPixmap);label->setAlignment(Qt::AlignCenter);
}
//绘制分割结果--:在黑色背景图像上绘制分割掩膜
cv::Mat AIToolInterface::drawDetectionResult(const cv::Mat& image, const std::vector<OutputParams>& results)
{// 创建黑色背景图片cv::Mat resultImage = cv::Mat::zeros(image.size(), CV_8UC3);qDebug()<<"绘制1111111111111111";// 定义颜色// 随机数生成器初始化static std::mt19937 rng(std::time(0));static std::uniform_int_distribution<int> dist(50, 205); // 避免太暗或太亮的颜色// 颜色缓存(避免重复生成)static std::unordered_map<int, cv::Scalar> colorMap;// 创建累积掩码,用于收集所有目标的掩码cv::Mat accumulatedMask = cv::Mat::zeros(image.size(), CV_8UC3);for (const auto& result : results) {// 自动生成或获取颜色if (colorMap.find(result.id) == colorMap.end()) {// 生成高对比度颜色(确保在图像中可见)colorMap[result.id] = cv::Scalar(dist(rng),       // Bdist(rng),       // Gdist(rng)        // R);}cv::Scalar color = colorMap[result.id];// // 绘制边界框---可选// if (result.box.area() > 0) {//     cv::rectangle(resultImage, result.box, color, 2);//     // 绘制标签//     std::string className = m_yoloModel->_className[result.id];//     std::string label = className + ":" + std::to_string(result.confidence);//     qDebug()<<"绘制3333333333333";//     int baseline = 0;//     cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseline);//     qDebug()<<"绘制44444444444444";//     cv::Point textPos(result.box.x, result.box.y - 5);//     if (textPos.y < labelSize.height) {//         textPos.y = result.box.y + labelSize.height;//     }//     qDebug()<<"绘制55555555555555";//     cv::putText(resultImage, label, textPos, cv::FONT_HERSHEY_SIMPLEX, 0.5, color, 1);// }// 绘制分割掩码if (result.boxMask.rows > 0 && result.boxMask.cols > 0) {cv::Mat mask = result.boxMask.clone();// 创建一个与原始图像相同尺寸的掩码cv::Mat fullMask = cv::Mat::zeros(image.size(), CV_8UC1);// 将小掩码复制到正确的位置cv::Rect roi = result.box;if (roi.x >= 0 && roi.y >= 0 &&roi.x + roi.width <= fullMask.cols &&roi.y + roi.height <= fullMask.rows) {mask.copyTo(fullMask(roi));}// 转换为彩色掩码cv::Mat coloredMask;cv::cvtColor(fullMask, coloredMask, cv::COLOR_GRAY2BGR);qDebug()<<"绘制6666666666666";// 应用颜色coloredMask.setTo(color, fullMask);qDebug()<<"绘制77777777777777";// 将当前掩码累积到总掩码上cv::add(accumulatedMask, coloredMask, accumulatedMask);qDebug()<<"绘制888888888888";}}// 最后将累积的掩码叠加到结果图像上cv::addWeighted(resultImage, 1.0, accumulatedMask, 1, 0, resultImage);return resultImage;
}//绘制目标检测结果--:在原图上直接绘制边界框和置信度
cv::Mat AIToolInterface::drawDetectionResult2(const cv::Mat& image, const std::vector<OutputParams>& results)
{// 克隆原图,避免修改原始图像cv::Mat resultImage = image.clone();// 随机数生成器初始化static std::mt19937 rng(std::time(0));static std::uniform_int_distribution<int> dist(50, 205); // 避免太暗或太亮的颜色// 颜色缓存(避免重复生成)static std::unordered_map<int, cv::Scalar> colorMap;for (const auto& result : results) {// 自动生成或获取颜色if (colorMap.find(result.id) == colorMap.end()) {// 生成高对比度颜色(确保在图像中可见)colorMap[result.id] = cv::Scalar(dist(rng),       // Bdist(rng),       // Gdist(rng)        // R);}cv::Scalar color = colorMap[result.id];// 绘制边界框if (result.box.area() > 0) {// 绘制矩形框cv::rectangle(resultImage, result.box, color, 2);// 绘制标签背景std::string className = m_yoloModel2->_className[result.id];std::string label = className + ":" + std::to_string(result.confidence);int baseline = 0;cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 1, 4, &baseline);// 计算标签位置cv::Point textPos(result.box.x, result.box.y - 5);if (textPos.y < labelSize.height) {textPos.y = result.box.y + labelSize.height;}// // 绘制标签背景矩形// cv::Rect labelRect(textPos.x - 2, textPos.y - labelSize.height - 2,//                  labelSize.width + 4, labelSize.height + 4);// cv::rectangle(resultImage, labelRect, color, -1); // 填充矩形// 绘制标签文字(白色)cv::putText(resultImage, label, textPos, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 255), 4);}}return resultImage;
}QImage AIToolInterface::cvMatToQImage(const cv::Mat& mat)
{if (mat.type() == CV_8UC3) {// BGR to RGBcv::Mat rgb;cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);QImage img((uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);return img.copy();} else if (mat.type() == CV_8UC1) {// GrayscaleQImage img((uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);return img.copy();} else {return QImage();}
}
void AIToolInterface::Recv_Img(const QPixmap &p){}

效果图:

在这里插入图片描述
在这里插入图片描述
更多源码私信获取

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

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

相关文章

【java实现一个接口多个实现类通用策略模式】

java实现同个接口多个实现类通用策略模式 项目业务中&#xff0c;有多个平台&#xff0c;多个平台直接有相同的业务&#xff0c;只有一个接口入口&#xff0c;但是 不同的平台入口&#xff0c;虽然接口相同&#xff0c;参数相同&#xff0c;但是各自的具体实现不同&#xff0c;…

leetcode-139. 单词拆分-C

暴力回溯回溯过程就是一个决策树模型&#xff0c;从所有选择中找到合适的继续&#xff0c;否则回到上一级继续。该方法思路简单&#xff0c;时间复杂度过高&#xff0c;大概1/4的用例超时。 bool backtrack(char *s, int cur, char** wordDict, int wordDictSize) {// 基线条件…

《彩色终端》诗解——ANSI 艺术解码(DeepSeek)

AIi诗解通吾灵&#xff0c;直抄原文享分玲。 笔记模板由python脚本于2025-08-18 23:35:59创建&#xff0c;本篇笔记适合喜欢诗&代码的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Python官网…

抓包工具tcpdump详细指南

目录 1. 核心功能与特性 2. 关键参数速查表 3. 基础命令 3.1 协议/端口过滤 3.2 IP 地址过滤 3.3 高级逻辑组合 3.4 控制输出详细度 3.5 解析包内容 3.6 特殊包过滤 3.7 限制抓包数量 3.8 过滤特定大小包 3.9 过滤提升性能 ​​​​​​3.10 多网卡绑定 3.11 高级…

三高架构杂谈

我们的秒杀请求到了tomcat之后&#xff0c;我整个请求到了后端&#xff0c;我们怎么抗住高并发 也就是让他1s抗住10w的订单量&#xff0c;该怎么做 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>…

后端通用基础代码

后端通用基础代码 通用基础代码是指&#xff1a;“无论在任何后端项目中&#xff0c;都可以复用的代码。这种代码一般 “一辈子只用写一次” &#xff0c;了解作用之后复制粘贴即可&#xff0c;无需记忆。 目录结构如下&#xff1a;1、自定义异常 自定义错误码&#xff0c;对错…

基于51单片机WIFI心率计脉搏体温测量仪APP设计

1 系统功能介绍 本设计基于 STC89C52 单片机&#xff0c;结合 脉搏传感器、温度传感器 DS18B20、LCD1602 液晶显示器、WiFi 模块 等外设&#xff0c;构建了一个 WiFi 心率计脉搏体温测量仪 APP 系统。系统能够实现对人体心率与体温的实时采集、处理、显示和远程上传&#xff0c…

从零到一构建企业级GraphRAG系统:GraphRag.Net深度技术解析

当RAG遇上知识图谱&#xff0c;会碰撞出怎样的火花&#xff1f;本文将带你深入探索GraphRag.Net这个开源项目&#xff0c;看看如何用.NET技术栈打造一个企业级的图谱增强检索系统。 引言&#xff1a;为什么我们需要GraphRAG&#xff1f; 在AI大模型时代&#xff0c;RAG&#x…

前端Element-plus的选择器 el-select 清空内容时,后端对应的更新方式,支持更新为null

1、所属小类选择器 el-select 清空内容时&#xff0c;前端通过事件设置为空字符串clear"handleSmallCategoryClear"【所属小类选择器】只能选择&#xff0c;不能输入信息<script setup lang"ts" name"QualityFileInfoDialog"> ...... // 所…

【笔记】和各大AI大语言模型合作写项目—slirp.go

最近和各大AI大语言模型一起合作写了个小项目&#xff0c;让大家看看AI离取代人类还差多远。 开发大家都在一个共享环境下&#xff0c;连docker都不能运行&#xff0c;rootless也没有。不过好在linux环境&#xff0c;弄个proot能apt或者yum install自由&#xff0c;但是诸如pod…

国标:开展环境卫生满意度调查

随着社会的进步和人们生活水平的提高&#xff0c;&#xff08;满意度调查&#xff09;&#xff08;问卷调查&#xff09;&#xff08;第三方市场咨询公司&#xff09;对生活品质的追求以及对环境保护的重视已经成为了当下社会的主旋律。在这样的背景下&#xff0c;环境卫生问题…

【办公类-54-08】20250902 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)根据新Excel模版,标题增加园区、空姓名行填充灰色

背景需求: 之前做了优化过的点名册 【办公类-54-07】20250901 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)-CSDN博客文章浏览阅读984次,点赞27次,收藏29次。【办公类-54-07】20250901 202学年第一学期班级点名册模版(双休国定假…

【C++知识杂记1】智能指针及其分类

智能指针&#xff08;smart pointer&#xff09; 是 C11 引入的一类 模板类&#xff0c;用来封装原始指针&#xff0c;自动管理堆内存的生命周期&#xff0c;避免出现 内存泄漏 和 悬空指针&#xff08;野指针&#xff09; 的问题。 当智能指针对象离开作用域时&#xff0c;它会…

vue从入门到精通:搭建第一个vue项目

目录 Vue是什么 一、nodejs安装 二、安装Vue CLI 三、创建Vue项目 四、配置vue.config.js文件 五、创建第一个应用hello word Vue是什么 Vue是一款‌用于构建用户界面的 JavaScript 渐进式架构‌既可作为库(仅关注视图层)也可扩展为框架,支持从静态页面到复杂单页应用…

C# Queue源码分析

Queue<T> 是 .NET 中实现队列&#xff08;先进先出&#xff09;的一种泛型集合类。它基于数组实现&#xff0c;支持动态扩容、线程不安全&#xff0c;适用于大多数需要队列结构的场景。一、类结构与字段说明 public class Queue<T> : IEnumerable<T>, IColle…

微服务之注册中心与ShardingSphere关于分库分表的那些事

小伙伴们&#xff0c;你们好呀&#xff01;我是老寇&#xff01;跟我一起学习注册中心与ShardingSphere怎么一起使用 使用 nacos-shardingsphere例子&#xff0c;请点击我 注意&#xff1a;需要自己提前创建数据库和表 create database kcloud_platform_test;DROP TABLE IF…

python遇到异常流程

在 Python 中&#xff0c;程序遇到异常时的退出行为取决于是否对异常进行了捕获和处理&#xff1a;未捕获的异常&#xff1a; 如果异常发生后没有被 try-except 语句捕获&#xff0c;程序会立即终止&#xff0c;并返回一个非零的退出码&#xff08;通常是 1&#xff09;&#x…

【开源大模型和闭源大模型分别有哪些?两者的对比?部署私有化模型的必要性有哪些?】

以下是关于开源与闭源大模型的详细对比及私有化部署必要性的分析&#xff0c;结合最新行业动态和技术趋势&#xff1a;一、开源 vs 闭源大模型代表列表 1. 开源大模型&#xff08;2024年主流&#xff09;模型名称参数量机构特点LLaMA-38B-70BMeta商业使用需授权&#xff0c;多语…

SpringBoot--JWT

一、JWT 的简单了解1. 什么是 JWT&#xff1f;JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在 各方之间安全地传输信息。它基于 JSON 格式&#xff0c;信息通过 数字签名 的方式保证不可篡改&#xff0c;常用于 …

OpenTelemetry、Jaeger 与 Zipkin:分布式链路追踪方案对比与实践

OpenTelemetry、Jaeger 与 Zipkin&#xff1a;分布式链路追踪方案对比与实践 问题背景介绍 随着微服务架构的普及&#xff0c;服务之间调用链路变得异常复杂&#xff0c;单一服务故障或性能瓶颈往往牵一发动全身。分布式链路追踪&#xff08;Distributed Tracing&#xff09;能…