目标检测文献阅读-DETR:使用Transformer进行端到端目标检测
目录
摘要
Abstract
1 引言
2 DETR结构
2.1 Backbone
2.2 Encoder
2.3 Decoder
2.4 FFN
3 目标检测集合预测损失
3.1 二分图匹配损失
3.2 损失函数
总结
摘要
本周阅读的论文题目是《End-to-End Object Detection with Transformers》(使用Transformer进行端到端目标检测)。目前大多数目标检测方法都是两阶段的(例如R-CNN系列),需要先生成候选区域再进行分类和回归,就算是单阶段(例如YOLO系列),最后往往也要进行NMS后处理步骤来去除预测框,而本文中提出了一种将目标检测视为直接的集合预测问题的新方法DEtection TRansformer,即DETR,是基于集合的全局损失,该损失通过二分匹配和Transformer编码器-解码器体系结构来强制进行唯一预测,从而能够进行并行处理,只会输出一个预测框。并且DETR结构灵活简单,易于实施,可以轻松扩展到其他领域,例如全景分割。
Abstract
This week's paper is titled "End-to-End Object Detection with Transformers." At present, most object detection methods are two-stage (e.g., R-CNN series), which need to be formed into candidate regions and then classified and regressed, even if they are single-stage (e.g., YOLO series), and finally NMS post-processing steps are often carried out to remove the prediction box, and this paper proposes a new method that treats object detection as a direct ensemble prediction problem, DEtection TRansformer, i.e., DETR, which is based on the global loss of sets. This loss forces a unique prediction through binary matching and a Transformer encoder-decoder architecture, enabling parallel processing with only one prediction box output. And the DETR structure is flexible and simple, easy to implement, and can be easily extended to other fields, such as panoramic segmentation.
文献链接🔗:End-to-End Object Detection with Transformers
1 引言
目标检测的目标是预测每个感兴趣对象的一组边界框和类别标签。而在本文之前,现代检测器通过在大量proposal、anchor 、窗口中心上定义替代回归和分类问题,以间接方式解决预测任务,例如R-CNN系列、YOLO系列等,导致重复的框太多,需要频繁进行复杂的后处理步骤,影响了目标检测的速度。
而本文中将目标检测任务直接看成是集合预测的问题,从而简化了训练过程。DETR采用基于Transformer的编码器-解码器架构,Transformer的自注意机制明确地对序列中元素之间的所有成对相互作用进行了建模,使这些体系结构特别适合于集合预测的特定约束,例如删除重复的预测。
如下图,DETR通过将公共CNN与Transformer架构相结合,一次预测所有对象,并使用一组损失函数进行端到端训练,直接并行预测并行最终检测集。在训练期间,二分匹配唯一地分配具有地面实况框的预测,而没有匹配的预测应该产生一个“no object”类预测。
DETR主要特征有:
- Transformer (非自回归)并行解码:在解码器的部分进行并行的出框;
- 全局的二分匹配损失:在预测对象和真实对象之间执行二分匹配。
2 DETR结构
DETR的模型架构非常简单,使得它能够在几乎所有的深度学习框架下都可以实现,只要有CNN和Transformer就可以了。总体框架如下图,可以拆分为backbone、encoder、decoder和prediction heads四个部分:
- Backbone:CNN backbone学习图像的2D特征;
- Positional Encoding:将2D特征展平,并对其使用位置编码(positional encoding);
- Encoder:经过Transformer的encoder;
- Decoder:encoder的输出+object queries作为Transformer的decoder输入;
- Prediction Heads:将decoder的每个输出都送到FFN去输出检测结果。
2.1 Backbone
backebone就是一个传统的CNN模型,本文中DETR使用Imagenet预训练好的Resnet,作用是抽取图片的特征信息。
通常假设Backbone的输入初始图像 (即具有3个颜色通道,高和宽分别为
和
),则输出通道
,通常
、
、
(图像高和宽都变为了1/32)。
self.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])x = self.backbone(inputs)
H, W = x.shape[-2:]
2.2 Encoder
经过Backbone后,由于输出特征图 的
是每个 token 的维度,还是比较大,并且encoder的输入为序列,所以先经过一个
的卷积进行降维到更小的维度
,得到一个新的特征映射
,然后再输入encoder会更好。
self.conv = nn.Conv2d(2048, hidden_dim, 1) # 1×1卷积层将2048维特征降到256维x = self.backbone(inputs)
h = self.conv(x)
H, W = h.shape[-2:]
此时encoder的self-attention在特征图上进行全局分析,因为最后一个特征图对于大物体比较友好,那么在上面进行self-attention会便于网络更好的提取不同位置不同大目标之间的相互关系的联系。所以DETR在大目标上效果比Faster R-CNN好就比较容易理解到了。
self.transformer = nn.Transformer(hidden_dim, nheads, num_encoder_layers, num_decoder_layers)
由于Transformer架构是置换不变的,所以本文中用添加到每个注意层输入的固定位置编码对其进行补充。为了体现图像在 和
维度上的信息,本文中分别计算了两个维度的位置编码,然后cat 到一起:
self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))
self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))pos = torch.cat([self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),self.row_embed[:H].unsqueeze(1).repeat(1, W, 1),], dim=-1).flatten(0, 1).unsqueeze(1)
h = self.transformer(pos + h.flatten(2).permute(2, 0, 1), self.query_pos.unsqueeze(1))
2.3 Decoder
decoder同样遵循Transformer的标准架构,使用多头注意力机制和encoder-decoder注意机制转换大小为 的
个嵌入。与原始转换器的不同之处在于,本文中DETR在每个encoder层并行解码
个对象。由于encoder也是排列不变的,因此
个输入嵌入必须不同才能产生不同的结果。这些输入嵌入是学习到的位置编码,即查询对象,与encoder类似,本文中将它们添加到每个注意力层的输入中。
个查询对象由encoder转换为输出嵌入,然后通过FFN将它们独立解码为框坐标和类标签,从而产生
个最终预测。在这些嵌入上使用self-attention和encoder-decoder注意力,该模型使用它们之间的成对关系对所有对象进行全局推理,同时能够将整个图像用作上下文。
self.query_pos = nn.Parameter(torch.rand(100, hidden_dim)) # 查询对象
2.4 FFN
最后,FFN是由具有ReLU激活函数和隐藏维数 的3层感知器和一个线性投影层来计算的,或者说就是
的卷积。FFN预测框归一化的中心坐标、输入图形框的高度和宽度,然后使用softmax函数激活获得预测类标签。
self.linear_class = nn.Linear(hidden_dim, num_classes + 1) # 类别FFN
self.linear_bbox = nn.Linear(hidden_dim, 4) # 回归FFN
本文中DETR主体代码如下:
import torch
from torch import nn
from torchvision.models import resnet50class DETR(nn.Module):def __init__(self, num_classes, hidden_dim, nheads,num_encoder_layers, num_decoder_layers):super().__init__()# We take only convolutional layers from ResNet-50 modelself.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])self.conv = nn.Conv2d(2048, hidden_dim, 1) # 1×1卷积层将2048维特征降到256维self.transformer = nn.Transformer(hidden_dim, nheads, num_encoder_layers, num_decoder_layers)self.linear_class = nn.Linear(hidden_dim, num_classes + 1) # 类别FFNself.linear_bbox = nn.Linear(hidden_dim, 4) # 回归FFNself.query_pos = nn.Parameter(torch.rand(100, hidden_dim)) # object query# 下面两个是位置编码self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))def forward(self, inputs):x = self.backbone(inputs)h = self.conv(x)H, W = h.shape[-2:]pos = torch.cat([self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),self.row_embed[:H].unsqueeze(1).repeat(1, W, 1),], dim=-1).flatten(0, 1).unsqueeze(1) # 位置编码h = self.transformer(pos + h.flatten(2).permute(2, 0, 1),self.query_pos.unsqueeze(1))return self.linear_class(h), self.linear_bbox(h).sigmoid()detr = DETR(num_classes=91, hidden_dim=256, nheads=8, num_encoder_layers=6, num_decoder_layers=6)
detr.eval()
inputs = torch.randn(1, 3, 800, 1200)
logits, bboxes = detr(inputs)
3 目标检测集合预测损失
DETR在一次通过解码器的过程中推断出 个固定大小的预测集(本文中
为100),可以知道
为明显大于图像中感兴趣对象的实际数量的,那预测出来的框怎么知道对应的是哪一个GT (Ground Truth)框呢,即如何来计算损失?
3.1 二分图匹配损失
首先,要将GT也扩展为 个检测框,用
(
大小为
,且用一个额外的特殊类标签ϕ来表示“no object”)来代表GT的集合,而
代表
个预测的集合。这样两个集合的元素数量都为
,就可以做一个配对的操作,让预测集合的元素都能找到GT集合里的一个配对元素,每个预测集合的元素找到的GT集合里的元素都是不同的,也就是一一对应。
这样的组合可以有 种,所有的组合记作
,然后搜素具有最小损失的
个元素
的置换:
其中, 是GT
与索引为
的预测之间的成对匹配损失:
其中:
是示1符号,后面括号的内容为真时取值1,否则取值0;
表示GT中的第
个元素;
表示GT中的第
个类;
表示GT中的第
个边界框;
是某个组合中GT第
个元素对应的预测中的索引;
表示预测中的第
个结果;
表示预测中第
个结果中
的概率;
表示预测中的第
个边界框。
对于 ,本文中由于是直接预测边界框,如果像其他方法中直接计算
损失,就会导致对于大的框和小的框的惩罚力度不一致,所以文章在使用
损失的同时,也使用了尺度不变的IoU 损失
:
则有 :
其中, 和
是超参数。
由此,本文中通过采用匈牙利算法来进行二分图匹配,即对预测集合和真实集合的元素进行一一对应,使得匹配损失最小。
3.2 损失函数
然后,就是计算损失函数了,也就是计算上一步得到的所有匹配对之间的匈牙利损失。 本文中将损失函数定义为与常见目标检测器相似的形式,即一个用于类别预测的负对数似然和一个边框损失的线性组合:
其中, 是匹配损失中计算得到的最优分配。
与 区别是使用了
,目的是在计算训练模型的损失函数时需要得到准确的结果,ϕ就是ϕ,而不要似有似无、相近类似,这样会干扰预测的准确性。而在
不使用
则不管ϕ 的预测结果,并且如果使用
也会增大计算量。
可以得到DETR的训练流程如下:
- CNN提取特征:经过CNN提取一部分的特征得到对应的特征图,并将得到的特征进行拉直处理形成token;
- 将拉直之后的token添加位置编码送入encoder的结构部分,encoder作用是进一步学习全局信息,为接下来的decoder出预测框做铺垫;
- decoder生成框的输出,当有了图像特征之后,还会有一个查询对象(限定了要出多少预测框),通过查询和特征在decoder里进行自注意力操作,得到输出的框(本文中预测框限定为100,无论是什么图片都会预测100个框);
- 计算100个预测框和2个GT框的二分图匹配损失,决定100个预测框哪两个是独一无二对应到红黄色的GT框,匹配的框去算目标检测的loss。
而在DETR的推理中,与训练流程的1、2、3一致,第4步中不需要计算损失,直接在最后使用阈值保留输出中置信度比较大(>0.7的),而置信度小于0.7的当做背景物体。
总结
DTER基于Transformer和二分匹配损失,通过直接集合预测来进行目标检测,提出了一种端到端目标检测新方法。DETR不需要预定义的先验anchor,也不需要NMS的后处理策略,就可以实现端到端的目标检测。并且DETR易于实现,具有灵活的架构,易于扩展到其他的复杂任务,例如全景分割。
DETR在大目标检测上的性能优势明显,而在小目标上稍差,而且基于match的损失导致学习很难收敛。
相关文章:
目标检测文献阅读-DETR:使用Transformer进行端到端目标检测
目录 摘要 Abstract 1 引言 2 DETR结构 2.1 Backbone 2.2 Encoder 2.3 Decoder 2.4 FFN 3 目标检测集合预测损失 3.1 二分图匹配损失 3.2 损失函数 总结 摘要 本周阅读的论文题目是《End-to-End Object Detection with Transformers》(使用Transformer进行端到端目…...
C#里对已经存在的文件进行压缩生成ZIP文件
先要对目录下所有文件获取到: private List<string> GetXDFiles(string dirPath){//获取目录中的所有文件string suffix = "*.txt"; // 要查找的文件后缀var files = Directory.GetFiles(dirPath, suffix, SearchOption.TopDirectoryOnly).ToList();return fi…...
单片机软件定时器V4.0
单片机软件定时器V4.0 用于单片机定时执行任务等,比如LED GPIO等定时控制,内置前后台工作模式 头文件有使用例子 #ifndef __SORFTIME_APP_H #define __SORFTIME_APP_H#ifdef __cplusplus extern "C" { #endif#include <stdint.h>// #…...
【嵌入式硬件】嵌入式显示屏接口
数字显示串行接口(Digital Display Serial Interface) SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备,下面是接口…...
vuedraggable 选项介绍
vuedraggable 是基于 SortableJS 的 Vue 组件,提供了丰富的选项来定制拖拽行为。以下是 vuedraggable 常用的选项和它们的详细说明: 常用选项介绍 group 配置拖拽分组。多个列表可以共享同一个分组,允许它们之间的项目互相拖拽。 group: { na…...
OpenAI CEO 奥特曼发长文《反思》
OpenAI CEO 奥特曼发长文《反思》 --- 引言:从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月,如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思,我想分享一些个人想法,谈谈它迄今为止的发展,…...
Appium(一)--- 环境搭建
一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装:默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(3) 验证…...
如何查看服务器上的MySQL/Redis等系统服务状态和列表
如果呢你知道系统服务名称,要看状态很简单: systemctl status server-name 比如 systemctl status nginxsystemctl status redis # 等 这是一个nginx的示例: 那问题是 当你不知道服务名称时该怎么办。举个例子,比如mysql在启动…...
多模态论文笔记——U-ViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍U-ViT的模型架构和实验细节,虽然没有后续的DiT在AIGC领域火爆,但为后来的研究奠定了基础,但其开创性的探索值得学习…...
08-1_队列的理论讲解
08-1_队列的理论讲解 队列概念理解 队列就是一个传送带,就是一个流水线 工人放入的数据, 放在传送带上,送给消费者, 消费者第一次拿到的数据,就是工人第一次放上的数据(类比队列,先进先出) freertos队列应用思考 队列对于消费者(取数据): (1)当队列没有数据, 消费者需要进入…...
HTML基础入门——简单网页页面
目录 一,网上转账电子账单 编辑 1,所利用到的标签 2,代码编写 3,运行结果 二,李白诗词 1,所用到的标签 2,照片的编辑 3,代码编写 4,运行结果 一,网…...
Proteus-8086调试汇编格式的一点心得
这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本13章),中间出了挺多问题,解决后记录下。 先上电路图 用子电路来仿真发现仿真的时候子电路这块根本没有高低电平输出,只好把子电路拿…...
Python入门教程 —— 多任务
1.线程 1.1.线程安全问题 线程访问全局变量 import threading g_num = 0 def test(n):global g_numfor x in range(n):g_num += xg_num -= xprint(g_num)if __name__ == __main__:t1 = threading.Thread(target=test, args=(10,))t2 = threading.Thread(target=test, args=(…...
【笔记】算法记录
1、求一个数的素因子(试除法) // 获取一个数的所有素因子 set<int> getPrimeFactors(int num) {set<int> primeFactors;for (int i 2; i * i < num; i) {while (num % i 0) {primeFactors.insert(i);num / i;}}if (num > 1) {prime…...
2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无
2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无 前端代码开源库 关于开源说明:企业服务-招聘信息管理系统-前端uniapp-系统前端开放源代码仅供学习-优雅草科技-目前优雅草科…...
【网络】计算机网络的分类 局域网 (LAN) 广域网 (WAN) 城域网 (MAN)个域网(PAN)
局域网是通过路由器接入广域网的 分布范围 局域网Local Area Network:小范围覆盖,速度高,延迟低(办公室,家庭,校园,网络) 广域网Wide Area Network 大范围覆盖,速度相对低,延迟高…...
DeepSeek:性能强劲的开源模型
deepseek 全新系列模型 DeepSeek-V3 首个版本上线并同步开源。登录官网 chat.deepseek.com 即可与最新版 V3 模型对话。 性能对齐海外领军闭源模型 DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。 论…...
MySql 通过 LOAD DATA INFILE 导入大量数据
背景:要在本地Mysql导入几十万-百万条数据非常耗时,从网上找到通过load data infile 方式可以快速导入大量数据,就动手尝试了。结果就是不太适合复杂的格式数据导入,比如字段多,数据格式多等,但对于简单的表…...
Linux系统中解决端口占用问题
在日常的 Linux 系统管理和开发过程中,端口占用是一个常见且令人头疼的问题。无论是部署新服务、调试应用程序,还是进行系统维护,遇到端口被占用都可能导致服务无法正常启动或运行。本文将详细介绍在 Linux 系统中如何识别和解决端口占用问题…...
两种方式实现Kepware与PLC之间的心跳检测
两种方式实现Kepware与PLC之间的心跳检测 实现Kepware与PLC之间的心跳检测1.OPCUA 外挂程序2.Kepware Advanced Tag 实现Kepware与PLC之间的心跳检测 1.OPCUA 外挂程序 这是通过上位程序来触发心跳的一种机制,在C#中,可以利用OPC UAOPCAutodll的方式…...
使用DockerCompose部署服务
由于格式或图片解析问题,为了更好的阅读体验,可前往 阅读原文 以前我们总是用命令管理每个容器的启动、停止等等,若有多个容器时可能还存在启动优先级的问题,那就要等到指定的容器启动后再去启动另一个容器,对于整体的…...
第P5周-Pytorch实现运动鞋品牌识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch (二)具体步骤 时间…...
react-quill 富文本组件编写和应用
index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…...
因泰立科技激光车检器,高速公路的精准流量统计专家
高速公路自由流门架激光车检器,专为解决高速公路交通管理中的各种挑战而设计。该产品采用先进的激光测量技术,能够对动态通过的车辆进行高速动态扫描,通过测量物体表面点的反射距离,迅速换算成三维空间坐标,实现对车辆…...
windows中,git bash 使用conda命令
1、首先在Anaconda的安装路径如/Anaconda3/Scripts下,打开git bash窗口,然后输入下面的命令。 ./conda init bash 运行之后,会在用户目录下面生成.bash_profile文件,文件内容如下: # >>> conda initialize…...
《繁星路》V1.8.3(Build16632266)官方中文学习版
《繁星路》官方中文版https://pan.xunlei.com/s/VODae2_2Z3QyMF02I5y321uHA1?pwdqgsh# 作为一款星际模拟游戏,完美融合了硬科幻元素与基地建设玩法,体验改造行星的恢弘与壮阔。化身人工意识AMI,遵照基本指示推进火星改造的各项工作…...
vscode 无法使用npm, cmd命令行窗口可以正常执行
解决方法: 执行命令获得命令的位置 get-command npm 得到如下 然后删除或者修改 npm.ps1文件 让其不能使用就行。然后重启vscode即可。 pnpm 同理即可 另外加速源 国内镜像源(淘宝): npm config set registry https://regist…...
html + css 顶部滚动通知栏示例
前言 在现代网页设计中,一个吸引人的顶部滚动通知栏不仅能够有效传达重要信息,还能提升用户体验。通过使用HTML和CSS,我们可以创建既美观又功能强大的组件,这些组件可以在不影响网站整体性能的情况下提供实时更新或紧急通知。 本…...
阿里mod_asr3.0集成webrtc静音算法
alibabacloud-nls-cpp-sdk-master 先到阿里官网下载nls库的源代码,编译生成对应的库文件和头文件。 我编译的放到了以下目录。 /home/jp/2025/alibabacloud-nls-cpp-sdk-master/build/install/NlsSdk3.X_LINUX/include/ /home/jp/2025/alibabacloud-nls-cpp-sdk-…...
【MySQL】表的基本查询
文章目录 1. 插入 insert1.1 单行插入2.2 多行插入2.3 插入 否则更新2.4 替换 2. 查找 select2.1 select 列2.2 where 条件2.3 order by 排序2.4 筛选分页结果 3. 更新 update4. 删除 delete5. 截断 truncate6. 插入查询结果7. 聚合函数8. group by子句 我们经常说数据库就是CR…...
2025-01-07日SSH钓鱼日志
今天发现了挖矿程序部署脚本,可针对性排查。 时间来源类型详情20:16:08146.190.50.206:36694CHANNEL_REQUEST通道:1,类型:exec(command:uname -a)20:16:08146.190.50.206:36694OPEN_CHANNEL通道:1,类型&am…...
C++语言的计算机基础
C语言的计算机基础 引言 C是一种通用的编程语言,由Bjarne Stroustrup于1979年开发。它在C语言的基础上增加了面向对象的特性,使得程序设计变得更加灵活和高效。C广泛应用于系统软件、游戏开发、实时仿真等领域。本文将深入探讨C语言的基础知识…...
怎么把word试题转成excel?
在教育行业、学校管理以及在线学习平台中,试题库的高效管理是一项核心任务。许多教育工作者和系统开发人员常常面临将 Word 中的试题批量导入 Excel 的需求。本文将详细介绍如何快速将试题从 Word 转换为 Excel,帮助您轻松解决繁琐的数据整理问题&#x…...
在线商城系统设计与开发-代码(源码+数据库+文档)
亲测完美运行带论文:文末获取源码 文章目录 项目简介(论文摘要)运行视频包含的文件列表(含论文)前端运行截图后端运行截图 项目简介(论文摘要) 现代经济快节奏发展以及不断完善升级的信息化技术…...
HCIE-day10-ISIS
ISIS ISIS(Intermediate System-to-Intermediate System)中间系统到中间系统,属于IGP(内部网关协议);是一种链路状态协议,使用最短路径优先SPF算法进行路由计算,与ospf协议有很多相…...
解决SSH连接时遇到的“远程主机身份验证已更改 (WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)”警告
文章目录 引言警告信息解读造成原因解决方案 引言 在使用SSH协议进行远程服务器管理的过程中,可能会遇到这样的情况:当尝试通过SSH连接到某个远程主机时,终端突然弹出一条警告信息,提示“远程主机身份验证已更改”。 警告信息解…...
C语言的循环实现
C语言的循环实现 C语言是一种功能强大且广泛使用的编程语言,其语法简单易懂,适用于系统软件、嵌入式系统和高性能应用程序等多个领域。在C语言中,控制程序执行流程的基本结构之一就是循环。循环允许程序在满足某个条件的情况下重复执行一段代…...
如何使用vue引入three.js
在 Vue.js 项目中引入和使用 Three.js 是一个常见的需求,Three.js 是一个用于在浏览器中创建和显示动画 3D 计算机图形的 JavaScript 库。以下是一个基本的示例,展示如何在 Vue 项目中引入和使用 Three.js。 1. 创建 Vue 项目 如果你还没有一个 Vue 项…...
【C++】深入理解迭代器(Iterator)
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯什么是迭代器?迭代器与指针的比较 💯std::string 中的迭代器示例代码与图示分析运行结果:图示说明: 小提示 💯正…...
微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果
有一个需求需要在微信小程序上实现一个长按时进行语音录制,录制时间最大为60秒,录制完成后,可点击播放,播放时再次点击停止播放,可以反复录制,新录制的语音把之前的语音覆盖掉,也可以主动长按删…...
QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
QPS 和 TPS 的区别是什么?QPS 大了会有什么问题,怎么解决? QPS(Queries Per Second)和 TPS(Transactions Per Second)都是衡量系统性能的重要指标,尤其是在 Web 服务、数据库和分布…...
小程序开发-页面事件之上拉触底实战案例
🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…...
[读书日志]从零开始学习Chisel 第六篇:Scala面向对象编程——特质(敏捷硬件开发语言Chisel与数字系统设计)
3.4特质 3.4.1什么是特质 特质使用trait开头,它与单例对象很像,两者都不能有输入参数,但单例对象是具体的,特质是抽象的。两者都不能用new实例化,类,单例对象,特质三者内部都可以包含字段和方…...
导航技术的分类
导航技术可以根据不同的分类标准进行划分,以下是从不同角度对导航技术的分类: 一、按导航信息获取原理分类 无线电导航:利用无线电波的传播特性来测定运动体的位置、速度等导航参数。常见的无线电导航系统包括罗兰-C、奥米加、台卡等。卫星…...
学习标准库atomic_base.h中typedef enum memory_order
1、背景 在多线程编程中,特别是在使用原子操作时,内存顺序(Memory Order)是一个关键的概念。在C11及其之后的标准中,memory_order 枚举类型(typedef enum memory_order)用于控制原子操作的内存…...
git push -f 指定分支
要将本地代码推送到指定的远程分支,你可以使用以下步骤和命令: 确认远程仓库: 确保你的本地仓库已经与远程仓库关联。你可以使用以下命令查看当前的远程仓库状态: git remote -v查看本地分支: 使用命令查看当前存在的本…...
ADO.NET知识总结3---SqlCommand命令对象
目录 4.1 SqlCommand对象介绍 4.2 SqlCommand创建 4.3 Command执行方法 4.1 SqlCommand对象介绍 SqlCommand:Ado.Net中执行数据库命令的对象。 它对SQLServer数据库执行一个T-SQL语句或存储过程。 重要属性: Connection: SqlCommand对象使用的SqlConnection对…...
CANopen转EtherCAT网关连接伺服驱动
在现代工业自动化领域,CANopen和EtherCAT是两种常见的通信协议,各自在不同的应用场景中发挥着重要作用。然而,随着工业自动化系统的日益复杂化,不同设备间的通信需求也变得多样化。因此,如何实现不同协议设备之间的无缝…...
前端基础技术全解析:从HTML前端基础标签语言开始,逐步深入CSS样式修饰、JavaScript脚本控制、Ajax异步通信以及WebSocket持久通信
目录 前言: 1.前端技术html简单了解: 1.1HTML代码是由标签构成的。 1.2.HTML 文件基本结构 1.3.HTML 常见标签 标题标签: 段落标签: p 文本格式化标签 图片标签: 超链接标签: a 测试代码: 展示效果: 表单…...
试用kotlin multiplatform
目录 多平台框架简介 示例工程建立与运行 常用库 桌面平台遇到的一些问题 使用总结 多平台框架简介 多平台的框架不少,flutter,rust,每一个都是优点明显,缺点也明显. flutter的桌面端控件少,质量不一.dart语言丑陋又慢.我不喜欢它. rust,桌面gui不成熟,成熟一些的slint…...