深度学习学习笔记(32周)
目录
摘要
abstract
1 Mask R-CNN
2 RoI Align
2.1 RoIPool实验
2.2 RoIAlign实验
3 Mask Branch(FCN)
4 其他细节
4.1 Mask R-CNN损失
4.2 Mask分支损失
4.3 Mask Branch预测使用
摘要
Mask R-CNN是2017年发表的文章,一作是何恺明大神,没错就是那个男人,除此之外还有Faster R-CNN系列的大神Ross Girshick
,可以说是强强联合。该论文也获得了ICCV 2017的最佳论文奖(Marr Prize
)。并且该网络提出后,又霸榜了MS COCO的各项任务,包括目标检测、实例分割以及人体关键点检测任务。在看完这边文章后觉得Mask R-CNN的结构很简洁而且很灵活效果又很好(仅仅是在Faster R-CNN的基础上根据需求加入一些新的分支)。
abstract
Mask R-CNN is an article published in 2017, with the first work being "The God of He Kaiming". That's right, it's that man. In addition, there is also the god of the Faster R-CNN series, Ross Girshick, which can be said to be a strong alliance. This paper also won the Best Paper Award (Marr Prize) at ICCV 2017. And after the network was proposed, it dominated various tasks of MS COCO, including object detection, instance segmentation, and human keypoint detection tasks. After reading this article, I feel that the structure of Mask R-CNN is very simple, flexible, and effective (only adding some new branches based on the requirements of Faster R-CNN).
1 Mask R-CNN
The method, called Mask R-CNN, extends Faster R-CNN by adding a branch for predicting an object mask in parallel with the existing branch for bounding box recognition.
Mask R-CNN是在Faster R-CNN的基础上加了一个用于预测目标分割Mask的分支(即可预测目标的Bounding Boxes信息、类别信息以及分割Mask信息)。
Moreover, Mask R-CNN is easy to generalize to other tasks, e.g., allowing us to estimate human poses in the same framework.
Mask R-CNN不仅能够同时进行目标检测与分割,还能很容易地扩展到其他任务,比如再同时预测人体关键点信息。
Our method, called Mask R-CNN, extends Faster R-CNN by adding a branch for predicting segmentation masks on each Region of Interest (RoI), in parallel with the existing branch for classification and bounding box regression (Figure 1). The mask branch is a small FCN applied to each RoI, predicting a segmentation mask in a pixel-to-pixel manner.
Mask R-CNN的结构也很简单,就是在通过RoIAlign
(在原Faster R-CNN中是RoIPool
)得到的RoI基础上并行添加一个Mask分支(小型的FCN)。见下图,之前Faster R-CNN是在RoI基础上接上一个Fast R-CNN检测头,即图中class, box分支,现在又并行了一个Mask分支。
注意带和不带FPN结构的Mask R-CNN在Mask分支上略有不同,对于带有FPN结构的Mask R-CNN它的class、box分支和Mask分支并不是共用一个RoIAlign。在训练过程中,对于class, box分支RoIAlign
将RPN
(Region Proposal Network)得到的Proposals
池化到7x7
大小,而对于Mask分支RoIAlign
将Proposals
池化到14x14
大小。详情参考原论文中的图4.
2 RoI Align
Faster R-CNN was not designed for pixel-to-pixel alignment between network inputs and outputs. This is most evident in how RoIPool, the de facto core operation for attending to instances, performs coarse spatial quantization for feature extraction.
在之前的Faster RCNN中,会使用RoIPool
将RPN
得到的Proposal
池化到相同大小。这个过程会涉及quantization
或者说取整操作,这会导致定位不是那么的准确(文中称为misalignment
问题)。
下面的示意图就是RoIPool
的执行过程,其中会经历两次quantization
。假设通过RPN
得到了一个Proposal
,它在原图上的左上角坐标是( 10 , 10 ) (10,10)(10,10),右下角的坐标是( 124 , 124 ) (124,124)(124,124),对应要映射的特征层相对原图的步距为32,通过RoIPool
期望的输出为2x2
大小:
- 将
Proposal
映射到特征层上,对于左上角坐标10 32 \frac{10}{32}3210四舍五入后等于0,对于右下角坐标124 32 \frac{124}{32}32124四舍五入后等于4,即映射在特征层上的左上角坐标为( 0 , 0 ) (0,0)(0,0)右下角坐标为( 4 , 4 ) (4,4)(4,4)。对应下图特征层上从第0行到第4行,从第0列到第4列的区域(黑色矩形框)。这是第一次quantization
。 - 由于期望的输出为
2x2
大小,所以需要将映射在特征层上的Proposal
划分成2x2
大小区域。但现在映射在特征层上的Proposal
是5x5
大小,无法均分,所以强行划分后有的区域大有的区域小,如下图所示。这是第二次quantization
。 - 对划分后的每个子区域进行
maxpool
即可得到RoIPool
的输出,即( 1.6871 0.4676 2.0242 2.3571 )(1.68712.02420.46762.3571)(1.68710.46762.02422.3571)
(1.68712.02420.46762.3571)。在2.1章节有对应的Pytorch实验。
To fix the misalignment, we propose a simple, quantization-free layer, called RoIAlign, that faithfully preserves exact spatial locations.
为了解决这个问题,作者提出了RoIAlign
方法替代RoIPool
,以获得更加精确的空间定位信息。
RoIAlign has a large impact: it improves mask accuracy by relative 10% to 50%, showing bigger gains under stricter localization metrics. Second, we found it essential to decouple mask and class prediction: we predict a binary mask for each class independently, without competition among classes, and rely on the network’s RoI classification branch to predict the category.
作者在文中提到,将RoIPool
替换成RoIAlign
后,分割的Mask准确率相对提升了10%到50%(见下图d),并且将预测Mask和class进行了解耦,解耦后也带来了很大的提升(见下图b),这个在后面会细讲。
下面的示意图就是RoIAlign
的执行过程。同样假设通过RPN
得到了一个Proposal
,它在原图上的左上角坐标是( 10 , 10 ) (10,10)(10,10),右下角的坐标是( 124 , 124 ) (124,124)(124,124),对应要映射的特征层相对原图的步距为32,通过RoIAlign
期望的输出为2x2
大小:
- 将
Proposal
映射到特征层上,左上角坐标( 0.3125 , 0.3125 ) (0.3125, 0.3125)(0.3125,0.3125)(不进行四舍五入),右下角坐标( 3.875 , 3.875 ) (3.875, 3.875)(3.875,3.875)(不进行四舍五入)。为了方便理解,将特征层上的每个元素用一个点表示,就能得到图中下方的grid
网格。图中蓝色的矩形框就是Proposal
(没有quantization
)。 - 由于期望输出为
2x2
大小,故将Proposal
划分为2x2
四个子区域(没有quantization
)。接着根据sampling_ratio
在每个子区域中设置采样点,原论文中默认设置的sampling_ratio
为4,这里为了方便讲解将sampling_ratio
设置成1。 - 然后计算每个子区域中每个采样点的值(利用双线性插值计算),最后对每个区域内的所有采样点取均值即为该子区域的输出。
这里以第一个子区域为例,因为这里将sampling_ratio
设置成为1,所以每个子区域只需要设置一个采样点。第一个子区域的采样点为图中黄色的点(即为该子区域的中心点),坐标为( 1.203125 , 1.203125 ) (1.203125,1.203125)(1.203125,1.203125),然后找出离该采样点最近的四个点(即图中用红色箭头标出的四个黑点),然后利用双线性插值即可计算得到采样点对应的输出− 0.8546 -0.8546−0.8546(如果不了解双线性插值可参考我之前写的博文),又由于该子区域只有一个采样点,故该子区域的输出就为− 0.8546 -0.8546−0.8546。在2.2章节有对应的Pytorch实验。
We note that the results are not sensitive to the exact sampling locations, or how many points are sampled, as long as no quantization is performed.
最后作者在论文中有提到,关于最终的采样结果对采样点位置,以及采样点的个数并不敏感。
2.1 RoIPool实验
实验还是按照前面讲的内容来进行对比。
下面是使用Torchvision库中实现的RoIPool
方法,通过对比计算结果和我们刚刚讲的是一样的。
import torch
from torchvision.ops import RoIPooldef main():torch.manual_seed(1)x = torch.randn((1, 1, 6, 6))print(f"feature map: \n{x}")proposal = [torch.as_tensor([[10, 10, 124, 124]], dtype=torch.float32)]roi_pool = RoIPool(output_size=2, spatial_scale=1/32)roi = roi_pool(x, proposal)print(f"roi pool: \n{roi}")if __name__ == '__main__':main()
输出:
feature map:
tensor([[[[-1.5256, -0.7502, -0.6540, -1.6095, -0.1002, -0.6092],[-0.9798, -1.6091, -0.7121, 0.3037, -0.7773, -0.2515],[-0.2223, 1.6871, 0.2284, 0.4676, -0.6970, -1.1608],[ 0.6995, 0.1991, 0.1991, 0.0457, 0.1530, -0.4757],[-1.8821, -0.7765, 2.0242, -0.0865, 2.3571, -1.0373],[ 1.5748, -0.6298, 2.4070, 0.2786, 0.2468, 1.1843]]]])
roi pool:
tensor([[[[1.6871, 0.4676],[2.0242, 2.3571]]]])
2.2 RoIAlign实验
实验还是按照前面讲的内容来进行对比。
下面是使用Torchvision库中实现的RoIAlign
方法,通过对比计算结果和我们刚刚讲的是一样的。
import torch
from torchvision.ops import RoIAligndef bilinear(u, v, f1, f2, f3, f4):return (1-u)*(1-v)*f1 + u*(1-v)*f2 + (1-u)*v*f3 + u*v*f4def main():torch.manual_seed(1)x = torch.randn((1, 1, 6, 6))print(f"feature map: \n{x}")proposal = [torch.as_tensor([[10, 10, 124, 124]], dtype=torch.float32)]roi_align = RoIAlign(output_size=2, spatial_scale=1/32, sampling_ratio=1)roi = roi_align(x, proposal)print(f"roi align: \n{roi}")u = 0.203125v = 0.203125f1 = x[0, 0, 1, 1] # -1.6091f2 = x[0, 0, 1, 2] # -0.7121f3 = x[0, 0, 2, 1] # 1.6871f4 = x[0, 0, 2, 2] # 0.2284print(f"bilinear: {bilinear(u, v, f1, f2, f3, f4):.4f}")if __name__ == '__main__':main()
终端输出:
feature map:
tensor([[[[-1.5256, -0.7502, -0.6540, -1.6095, -0.1002, -0.6092],[-0.9798, -1.6091, -0.7121, 0.3037, -0.7773, -0.2515],[-0.2223, 1.6871, 0.2284, 0.4676, -0.6970, -1.1608],[ 0.6995, 0.1991, 0.1991, 0.0457, 0.1530, -0.4757],[-1.8821, -0.7765, 2.0242, -0.0865, 2.3571, -1.0373],[ 1.5748, -0.6298, 2.4070, 0.2786, 0.2468, 1.1843]]]])
roi align:
tensor([[[[-0.8546, 0.3236],[ 0.2177, 0.0546]]]])
bilinear: -0.8546
3 Mask Branch(FCN)
前面有提到,对于带有FPN和不带有FPN的Mask R-CNN,他们的Mask分支不太一样。下图左边是不带FPN结构的Mask分支,右侧是带有FPN结构的Mask分支(灰色部分为原Faster R-CNN预测box, class信息的分支,白色部分为Mask分支)。
由于在我们日常使用中,一般都是使用的带有FPN的网络,带有FPN结构的Mask分支:
之前在讲FCN的时候有提到过,FCN是对每个像素针对每个类别都会预测一个分数,然后通过softmax
得到每个类别的概率(不同类别之间存在竞争关系),哪个概率高就将该像素分配给哪个类别。但在Mask R-CNN中,作者将预测Mask和class进行了解耦,即对输入的RoI针对每个类别都单独预测一个Mask,最终根据box, cls分支预测的classes信息来选择对应类别的Mask(不同类别之间不存在竞争关系)。作者说解耦后带来了很大的提升。下表是原论文中给出的消融实验结果,其中softmax
代表原FCN方式(Mask和class未解耦),sigmoid
代表Mask R-CNN中采取的方式(Mask和class进行了解耦)。
这里还有一个需要注意的细节。在训练网络的时候输入Mask分支的目标是由RPN提供的,即Proposals,但在预测的时候输入Mask分支的目标是由Fast R-CNN提供的(即预测的最终目标)。 并且训练时采用的Proposals全部是Fast R-CNN阶段匹配到的正样本。这里说下我个人的看法(不一定正确),在训练时Mask分支利用RPN提供的目标信息能够扩充训练样本的多样性(因为RPN提供的目标边界框并不是很准确,一个目标可以呈现出不同的情景,类似于围着目标做随机裁剪。从另一个方面来看,通过Fast R-CNN得到的输出一般都比较准确了,再通过NMS后剩下的目标就更少了)。在预测时为了获得更加准确的目标分割信息以及减少计算量(通过Fast R-CNN后的目标数会更少),此时利用的是Fast R-CNN提供的目标信息。
4 其他细节
4.1 Mask R-CNN损失
Mask R-CNN的损失就是在Faster R-CNN的基础上加上了Mask分支上的损失,即:
关于Faster R-CNN的损失计算之前视频里讲过,这里就不在赘述。关于Mask分支上的损失就是二值交叉熵损失(Binary Cross Entropy)。
4.2 Mask分支损失
在讲Mask分支损失计算之前,我们要弄清楚logits
(网络预测的输出)是什么,targets
(对应的GT)是什么。前面有提到训练时输入Mask分支的目标是RPN提供的Proposals,所以网络预测的logits
是针对每个Proposal对应每个类别的Mask信息(注意预测的Mask大小都是28x28
)。并且这里输入的Proposals都是正样本(在Fast R-CNN阶段采样得到的),对应的GT信息(box、cls)也是知道的。
如下图所示,假设通过RPN得到了一个Proposal(图中黑色的矩形框),通过RoIAlign后得到对应的特征信息(shape为14x14xC
),接着通过Mask Branch预测每个类别的Mask信息得到图中的logits
(logits
通过sigmoid
激活函数后,所有值都被映射到0至1之间)。通过Fast R-CNN分支正负样本匹配过程我们能够知道该Proposal的GT类别为猫(cat
),所以将logits
中对应类别猫的预测mask(shape为28x28
)提取出来。然后根据Proposal在原图对应的GT上裁剪并缩放到28x28
大小,得到图中的GT mask(对应目标区域为1,背景区域为0)。最后计算logits
中预测类别为猫的mask与GT mask的BCELoss(BinaryCrossEntropyLoss
)即可。
4.3 Mask Branch预测使用
这里再次强调一遍,在真正预测推理的时候,输入Mask分支的目标是由Fast R-CNN分支提供的。
如上图所示,通过Fast R-CNN分支,我们能够得到最终预测的目标边界框信息以及类别信息。接着将目标边界框信息提供给Mask分支就能预测得到该目标的logits
信息,再根据Fast R-CNN分支提供的类别信息将logits
中对应该类别的Mask信息提取出来,即针对该目标预测的Mask信息(shape为28x28
,由于通过sigmoid
激活函数,数值都在0到1之间)。然后利用双线性插值将Mask缩放到预测目标边界框大小,并放到原图对应区域。接着通过设置的阈值(默认为0.5)将Mask转换成一张二值图,比如预测值大于0.5的区域设置为前景剩下区域都为背景。现在对于预测的每个目标我们就可以在原图中绘制出边界框信息,类别信息以及目标Mask信息。
相关文章:

深度学习学习笔记(32周)
目录 摘要 abstract 1 Mask R-CNN 2 RoI Align 2.1 RoIPool实验 2.2 RoIAlign实验 3 Mask Branch(FCN) 4 其他细节 4.1 Mask R-CNN损失 4.2 Mask分支损失 4.3 Mask Branch预测使用 摘要 Mask R-CNN是2017年发表的文章,一作是何恺明大神,没错就…...

Web3 开发者的机遇与挑战:技术趋势与职业发展
随着 Web3 技术的迅速发展,互联网的未来正朝着去中心化、用户主权、隐私保护等方向演进。作为 Web3 生态的核心力量,Web3 开发者在推动这一变革中扮演着至关重要的角色。无论是在区块链技术、智能合约开发、去中心化应用(DApp)的构…...
探索robots.txt:网站管理者的搜索引擎指南
在数字时代,网站如同企业的在线名片,其内容和结构对搜索引擎的可见性至关重要。而在这背后,有一个默默工作的文件——robots.txt,它扮演着搜索引擎与网站之间沟通桥梁的角色。本文将深入探讨robots.txt的功能、编写方法及其在现代…...

LM Studio本地调用模型的方法
首先需要下载LM Studio,(LM Studio - Discover, download, and run local LLMs)安装好后,需要对index.js文件进行修改,主要是对相关源hugging face的地址修改。 以macOS为例: cd /Applications/LM\ Studi…...

防火墙安全综合实验
防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一:根据下表,完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List:10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…...

uniapp 编译生成鸿蒙正式app步骤
1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…...

【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。 首先&a…...

ubuntu安装VMware报错/dev/vmmon加载失败
ubuntu安装VMware报错/dev/vmmon加载失败,解决步骤如下: step1:为vmmon和vmnet组件生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout VMW.priv -outform DER -out VMW.der -nodes -days 36500 -subj "/CNVMware/"ste…...
web前端布局--使用element中的Container布局容器
前端页面,跟Qt中一样,都是有布局设置的。 先布局,然后再在各布局中添加显示的内容。 Element网站布局容器:https://element.eleme.cn/#/zh-CN/componet/container 1.将element相应的布局容器代码layout,粘贴到vue项…...

手写一个C++ Android Binder服务及源码分析
手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…...
git rebase发生冲突时 ☞ 解决冲突
参考:特性分支 Rebase 主干分支...

【通俗易懂说模型】反向传播(附多元分类与Softmax函数)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)
7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…...
计算机视觉的研究方向、发展历程、发展前景介绍
以下将分别从图像分类、目标检测、语义分割、图像分割(此处应主要指实例分割)四个方面,为你介绍研究生人工智能计算机视觉领域的应用方向、发展历程以及发展前景。 文章目录 1.图像分类应用方向发展历程发展前景 2.目标检测应用方向发展历程…...
反转字符串-双指针法,
在 Java 中,使用 双指针法 反转字符串是一种高效且直观的方法。以下是详细的解析和代码实现。 1. 双指针法的核心思想 使用两个指针:一个指向字符串的起始位置(left),另一个指向字符串的末尾位置(right&…...

亚博microros小车-原生ubuntu支持系列 27、手掌控制小车运动
背景知识 本节跟上一个测试类似:亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动-CSDN博客 都是基于MediaPipe hands做手掌、手指识别的。 为了方便理解,在贴一下手指关键点分布。手掌位置就是靠第9点来识别的。 2、程序说明…...
STM32 HAL库 CANbus通讯(C语言)
#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...
ML.NET库学习005:基于机器学习的客户细分实现与解析
文章目录 ML.NET库学习005:基于机器学习的客户细分实现与解析项目主要目的和原理目的原理 项目概述实现的主要功能主要流程步骤使用的主要函数方法关键技术 主要功能和步骤功能详细解读详细步骤解析 数据集及其处理步骤数据集处理步骤关键处理步骤原理1. 数据清洗与…...

(2/100)每日小游戏平台系列
新增一个猜单词小游戏! ------------------------------------------------------------------------------------------------------------------ 猜单词游戏玩法 游戏规则: 游戏会从一个预设的单词列表中随机选择一个单词。玩家有 6 次机会来猜测单…...
【Linux Oracle】杂货铺 日常实用2024
1.跨服务器移动文件 passwd=^T^bxxxx `/usr/bin/expect <<-EOF set timeout -1 spawn scp -r ${BATCH_TIME} sxnhtc@192.168.3.x:${EXP_MCRO_DIR}/ expect "*password:" send "$passwd\r" interact expect eof EOF` curl -k -X GET https://192.16…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...