DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记

news2024/9/20 20:38:31

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记

  • 一、Abstract
  • 二、引言
  • 三、相关工作
    • 目标检测中的 DETR
    • 其它视觉任务中的 DETR
    • 标签赋值
  • 四、方法
    • 4.1 基础知识
      • 通用的 DETR 框架
      • 通用的可变形 Deformable-DETR 框架
    • 4.2 混合匹配
      • 4.2.1 混合分支计划
        • 一对一匹配分支
        • 一对多匹配分支
      • 4.2.2 更多的混合匹配变体
        • 混合 epoch 计划
        • 混合层计划
  • 五、实验
    • 5.1 提升基于 DETR 的方法
      • 2D 目标检测的结果
      • 3D 目标检测的结果
      • 多人姿态估计的结果
      • 多目标跟踪的结果
      • 全景分割的结果
    • 5.2 消融实验
    • 5.3 与 SOAT 方法的比较
  • 六、结论
  • 补充
    • A、数据集
    • B、更多的超参数细节
    • C、全景分割的结果
    • D、更多的消融结果
    • E、加速混合匹配

写在前面

  有个城市之星的活动,加紧赶一篇博文出来吧。这是 VALSE 2023 大会(VALSE 2023 无锡线下参会个人总结 6月11日-2)上的一篇 Poster 论文,遂找来读读。

  • 论文地址:DETRs with Hybrid Matching
  • 代码地址:https://github.com/HDETR
  • 收录于:CVPR 2023
  • PS:2023 每周一篇博文,主页 更多干货,欢迎关注吖,这是这周加更的一篇,还剩 2 篇未补,期待 5 千粉丝有你的参与咩 ~

一、Abstract

  一对一匹配是 DETR 建立端到端训练的关键,以至目标检测不再需要 NMS了。然而更少的 queries 被赋值为正样本,导致一对一匹配显著减低了正样本的有效训练。于是提出混合匹配计划:在训练中结合原始的一对一匹配分支和辅助的一对多匹配分支。在推理过程中,仅采用原始的一对一匹配分支,维持端到端的优点以及 DETR 相同推理效率的同时,提高精度。本文提出的方法名为 H-DETR,提升了一系列包括 Deformable-DETR、PETRv2、PETR、TransTrack 等方法在大量视觉任务上的表现。

二、引言

  DETR 在各大视觉任务上都取得了突破性的进展,后续的工作通过重新设计更加先进的 Transformer 编码器和解码器结构,或者 query 的构成方法都实现了一定的提升。与之前不同,本文关注于一对一匹配造成的训练效率问题:仅给每个 GT 赋值一个 query。例如,在单个图像中,Deformable-DETR 通常从一组 300 个 queries 中仅选择少于 30 个的 query 来匹配 GT。于是将近 99% 的 COCO 图像中 boxes 选择标注的数量少于 30,而剩下的 270 个 queries 被赋值为空,仅由分类损失来监督,而这导致了非常低的定位能力。
  为了克服一对一匹配的问题以及扩大正样本 queries 所带来的好处,本文提出混合匹配计划,通过引入额外的一对多匹配分支来赋值多个 queries 到每个正样本。在推理过程中,仅采用原始的一对一解码器分支,维持了端到端的优点以及 DETR 相同的推理效率的同时,提高了精度。
  本文提出的混合匹配方法名为 H-DETR,在大量的视觉任务上验证了 H-DETR 及其变体的有效性。如下图所示;

在这里插入图片描述

三、相关工作

目标检测中的 DETR

  列举 Deformable-DETR、DAB-DETR、DINO-DETR、DE-DETR。不同于这些工作,本文关注于 DETR 中的匹配机制,提升训练效率的同时保留了原版 DETR 的优点。

其它视觉任务中的 DETR

  分割、3D 目标检测、姿态估计、目标跟踪。对于分割任务,首先构造 baseline 方法:Mask-Deformable-DETR,然后在这个 baseline 加上本文提出的方法。对于其他任务,直接采用最近提出的 PETRv2、PETR、TransTrack 作为 baseline 来验证本文的混合匹配方法。

标签赋值

  现有的标签赋值可划分为两类:一对多的标签赋值,即为每个 GT box 赋值多个正样本的预测;一对一的标签赋值,为每个 GT box 仅赋值一个正样本预测,方法举例:POTO。本文采用混合匹配的方法。

与 DN-DETR 和 DINO-DETR 的关系
  本文提出的方法与最近的这两个方法有关,通过引入 GT 目标噪声增强来辅助 queries。然而 DN-DETR 和 DINO-DETR 主要解决的是:由 Hungarian 赋值带来的不稳定性问题,本文主要解决:一对一匹配过程中正样本训练不充分的问题。
  另外,DN-DETR 和 DINO-DETR 都设计了噪声方式以及在噪声 querise 和 GT 目标间手动赋值,本文提出的方法使用端到端赋值的方式来匹配辅助的 queries 和 GT boxes,相比于匈牙利匹配则更简单。DN-DETR/DINO-DETR 需要微调或者重新设计噪声方式及 query 的格式,本文的方法更容易拓展到其他 DETR 变体上而不需要额外的微调。

四、方法

4.1 基础知识

通用的 DETR 框架

  给定输入图像 I I I,DETR 首先应用 Backbone 和 Transformer 编码器来提取出增强的像素 embedding X = { x 0 , x 1 , ⋯   , x N } X=\{x_0,x_1,\cdots,x_N\} X={x0,x1,,xN},之后将 X X X 和一组默认的目标 query embedding Q = { q 0 , q 1 , ⋯   , q n } Q=\{q_0,q_1,\cdots,q_n\} Q={q0,q1,,qn} 送入到 Transformer 解码器。然后在解码器的输出上,DETR 利用特定任务的预测头将更新后的 Q Q Q 输出为一组预测 P = { p 0 , p 1 , ⋯   , p n } P=\{p_0,p_1,\cdots,p_n\} P={p0,p1,,pn}。最后 DETR 在预测和 GT G = { g 0 , g 1 , ⋯   , g n } G=\{g_0,g_1,\cdots,g_n\} G={g0,g1,,gn} 间执行一对一的双边匹配。具体来说,DETR 将具有最小匹配损失的预测和 GT 关联起来,然后利用相应的监督损失来训练。示意图如下:

在这里插入图片描述
后续的一些工作根据不同的的视觉识别任务修改目标 query 从而实现不同的功能,例如修改目标 query 为 mask query、pose query、track query、bins query 等等。

通用的可变形 Deformable-DETR 框架

  Deformable-DETR 从以下几个方面提升了 DETR:

  • 采用多尺度 deformable self-attention 和多尺度 deformable cross-attention 替代了原始的多头自注意力和交叉注意力机制;
  • 用迭代的精炼预测代替了原始的每层独立预测;
  • 用 Transformer 解码器输出的动态 query 代替了原始的图像上下文不相关的 query。

需要注意的是 Deformable-DETR 和 DETR 同样执行的是一对一双边匹配原则。

4.2 混合匹配

  混合匹配方法关键在于结合一对一匹配和一对多匹配,其中一对一匹配对于移除 NMS 是必须的,而一对多匹配丰富了与 GT 匹配的 queries 数量。

在这里插入图片描述

4.2.1 混合分支计划

  采用两组 queries Q = { q 1 , q 2 , ⋯   , q n } Q=\{q_1,q_2,\cdots,q_n\} Q={q1,q2,,qn} Q ^ = { q ^ 1 , q ^ 2 , ⋯   , q ^ n } \widehat Q=\{\widehat q_1,\widehat q_2,\cdots,\widehat q_n\} Q ={q 1,q 2,,q n},前者用于执行一对一匹配,后者执行一对多匹配。

一对一匹配分支

  采用 L L L 层解码器处理第一组 Q Q Q,在每个解码器的输出层分别执行预测。之后在每一层的 {predictions,GT} 间执行双边匹配,估计 L ( P l , G ) \mathcal{L}{(\mathbf{P}^l,\mathbf{G})} L(Pl,G)
L one2one = ∑ L Hungarian ( P l , G ) \mathcal{L}_{\text{one2one}} =\sum\mathcal{L}_{\text{Hungarian}}(\mathbf{P}^l,\mathbf{G}) Lone2one=LHungarian(Pl,G)其中 P l \mathbf{P}^l Pl 表示第 l l l 层 Transformer 解码器层的输出预测。沿用 DETR 和 Deformable-DETR,选择 L m a t c h ( ⋅ ) \mathcal{L}_{match}(\cdot) Lmatch() L H u n g a r i a n ( ⋅ ) \mathcal{L}_{Hungarian}(\cdot) LHungarian():由一个分类损失、 L 1 \mathcal{L}_1 L1 回归损失和 GIoU 损失组成。

一对多匹配分支

  之后,采用相同数量 L L L 层 Transformer 解码器来处理第二组 queries Q ^ \widehat {\mathbf{Q}} Q ,得到 L L L 组预测。为执行一对多匹配,简单重复 GT K K K 次,得到增强的目标 G ^ = { G 1 , G 2 , ⋯   , G K } \widehat{\mathbf{G}}=\{{\mathbf{G}}^1,{\mathbf{G}}^2,\cdots,{\mathbf{G}}^K\} G ={G1,G2,,GK},其中 G 1 = G 2 = ⋯ = G K = G \mathbf{G}^1={\mathbf{G}}^2=\cdots={\mathbf{G}}^K=\mathbf{G} G1=G2==GK=G。同样在每层的 {predictions,增强的 GT} 对上执行双边匹配,估计 L match ( P ^ l , G ^ ) \mathcal{L}_{\text{match}}(\widehat{\mathbf{P}}^l,\widehat{\mathbf{G}}) Lmatch(P l,G )
L one2many = ∑ l = 1 L L Hungarian ( P ^ l , G ^ ) \mathcal{L}_{\text{one2many}}=\sum_{l=1}^L\mathcal{L}_{\text{Hungarian}}(\widehat{\mathbf{P}}^l,\widehat{\mathbf{G}}) Lone2many=l=1LLHungarian(P l,G )其中 P ^ l \widehat {\mathbf{{P}}}^l P l 表示第 l l l 层 Transformer 解码器的预测输出。
  训练总体损失为 λ L one2many + L one2one \lambda\mathcal{L}_{\text{one2many}}+\mathcal{L}_{\text{one2one}} λLone2many+Lone2one。为了加快训练速度和并行处理 Q \mathbf Q Q Q ^ \widehat {\mathbf{Q}} Q ,进一步采用一种 masked 多头自注意力来避免彼此交互,实验中并未发现额外的训练损失。最后在评估过程中仅保持一对一匹配分支,即 Q \mathbf Q Q

4.2.2 更多的混合匹配变体

混合 epoch 计划

  不同于混合分支计划,在混合 epoch 计划中,仅维持单组的 queries Q ~ = { q ~ 1 , q ~ 2 , ⋯   , q ~ M } \widetilde{\mathrm{Q}}=\{\widetilde{\mathrm{q}}_1,\widetilde{\mathrm{q}}_2,\cdots,\widetilde{\mathrm{q}}_M\} Q ={q 1,q 2,,q M},在不同的训练 epochs 中基于 Q ~ \widetilde{\mathrm{Q}} Q 来执行一对一匹配和一对多匹配。

一对多匹配训练 epochs
  在第一个 ρ \rho ρ 训练 epochs 内,采用一对一匹配来处理 L L L 层 Transformer 解码器中的 Q ~ \widetilde{\mathrm{Q}} Q ,从而得到 L L L 组预测。同时采用相似的策略通过一对多分支执行一对多匹配得到增强的 G ~ = { G 1 , G 2 , ⋯   , G K ~ } \tilde{\text{G}}=\{\text{G}^1,\text{G}^2,\cdots,\text{G}^{\tilde{K}}\} G~={G1,G2,,GK~}。之后在 L ~ match ( P ~ l , G ~ ) \tilde{\mathcal{L}}_{\text{match}}(\widetilde{\mathbf{P}}^l,\widetilde{\mathbf{G}}) L~match(P l,G ) 间执行双边匹配:
L one2many = ∑ l = 1 L L Hungarian ( P ~ l , G ~ ) \mathcal{L}_{\text{one2many}}=\sum\limits_{l=1}^L\mathcal{L}_{\text{Hungarian}}(\widetilde{\mathbf{P}}^l,\widetilde{\mathbf{G}}) Lone2many=l=1LLHungarian(P l,G )
一对一匹配训练 epochs

  在剩下的 1 − ρ 1-\rho 1ρ 个 epochs 上执行一对一匹配,唯一的区别在于匹配预测和原始的 GT 的损失不同:
L one2one = ∑ L H u n g a r i a n ( P ~ l , G ) \mathcal{L}_{\text{one2one}} =\sum \mathcal{L}_{\mathrm{Hungarian}}(\widetilde{\mathbf{P}}^l,\mathbf{G}) Lone2one=LHungarian(P l,G)最后直接在评估时应用 Q ~ \widetilde{\mathrm{Q}} Q 。总结一下,在一个 ρ \rho ρ epochs 上仅应用 L one2many \mathcal{L}_{\text{one2many}} Lone2many,在剩下的 1 − ρ 1-\rho 1ρ 个 epochs 上应用 L one2one \mathcal{L}_{\text{one2one}} Lone2one

混合层计划

  与混合 epoch 计划类似,仅维持单组的 queries Q ‾ = { Q ‾ 1 , Q ‾ 2 , ⋯   , Q ‾ N } \overline{\mathbf{Q}}=\{\overline{\mathbf{Q}}_1,\overline{\mathbf{Q}}_2,\cdots,\overline{\mathbf{Q}}_N\} Q={Q1,Q2,,QN}。在第一个 L 1 L_1 L1 Transformer 解码器层应用一对多匹配,而在剩下的 L 2 L_2 L2 层应用一对一匹配策略。

一对多匹配解码器层
  在第一个 L 1 L_1 L1 层 Transformer 解码器的输出预测和增强的 GT G ‾ = { G ‾ 1 , G ‾ 2 , ⋯   , G ‾ K ‾ } \overline{\mathbf{G}}=\{\overline{\mathbf{G}}^1,\overline{\mathbf{G}}^2,\cdots,\overline{\mathbf{G}}^{\overline{K}}\} G={G1,G2,,GK} 间应用一对多匹配计划:
L one2many = ∑ l = 1 L L Hungarian ( P ‾ l , G ‾ ) \mathcal{L}_{\text{one2many}}=\sum_{l=1}^L\mathcal{L}_{\text{Hungarian}}(\overline{\mathbf{P}}^l,\overline{\mathbf{G}}) Lone2many=l=1LLHungarian(Pl,G)在计算上述损失之前,也需要执行双边匹配 L match ( P ‾ l , G ‾ ) \mathcal{L}_{\text{match}}(\overline{\mathbf{P}}^l,\overline{\mathbf{G}}) Lmatch(Pl,G)

一对一匹配解码器层

对接下来的 L 2 L_2 L2 层 Transformer 解码器,执行一对一匹配计划:
L one2one = ∑ l = L 1 L 1 + L 2 L Hungarian ( P ‾ l , G ) \mathcal{L}_{\text{one2one}}=\sum_{l=L_1}^{L_1+L_2}\mathcal{L}_{\text{Hungarian}}(\overline{\mathbf{P}}^l,\mathbf{G}) Lone2one=l=L1L1+L2LHungarian(Pl,G)总结:在整个训练过程中执行 L one2many \mathcal{L}_{\text{one2many}} Lone2many L one2one \mathcal{L}_{\text{one2one}} Lone2one 的组合。

五、实验

5.1 提升基于 DETR 的方法

2D 目标检测的结果

  
在这里插入图片描述

3D 目标检测的结果

  
在这里插入图片描述

多人姿态估计的结果

  
在这里插入图片描述

多目标跟踪的结果

  
在这里插入图片描述

全景分割的结果

  见补充材料 C 部分。

5.2 消融实验

不同混合匹配计划的比较

  
在这里插入图片描述

计算/训练时间/GPU 内存的成本

  
在这里插入图片描述

基于 Deformable-DETR 的每个组建的有效性

  
在这里插入图片描述
在这里插入图片描述

一对多匹配分支内 K K K 的选择

  
在这里插入图片描述

一对多匹配分支内 T T T 的选择

  
在这里插入图片描述

共享参数的效果

  
在这里插入图片描述

仅使用一对多匹配的比较

  
在这里插入图片描述

5.3 与 SOAT 方法的比较

  
在这里插入图片描述

六、结论

  本文展示了一种简单但有效的混合匹配方法,解决基于 DETR 系列的方法在多个任务上的低效率问题。结合了一对一匹配方法的优势,即避免 NMS,和一对多匹配的优势,即增加正样本 queries 的数量和训练效率。希望大家都来 follow。

补充

A、数据集

  COCO、LVIS、nuScnes、ScanNetV2、MOT17。

B、更多的超参数细节

  
在这里插入图片描述

C、全景分割的结果

  
在这里插入图片描述

D、更多的消融结果

  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

E、加速混合匹配

  在原始方法中,用两个独立的函数来简单执行一对一和一对多的匹配及损失计算,因此增加了整体的训练时间。当与使用相同数量 queries 的 baseline 方法进行比较时,从 75 分钟增加到 85分钟。为了降低这一额外的耗时,在下列算法中融合这两个函数,从而将原始的训练时间从 85 分降为 80 分 🐮。
  
在这里插入图片描述

写在后面

  别看这篇论文简短且简单,人家这个实验做的可是滴水不漏,工作量恐怖! 实验部分的做法与写法值得好好学习。

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

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

相关文章

client-go的Indexer三部曲之三:源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《client-go的Indexer三部曲》全部链接 基本功能性能测试源码阅读 本篇概览 本文是《client-go的Indexer三部曲》系列的终篇,主要任务是阅读和…

Vue全家桶(四):Vue Router 路由

目录 Vue Router1. 相关理解1.1 Vue Router的理解1.2 对SPA应用的理解1.3 路由的理解 2. 基本路由2.1 vue-router使用步骤2.2 几个注意点2.3 触发路由2.4 嵌套路由2.5 路由传递参数方式2.5.1 params 方式2.5.2 Query的方式 2.6 命名路由2.7 路由的props配置2.8 路由跳转的repla…

H3C-HCL模拟器-VLAN划分实验

一、实验拓扑结构图: 二、实验需求: 1. 按图示为PC配置IP地址 2. SW1和SW2上分别创建vlan10和vlan20,要求PC3和PC5属于vlan10,PC4和PV6属于vlan20 3. SW1和SW2相连的接口配置为trunk类型,允许vlan10和vlan20通过 4…

AI工程化的“基座能力”?—— 聊聊GPT Function Calling

点击↑上方↑蓝色“编了个程”关注我~ 这是Yasin的第 94 篇原创文章 最近AI大模型火出了圈,很多人惊叹它的智能程度。但大多数人都以为它的能力主要在“聊天”、“写文案”这方面。然而实际它能做的远远更多。 Chat GPT是当今世界上最智能的模型,它前段时…

【Linux】—— 详解进程PCB和进程状态

前言: 在上篇我们已经对有关体系结构的基本知识进行了详细的介绍,接下来我们将进入网络编程的第一个大块—— 有关进程相关的知识!!! 目录 前言 (一) 基本概念 1、描述进程-PCB 2、查看进程…

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Desc…

使用vue脚手架搭建前端工程(附:搭配ElementUI来快速开发)

目录 一、搭建过程 1. 全局安装webpack(打包工具) 2. 全局安装vue脚手架 3. 初始化vue项目 4. vue项目目录的简单介绍 二、执行流程分析 三、自己造一个组件案例 四、ElementUI的使用 1. 环境的引入 2. 一个简单使用 3. 使用它来快速搭建后台管…

AI绘画Stable diffusion保姆级教程,看这一篇就够了「安装-配置-画图」

随着chat gpt爆火之后,越来越多的人开始关注人工智能,人工智能相关的其他应用如AI绘画,也再次得到人们的关注。AI绘画的确很上头,最近几天小编也研究一下,这里把研究的过程以及中间遇到的问题整理一下,我这…

吴恩达471机器学习入门课程3第1周——异常检测

异常检测 1 导包2 - 异常检测2.1 问题陈述2.2 数据集可视化您的数据 2.3 高斯分布2.2.1 估计高斯分布的参数2.2.2 选择阈值 ϵ \epsilon ϵ2.4 高维数据集异常检测 实现异常情况检测算法,并应用它来检测网络上的故障服务器。 1 导包 import numpy as np import ma…

管理类联考——英语二——知识篇——写作题目说明——B节

MBA,MPA,MPAcc管理类联考英语写作部分由A,B两节组成,主要考查考生的书面表达能力。共2题,25分。A节要求考生根据所给情景写出约100词(标点符号不计算在内)的应用文,包括私人和公务信函、通知、备忘录等。共…

【ESP8266 (12F)】硬件参数 以及 固件烧录

本文资料及工具地址:https://github.com/CQUPTLei/ESP8266 一、基本关系1.1 ESP8266 芯片 和 ESP 12F 模组1.2 乐鑫科技和安信可 二、ESP 8266开发板2.1 ESP 12F 产品规格2.2 ESP8266 开发板 三、固件与固件下载3.1 什么是固件3.2 固件和用户程序3.2 如何下载固件3.…

Linux下配置lunavim

前言 在lunavim官网中提供了安装脚本,一件安装即可,但是经常因为网络不稳定而导致安装失败。这里提供在Linux下进行git加速的几种方法,可以尝试下。如果问题没有解决,也不要担心,我们还提供了两种平替方法进行luanvim的…

linux实验五sed和awk

按要求写出正则表达式 显示/etc/passwd中以bash结尾的行;显示/var/log/secure文件中包含“Failed”或“FAILED”的行查找/etc/man_db.conf中含有“以m开头,并以n结尾的单词”模式的行;显示/etc/man_db.conf中,包含Linux绝对路径的行&#xff…

基础巩固(六)自定义View

文章目录 View绘制流程MeasureLayoutDraw 自定义View的实现的步骤步骤1:实现Measure、Layout、Draw流程自定义 MeasureViewGroup.LayoutParamsMeasureSpec 自定义Layout 自定义属性 绘制工具类Paint具体使用 PathCanvas View绘制流程 在绘制前,系统会有一…

Python恶搞代码

文章目录 前言Tkinter界面设计Threading多线程恶搞代码 尾声 前言 快来领取python无限弹窗恶搞代码吧!每天写一些有趣的小程序,带你成为一个浪漫的程序员! Tkinter界面设计 1. 创建一个简单的界面 Tkinter 是 Python 标准库中的一个 GUI&…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录:《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​,双向语言模型从前向(从左到右)和后向(从右到左)两个方向同时建立语言模型。这样做…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具,其不仅可以分析程序运行时的错误(内存泄…

ChatGPT 之 LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! ChatGPT面向对话格式的文本理解很好,但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题,讲起来需要很多篇幅,优化起来前路漫…

使用arduino IDE开发ESP8266NodeMCU连接DHT11实现温湿度检测并上传onenet官网

前言: 本篇博客记录一下以arduino IDE来开发一下ESP8266NodeMCU,实现用DHT11进行温湿度检测,并且上传新版的onenet官网;我在实现这个小项目的时候,发现网上资料有关onenet的资料都是旧版的,这就有点难受了&…

[MAUI]弧形进度条与弧形滑块的交互实现

文章目录 弧形基类定义绘制弧 弧形进度条(ProgressBar)添加动画宽度补偿文本 弧形滑块(Slider)创建控制柄拖动事件处理 项目地址 进度条(ProgressBar)用于展示任务的进度,告知用户当前状态和预期; 滑块(Slider&#xf…