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

pytorch软件封装

封装代码,通过传入文件名,即可输出类别信息

上一章节,我们做了关于动物图像的分类,接下来我们把程序封装,然后进行预测。

单张图片的predict文件

predict.py

'''按着路径,导入单张图片做预测
'''
from torchvision.models import resnet18
import torch
import torchvision.transforms as transforms
from torch.autograd import Variable
import torch.nn as nn
import cv2 as cv
import os
import numpy as np'''加载图片与格式转化
'''# 图片标准化
transform_BZ = transforms.Normalize(mean=[0.5062653, 0.46558657, 0.37899864],  # 取决于数据集std=[0.22566116, 0.20558165, 0.21950442]
)img_size = 224
val_tf = transforms.Compose([  ##简单把图片压缩了变成Tensor模式transforms.ToPILImage(),  # 将numpy数组转换为PIL图像transforms.Resize((img_size, img_size)),transforms.ToTensor(),transform_BZ  # 标准化操作
])def cv_imread(file_path):cv_img = cv.imdecode(np.fromfile(file_path, dtype=np.uint8), cv.IMREAD_COLOR)return cv_imgdef predict(img_path):'''获取标签名字'''# # 增加类别标签# dir_names = []# for root, dirs, files in os.walk("dataset"):#     if dirs:#         dir_names = dirs# 将输出保存到exel中,方便后续分析label_names = ['cat', 'chicken', 'cow', 'dog', 'duck','goldfish', 'lion', 'pig', 'sheep','snake']# 指定设备device = "cuda" if torch.cuda.is_available() else "cpu"print(f"Using {device} device")"""加载模型"""model = resnet18(weights=None)num_ftrs = model.fc.in_features  # 获取全连接层的输入model.fc = nn.Linear(num_ftrs, 10)  # 全连接层改为不同的输出torch_data = torch.load('./logs_resnet18_adam/best.pth',map_location=torch.device(device))model.load_state_dict(torch_data)model.to(device)'''读取图片'''img = cv_imread(img_path)img = cv.cvtColor(img, cv.COLOR_BGR2RGB)img_tensor = val_tf(img)# 增加batch_size维度img_tensor = Variable(torch.unsqueeze(img_tensor, dim=0).float(),requires_grad=False).to(device)'''数据输入与模型输出转换'''model.eval()with torch.no_grad():output_tensor = model(img_tensor)# 将输出通过softmax变为概率值output = torch.softmax(output_tensor, dim=1)# 输出可能性最大的那位pred_value, pred_index = torch.max(output, 1)# 将数据从cuda转回cpuif torch.cuda.is_available() == False:pred_value = pred_value.detach().cpu().numpy()pred_index = pred_index.detach().cpu().numpy()result = "预测类别为: " + str(label_names[pred_index[0]]) + " 可能性为: " + str(pred_value[0].item() * 100)[:5] + "%"return resultif __name__ == "__main__":img_path = r'dataset/cat/10.jpg'result = predict(img_path)print(result)

这里可以看出,我们用的cat数据集中的图片,预测出来的结果却是是cat,虽然可能性不是很高。

torch_data=torch.load('./logs_resnet18_adam/best.pth',map_location=torch.device(device))

使用 PyTorch 加载一个保存的模型权重文件(best.pth),并将其映射到指定的设备(device

img_tensor=Variable(torch.unsqueeze(img_tensor,dim=0).float(),requires_grad=False).to(device)

将一个图像张量(img_tensor)进行处理,使其成为适合输入到神经网络模型中的格式,并将其移动到指定的设备(CPU 或 GPU)上

1. torch.unsqueeze(img_tensor, dim=0)
  • 作用:在张量的第 0 维(即最外层)添加一个维度。

  • 背景:神经网络模型通常期望输入数据是一个四维张量,形状为 [batch_size, channels, height, width]。如果 img_tensor 是一个三维张量(例如 [channels, height, width]),则需要在第 0 维添加一个维度,使其形状变为 [1, channels, height, width],其中 1 表示批量大小(batch_size)为 1。

2. .float()
  • 作用:将张量的数据类型转换为 float32

  • 背景:许多神经网络模型在训练和推理时使用 float32 数据类型。如果 img_tensor 的数据类型不是 float32,则需要显式转换。

3. Variable(..., requires_grad=False)
  • 作用:将张量封装为 Variable 对象,并设置 requires_grad 属性。

  • 背景

    • Variable 是 PyTorch 中的一个旧类,用于封装张量并支持自动求导。在较新的 PyTorch 版本中,Variable 已经与 Tensor 合并,因此这一步在现代代码中通常是多余的。

    • requires_grad=False 表示这个张量不需要计算梯度。这在推理阶段非常常见,因为输入数据不需要参与梯度计算。

转成ONNX,兼容各种设备

ONNX是什么?

ONNX(Open Neural Network Exchange)是一种开放的神经网络交换格式,它为深度学习模型提供了一种标准化的表示方式,使得模型可以在不同的深度学习框架之间进行转换和共享。

ONNX的作用是什么?

  • 模型转换:开发者可以将训练好的模型从一个框架(如PyTorch)转换为ONNX格式,然后在另一个框架(如TensorFlow)中加载和使用。这使得开发者可以在不同的框架之间灵活切换,利用不同框架的优势。

  • 模型部署:ONNX模型可以被导出到多种推理引擎,如ONNX Runtime。ONNX Runtime是一个高性能的推理引擎,支持多种硬件平台(如CPU、GPU、FPGA等),可以用于将模型部署到生产环境中。

  • 模型优化:通过ONNX,开发者可以对模型进行优化和量化等操作。例如,可以将模型从浮点数量化为整数,以提高模型的推理速度和降低存储需求。

import torch
from torch import nn
from torchvision.models import resnet18
# pip install onnx
# pip install onnxruntimeif __name__ == '__main__':# 指定设备device = "cuda" if torch.cuda.is_available() else "cpu"print(f"Using {device} device")# 指定模型model = resnet18(pretrained=False)num_ftrs = model.fc.in_features    # 获取全连接层的输入model.fc = nn.Linear(num_ftrs, 10)  # 全连接层改为不同的输出# 模型加载权重torch_data = torch.load('logs_resnet18_pretrain/best.pth',map_location=torch.device(device))model.load_state_dict(torch_data)model.to(device)# 创建一个示例输入dummy_input = torch.randn(1,3,224,224, device=device)# 指定输出文件路径onnx_file_path = "logs_resnet18_pretrain/model.onnx"# 导出onnxtorch.onnx.export(model, dummy_input, onnx_file_path,verbose=True,  # 屏幕中打印日志信息input_names=['input'],output_names=['output'])print("Model Exported Success")

Netron模型可视化

NETRON查看网络结构

如何下载可以看这篇文章网络可视化工具netron安装流程-CSDN博客

下载过后打开文件

ONNX单张图片预测

# -*- coding: utf-8 -*-
'''按着路径,导入单张图片做预测
'''
import onnxruntime as ort  # pip install onnxruntime onnx
import numpy as np
import torchvision.transforms as transforms
import cv2 as cv
import osdef softmax(x):e_x = np.exp(x - np.max(x))return e_x / e_x.sum(axis=1, keepdims=True)def cv_imread(file_path):cv_img = cv.imdecode(np.fromfile(file_path, dtype=np.uint8), cv.IMREAD_COLOR)return cv_imgdef predict(img_path):'''获取标签名字'''# dir_names = []# for root, dirs, files in os.walk("dataset"):#     if dirs:#         dir_names = dirs# label_names = dir_nameslabel_names = ['cat', 'chicken', 'cow', 'dog', 'duck','goldfish', 'lion', 'pig', 'sheep','snake']'''加载图片与格式转化'''# 图片标准化transform_BZ = transforms.Normalize(mean=[0.5062653, 0.46558657, 0.37899864],  # 取决于数据集std=[0.22566116, 0.20558165, 0.21950442])img_size = 224val_tf = transforms.Compose([  # 简单把图片压缩了变成Tensor模式transforms.ToPILImage(),  # 将numpy数组转换为PIL图像transforms.Resize((img_size, img_size)),transforms.ToTensor(),transform_BZ  # 标准化操作])# 读取图片img = cv_imread(img_path)img = cv.cvtColor(img, cv.COLOR_BGR2RGB)img_tensor = val_tf(img)# 将图片转换为ONNX运行时所需的格式img_numpy = img_tensor.numpy()img_numpy = np.expand_dims(img_numpy, axis=0)  # 增加batch_size维度# 加载ONNX模型onnx_model_path = r'logs_resnet18_pretrain/model.onnx'  # 替换为ONNX模型的路径ort_session = ort.InferenceSession(onnx_model_path)# 运行ONNX模型outputs = ort_session.run(None, {'input': img_numpy})output = outputs[0]# 应用softmaxprobabilities = softmax(output)# 获得预测结果pred_index = np.argmax(probabilities, axis=1)pred_value = probabilities[0][pred_index[0]]result = "预测类别为: " + str(label_names[pred_index[0]]) + " 可能性为: " + str(pred_value * 100)[:5] + "%"return resultif __name__ == "__main__":img_path = r'dataset/cat/10.jpg'result = predict(img_path)print(result)

这个没什么好讲的,就是可以直接封装成了一个onnx,可以不用安装pytorch库

PyQt5做预测模型

接下来先请大家准备一些库,看一看下面这篇文章PyCharm配置外部工具PyQtDesigner、PyUIC、Pyrcc_pycharm外部工具-CSDN博客

我把所有的文件封装了一下,大家要记得改一改路径

main_one_thread,py

# -*- coding: utf-8 -*-
from mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import *
from predict封装 import predictclass UiMain(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(UiMain, self).__init__(parent)self.setupUi(self)self.fileBtn.clicked.connect(self.loadImage)# 打开文件功能def loadImage(self):self.fname, _ = QFileDialog.getOpenFileName(self, '请选择图片','.','图像文件(*.jpg *.jpeg *.png)')if self.fname:print(self.fname)self.Infolabel.setText("文件打开成功\n"+self.fname)jpg = QtGui.QPixmap(self.fname).scaled(self.Imglabel.width(),self.Imglabel.height())self.Imglabel.setPixmap(jpg)result = predict(self.fname)self.Infolabel.setText(result)else:# print("打开文件失败")self.Infolabel.setText("打开文件失败")if __name__ == '__main__':app = QApplication(sys.argv)ui = UiMain()ui.show()sys.exit(app.exec_())

运行结果

但是这个文件如果打包,别人不一定能用

main_one_thread_onnx.py

from mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import *
from predict_onnx import predictclass UiMain(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(UiMain, self).__init__(parent)self.setupUi(self)self.fileBtn.clicked.connect(self.loadImage)# 打开文件功能def loadImage(self):self.fname, _ = QFileDialog.getOpenFileName(self, '请选择图片','.','图像文件(*.jpg *.jpeg *.png)')if self.fname:print(self.fname)self.Infolabel.setText("文件打开成功\n"+self.fname)jpg = QtGui.QPixmap(self.fname).scaled(self.Imglabel.width(),self.Imglabel.height())self.Imglabel.setPixmap(jpg)result = predict(self.fname)self.Infolabel.setText(result)else:# print("打开文件失败")self.Infolabel.setText("打开文件失败")if __name__ == '__main__':app = QApplication(sys.argv)ui = UiMain()ui.show()sys.exit(app.exec_())

相关文章:

pytorch软件封装

封装代码,通过传入文件名,即可输出类别信息 上一章节,我们做了关于动物图像的分类,接下来我们把程序封装,然后进行预测。 单张图片的predict文件 predict.py 按着路径,导入单张图片做预测from torchvis…...

DAY02:【pytorch】计算图与动态图机制

一、引言 在深度学习框架中,计算图是理解自动求导和模型优化的核心概念。无论是PyTorch的动态图机制,还是TensorFlow早期的静态图模式,计算图都扮演着关键角色。本文将深入解析计算图的基本原理,并结合PyTorch代码演示动态图的运…...

基于元学习(Meta-Learning)的恶意流量检测

元学习(Meta-Learning),即“学会学习”(Learning to Learn),通过让模型从多个相关任务中提取通用知识,实现对新任务的快速适应。在恶意流量检测领域,元学习的核心价值在于从少量攻击样本中泛化出检测规则,尤其适用于新型攻击、定向APT攻击等数据稀缺场景。 一、元学习…...

JavaScript:游戏开发的利器

在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...

玩转Docker | 使用Docker搭建pinry图片展示系统

玩转Docker | 使用Docker搭建pinry图片展示系统 前言一、Pinry介绍Pinry 简介Pinry 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署pinry服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问pinry应用五、pinry基本使用5.1 注册pinry账号…...

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额——前端篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读385次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

企业信息化-系统架构师(九十八)

1在对一个软件系统进行设计与确认后,需要进行架构复审,架构复审目的标识潜在风险,及早发现架构的缺陷和漏洞,在架构复审过程中,主要由()决定架构满足需求,质量需求是否在设计中体现。…...

【C++算法】54.链表_合并 K 个升序链表

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 23. 合并 K 个升序链表 题目描述: 解法 解法一:暴力解法 每个链表的平均长度为n,有k个链表,时间复杂度O(nk^2) 合并两个有序…...

阿里云CDN应对DDoS攻击策略

阿里云CDN遭遇DDoS攻击时,可通过以下综合措施进行应对,保障服务的稳定性和可用性: 1. 启用阿里云DDoS防护服务 阿里云提供专业的DDoS防护服务,通过流量清洗中心过滤恶意流量,确保合法请求正常传输。该服务支持按需选…...

MySQL8的索引跳跃扫描原理

#MySQL 8 的索引跳跃扫描(Index Skip Scan)原理 1. 什么是索引跳跃扫描?索引跳跃扫描(Index Skip Scan)是 MySQL 8.0.13 引入的一种优化技术,允许在某些情况下跳过联合索引的最左前缀字段,仍然…...

centos 启动nginx 服务器

✅ 如果你是通过 yum 安装的 Nginx(推荐方式): 🔹 启动 Nginx: sudo systemctl start nginx 🔹 设置开机自启(建议开启): sudo systemctl enable nginx &#x1f53…...

格式化输出

% 符号相关 数据类型代码 %s:字符串 示例:print("名字是 %s" % "Tom") → 名字是 Tom%c:字符/ASCII码 示例:print("%c" % 65) → A%d/%i:有符号整数 示例:print("年龄…...

[leetcode]动态规划:斐波那契数列

一.线性dp 1.0什么是线性dp 线性DP就是指状态的转移具有线性递推关系&#xff0c;每个状态只依赖之前的状态&#xff0c;按照线性顺序一步步递推下去。 1.1斐波那契数列问题 #include <iostream> #include <vector> using namespace std; int main() { in…...

HackMyVM - todd记录

HackMyVM - toddhttps://mp.weixin.qq.com/s/E_-hepdfY-0veilL1fl2QA...

【spark认任务提交】配置优先级顺序

配置优先级顺序 Spark-submit 命令行参数 (最高优先级)代码中通过 SparkConf 设置的参数 (在应用程序中直接设置)spark-defaults.conf 文件中的配置 实际应用中的建议 固定配置&#xff1a;将集群级别的默认配置放在 spark-defaults.conf 中应用特定配置&#xff1a;将应用特…...

如何建立高效的会议机制

建立高效的会议机制需做到&#xff1a;明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中&#xff0c;明确会议目标是核心关键&#xff0c;它直接决定了会议的方向与效率。只有明确目标&#xff0c;会议才不会偏离初衷&#xff0c;…...

spark Core-RDD转换算子

1. map算子&#xff1a;对RDD中的数据逐条进行映射转换&#xff0c;可实现类型或值的转换。函数签名为 def map[U: ClassTag](f: T > U): RDD[U] 。 2. mapPartitions算子&#xff1a;以分区为单位处理数据&#xff0c;可进行任意处理。与 map 相比&#xff0c; map 是分区内…...

【图像处理】C++实现通用Raw图转Unpack14的高效方法

一、需求背景 在图像处理领域&#xff0c;我们经常需要处理各种位深的原始数据&#xff08;如Raw8、Unpack10等&#xff09;。某些高端相机或传感器会输出14位精度的图像数据&#xff0c;但受传输限制&#xff0c;实际存储时可能采用低位深打包。本文将实现一个通用转换函数&a…...

Vue3的Composition API与React Hooks有什么异同?

Vue3的一个重大更新点就是支持Composition API&#xff0c;而且也被业界称为hooks&#xff0c;那么Vue3的“Hooks”与React的Hooks有这么区别呢&#xff1f; 一、核心相似点 1. 逻辑复用与代码组织 都解决了传统类组件或选项式 API 中逻辑分散的问题&#xff0c;允许将相关逻…...

Gerrit的安装与使用说明(Ubuntu)

#本页面按192.168.60.148服务器举例进行安装配置 1.权限配置 ## 使用root或者有sudo权限用户执行 # 创建gerrit用户 sudo useradd gerrit # 设置gerrit用户的密码 sudo passwd gerrit # 增加sudo权限 sudo visudo 在root ALL(ALL:ALL) ALL行下添加如下内容 gerrit ALL(ALL:…...

如何在Git历史中抹掉中文信息并翻译成英文

如何在Git历史中抹掉中文信息并翻译成英文 在软件开发和版本控制领域&#xff0c;维护一个清晰、一致的代码历史记录是至关重要的。然而&#xff0c;有时我们可能会遇到需要修改历史提交的情况&#xff0c;比如删除敏感信息或修正错误。本文将详细探讨如何在Git历史中抹掉中文…...

Ubuntu利用docker将ONNX模型转换为RK3588模型

1.安装docker 下载教程 1.拉取镜像 方法一&#xff1a;通过命令拉取 # 下载官方Docker镜像sudo docker pull registry.cn-hangzhou.aliyuncs.com/rockchip/rknn-toolkit2:v2.3.0 方法二&#xff1a;通过rknn-toolkit2自带的直接安装 2.开始工作 创建工作目录并复制ONNX模型…...

Go:入门

文章目录 Hello, World命令行参数找出重复行GIF动画获取一个URL并发获取多个URL一个 Web 服务器其他 Hello, World Hello world package main import "fmt" func main() {fmt.Println("Hello, 世界") }package main表明这是一个可独立执行的程序包&#…...

深入理解 ResponseBodyAdvice 及其应用

ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口&#xff0c;允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…...

SpringBoot对接火山引擎大模型api实现图片识别与分析

文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上&#xff0c;在上一篇博客&#xff0c;我们已经实现了spring ai对接本地大模型实现了聊天机器人&#xff0c;但是目前有个新…...

Java ---成员,局部变量与就近原则

成员变量 声明在类内部&#xff0c;但在方法、构造器或代码块之外的变量。 属于类的实例&#xff08;对象&#xff09;或类本身&#xff08;静态变量&#xff09;。 实例变量&#xff08;非静态成员变量&#xff09;&#xff1a; public class Person {private String name…...

基于libevent写一个服务器(附带源码)

使用libevent搭建服务器 服务器源码二级目录 使用开源框架&#xff0c;目的是减少程序员对一些精细的操作的误操作&#xff0c;也是为了让程序员能更好的对接业务而不是底层api的使用。 为何使用libevent&#xff0c;因为libevent开源已经有十几年了&#xff0c;能很好的承受数…...

2.2.3 Spark Standalone集群

搭建Spark Standalone集群需要完成多个步骤。首先&#xff0c;配置主机名、IP地址映射、关闭防火墙和SeLinux&#xff0c;并设置免密登录。接着&#xff0c;配置JDK和Hadoop环境&#xff0c;并在所有节点上分发配置。然后&#xff0c;下载并安装Spark&#xff0c;配置环境变量和…...

每天记录一道Java面试题---day38

说说类加载器双亲委派模型 回答重点 AppClassLoader的父加载器是ExtClassLoader&#xff0c;ExtClassLoader的父加载器是BootStrapClassLoader。JVM在加载一个类时&#xff0c;会调用AppClassLoader的laodClass方法来加载这个类&#xff0c;不过在这个方法中&#xff0c;会先…...

[ctfshow web入门] web33

信息收集 相较于上一题&#xff0c;这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句&#xff0c;但是$_GET[a]也是一样的 没有括号可以使用include&#xff0c;没有引号可以使用$_GET 可以参考[ctfshow web入门] web32&#xff0c;其中的所…...

【时时三省】(C语言基础)用switch语句实现多分支选择结构

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 if语句只有两个分支可供选择&#xff0c;而实际问题中常常需要用到多分支的选择。例如&#xff0c;学生成绩分类(85分以上为A等&#xff0c;70 ~ 84分为B等&#xff0c;60 ~ 69分为C等)&…...

为您的 Web 应用选择最佳文档阅读器

为显示选择合适的文档查看器是开发 Web 应用过程中至关重要的一步。文档查看器应能在提供功能性的同时&#xff0c;确保用户体验的流畅性。 开发人员必须评估多种因素&#xff0c;以确保效率、性能和兼容性。本文将帮助您了解影响用户文档浏览体验成功与否的关键指标。 渲染质…...

js逆向入门图灵爬虫练习平台第六题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNi8 观察可以发现请求头有有字段加密和响应结果加密 查看启动器 开始断点调试 直接复制里面的js内容&#xff0c;测试函数...

招商蛇口 | 回归生活本身,革新CID的143㎡改善标准

时光流转&#xff0c;城市向前。在西安这片千年文脉的沃土之上&#xff0c;招商蛇口已深耕11载&#xff0c;用21座标杆作品&#xff0c;为17000余户家庭筑就理想栖居。从曲江到高新&#xff0c;从城市更新到人居焕新&#xff0c;每一座作品都是对“美好生活承载者”使命的践行。…...

第6课:分布式多智能体系统架构

分布式多智能体系统架构&#xff1a;从算力协同到微服务部署的工程化实践 一、引言&#xff1a;当智能体规模突破百级&#xff1a;分布式架构为何成为必选项&#xff1f; 在多智能体系统&#xff08;MAS&#xff09;从“实验室Demo”走向“工业级应用”的过程中&#xff0c;传…...

Vue3 Teleport 深度解析与面试技巧

Vue3 Teleport 深度解析与面试技巧 一、Teleport 核心价值解析 1.1 诞生背景与设计哲学 DOM层级困境&#xff1a;传统组件树与视觉层级的矛盾样式污染问题&#xff1a;z-index层级管理的世纪难题逻辑解耦需求&#xff1a;业务逻辑与DOM结构的正交性要求 1.2 核心能力矩阵 能…...

断言与反射——以golang为例

断言 x.(T) 检查x的动态类型是否是T&#xff0c;其中x必须是接口值。 简单使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二个参数就是OK,这…...

react函数组件中,className字符串、style对象如何在父子组件之间传递

一、需要传递的样式在父组件的scss文件中提前写好 子组件的dom解析后&#xff1a; 二、向子组件直接传递style对象...

WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点

文章目录 适合场景基本语法示例&#xff1a;Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal&#xff1f;TypeScript 中 Portal 类型定义&#xff1f; 适合场景 React Portal 是 React 提供的一种机制&#xff0c;让你可以将子组件渲染到 DOM 的指定…...

企业绿电消纳比例不达标?安科瑞微电网智慧能源平台助力企业低碳转型

方案配置支持请联系安科瑞电气周女士 企业绿电消纳政策是国家推动能源转型和实现“双碳”目标的重要抓手&#xff0c;近年来政策体系逐步完善。企业通过建设“源网荷储”一体化项目、虚拟电厂等技术&#xff0c;提升绿电消纳能力。 一、安科瑞提供解决方案 深耕用电业务&…...

uni-app初学

文章目录 1. pages.json 页面路由2. 图标3. 全局 CSS4. 首页4.1 整体框架4.2 完整代码4.3 轮播图 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分类 uni-row、uni-col4.6 商品列表 小程序开发网址&#xff1a; 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下…...

网络划分vlan隔离

隔离划分 比如我们想要将pc1和pc2隔离&#xff0c;我们只需在lsw1交换机中&#xff0c;如下配置&#xff1a; sys 先进入系统视图 先后输入 代表创建2个隔离区 vlan 10 vlan 20 然后进入0/0/1、0/0/2设置隔离类型&#xff0c;并划分隔离区域 int gi0/0/01 port l…...

HDCP(四)

HDCP驱动开发实战深度解析 以下从协议栈架构、核心模块实现、安全设计到硬件集成&#xff0c;结合HDCP 2.x规范与主流硬件平台&#xff08;如ARM、FPGA&#xff09;特性&#xff0c;系统拆解驱动开发关键环节&#xff1a; 1. 协议栈架构与模块划分 驱动分层设计 硬件抽象层&…...

大数据(7.4)Kafka存算分离架构深度实践:解锁对象存储的无限潜能

目录 一、传统架构的存储困境与破局1.1 数据爆炸时代的存储挑战1.2 存算分离的核心价值矩阵 二、对象存储集成架构设计2.1 分层存储核心组件2.2 关键配置参数优化 三、深度集成实践方案3.1 冷热数据分层策略3.1.1 存储策略性能对比 3.2 跨云数据湖方案 四、企业级应用案例4.1 金…...

SLAM文献之SuMa++: Efficient LiDAR-based Semantic SLAM

SuMa是基于Surfel的SLAM算法SuMa的改进版本&#xff0c;通过引入语义分割信息提升动态环境下的鲁棒性和回环检测性能。以下从算法原理和公式推导两方面详细阐述&#xff1a; 一、SuMa算法原理 1. 基础&#xff1a;SuMa算法 SuMa使用Surfel&#xff08;表面元素&#xff09;构…...

react中通过 EventEmitter 在组件间传递状态

要在 Reply 组件中通过 statusChangeEvent 发送状态值&#xff0c;并在 Select 组件中接收这个状态值 status&#xff0c;你可以按照以下步骤实现&#xff1a; //Event.jsimport EventEmitter from events;export const statusChangeEvent new EventEmitter();// 工单状态切换…...

机器学习 从入门到精通 day_03

1. KNN算法-分类 1.1 样本距离判断 明可夫斯基距离&#xff1a;欧式距离&#xff0c;明可夫斯基距离的特殊情况&#xff1b;曼哈顿距离&#xff0c;明可夫斯基距离的特殊情况。 两个样本的距离公式可以通过如下公式进行计算&#xff0c;又称为欧式距离。 &#xff08;…...

WHAT - React 两个重要的 Typescript 类型:ReactNode vs JSX.Element

文章目录 ReactNode 是什么&#xff1f;示例用途 JSX.Element 是什么&#xff1f;示例用途 ReactNode vs JSX.Element 对比使用建议其他相关类型例子总结 这两个类型 ReactNode 和 JSX.Element 在 React TypeScript 中经常出现&#xff0c;但它们含义不同&#xff0c;适用场景…...

了解 DeFi:去中心化金融的入门指南与未来展望

去中心化金融&#xff0c;或 DeFi&#xff0c;代表着全球金融体系运作方式的革命性转变。它是一个总称&#xff0c;指的是一个不断增长的去中心化应用程序&#xff08;dapp&#xff09;、协议和平台生态系统&#xff0c;这些生态系统构建在公共区块链网络上&#xff0c;无需传统…...

四旋翼无人机手动模式

无人机的手动模式&#xff08;Manual Mode&#xff09;是指飞手完全通过遥控器手动控制无人机的飞行姿态、高度、方向和速度&#xff0c;‌无需依赖自动稳定系统或辅助功能‌&#xff08;如GPS定位、气压计定高、视觉避障等&#xff09;。这种模式赋予操作者最大的操控自由度&a…...