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

MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

目录

1、DeepLab系列简介

1.1.DeepLabV1

1.1.1创新点:

1.1.2. 动机:

1.1.3. 应对策略:

1.2.DeepLabV2

1.2.1.创新点:

1.2.2.动机

1.2.3. 应对策略:

1.3.DeepLabV3

1.3.1创新点:

1.3.2. 动机:

1.3.3. 应对策略:

1.3.4. 主要贡献:

1.4.DeepLabV3+

1.4.1.创新点:

1.4.2. 动机:

1.4.3. 应对策略:

2、DeepLabV3详解

2.1.提出问题

2.2.提出解决方案

2.2.1.用级联的方式设计了空洞卷积模块

2.2.2. 使用了Multi-Grid 策略

2.2.3.将 batch normalization 加入到 ASPP模块.

Atrous Spatial Pyramid Pooling(ASPP):

2.2.4.将全局上下文信息纳入模型

2.2.5.取消DenseCRF

2.3.训练策略

2.3.1.Learning rate policy:

2.3.2.Crop size:

2.3.3.Batch normalization:

2.3.4.Upsampling logits:

2.3.5.Data augmentation:

2.4.主要代码

3.实验结果

4.总结


1、DeepLab系列简介

1.1.DeepLabV1

作者发现Deep Convolutional Neural Networks (DCNNs) 能够很好的处理的图像级别的分类问题,因为它具有很好的平移不变性(空间细节信息已高度抽象),但是DCNNs很难处理像素级别的分类问题,例如姿态估计和语义分割,它们需要准确的位置信息。

1.1.1创新点:

  • 将深度神经网络DCNN与全连接CRF结合起来,提高图像分割的分割精度。

  • 提出空洞卷积的思想。

  • 应用尝试了多尺度、多层次的信息融合。

1.1.2. 动机:

DCNN应用在语义分割任务上存在两个缺陷:

  • 重复堆叠的池化下采样操作导致分辨率大幅下降,位置信息丢失难以恢复。

  • 从分类器获得以对象为中心的决策需要空间转换的不变性,忽略对细节处的把控,这从本质上限制了DCNN模型的空间准确性。

分类任务具有空间不变性,图像的仿射变换不会影响最后的分类结果,而且恰恰通过仿射变换等操作(数据增广)可以增加数据量,提高模型的精度;但是像分割和检测这类问题,不具有空间不变性。

1.1.3. 应对策略:

  • 空洞卷积

  • Fully-connected Conditional Random Field (CRF)

1.2.DeepLabV2

1.2.1.创新点:

  • 空洞卷积,作为密集预测任务的强大工具。空洞卷积能够明确地控制DCNN内计算特征响应的分辨率。它还允许我们有效地扩大滤波器的视野以并入较大的上下文,而不增加参数的数量或计算量。

  • 提出了空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP)),以多尺度的信息得到更精确的分割结果。ASPP并行的采用多个采样率的空洞卷积层来探测,以多个比例捕捉对象以及图像上下文。

  • 通过组合DCNN和概率图模型(CRF),改进分割边界结果。在DCNN中最大池化和下采样组合实现可平移不变性,但这对精度是有影响的。通过将最终的DCNN层响应与全连接的CRF结合来克服这个问题。

1.2.2.动机

DCNNs中语义分割存在三个挑战:

  • 连续下采样和池化操作,导致最后特征图分辨率低。

  • 图像中存在多尺度的物体(相比V1而言提出的新的挑战

  • 空间不变性导致细节信息丢失

1.2.3. 应对策略:

  • 移除部分池化操作,使用空洞卷积。

  • 利用不同膨胀因子的空洞卷积融合多尺度信息—atrous spatial pyramid pooling(ASPP)(新的创新点

  • 全连接CRF。

1.3.DeepLabV3

1.3.1创新点:

  • 增加了多尺度(multiple scales)分割物体的模块

  • 设计了串行和并行的空洞卷积模块,采用多种不同的atrous rates(采样率)来获取多尺度的内容信息

1.3.2. 动机:

DCNN中语义分割存在三个挑战:

  • 连续下采用和重复池化,导致最后特征图分辨率低

  • 图像中存在多尺度的物体

1.3.3. 应对策略:

  • 使用空洞卷积,防止分辨率过低情况

  • 串联不同膨胀率的空洞卷积或者并行不同膨胀率的空洞卷积(v2的ASPP),来获取更多上下文信息

1.3.4. 主要贡献:

  • 重新讨论了空洞卷积的使用,这让我们在级联模块和空间金字塔池化的框架下,能够获取更大的感受野从而获取多尺度信息

  • 改进了ASPP模块:由不同采样率的空洞卷积和BN层组成,我们尝试以级联或并行的方式布局模块

  • 讨论了一个重要问题:使用大采样率的3×3的空洞卷积,因为图像边界的原因无法捕捉远距离信息,会退化为1×1的卷积, 作者提出将图像级特征融合到ASPP模块中

  • 阐述了训练细节并分享了训练经验,论文提出的”DeepLabv3”改进了以前的工作,获得了很好的结果

1.4.DeepLabV3+

1.4.1.创新点:

  • 更深的Xception结构,不同的地方在于不修改entry flow network的结构,为了快速计算和有效的使用内存

  • 所有的max pooling结构被stride=2的深度可分离卷积代替

  • 每个3x3的depthwise convolution都跟BN和Relu

  • 将改进后的Xception作为encodet主干网络,替换原本DeepLabv3的ResNet101

1.4.2. 动机:

语义分割主要面临两个问题:

  • 物体的多尺度问题(DeepLabV3解决)

  • DCNN的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失(DeepLabV3+解决目标)

1.4.3. 应对策略:

  • 改进Xception,层数增加

  • 将所有最大值池化层替换为带步长的深度可分离卷积层

2、DeepLabV3详解

2.1.提出问题

首先,语义分割问题存在两大挑战:

  • 第一个挑战:连续池化操作或卷积中的stride导致的特征分辨率降低。这使得DCNN能够学习更抽象的特征表示。然而,这种不变性可能会阻碍密集预测任务,因为不变性也导致了详细空间信息的不确定。为了克服这个问题,提倡使用空洞卷积。

  • 第二个挑战:多尺度物体的存在。几种方法已经被提出来处理这个问题,在本文中我们主要考虑了这些工作中的四种类型,如图1所示。

image-20210924230358992

图1 用于捕获多尺度上下文的代替体系结构


 

  • 第一种:Image Pyramid,将输入图片放缩成不同比例,分别应用在DCNN上,将预测结果融合得到最终输出

  • 第二种:Encoder-Decoder,将Encoder阶段的多尺度特征运用到Decoder阶段上来恢复空间分辨率

  • 第三种:在原始模型的顶端叠加额外的模块,以捕捉像素间长距离信息。例如Dense CRF,或者叠加一些其他的卷积层

  • 第四种:Spatial Pyramid Pooling空间金字塔池化,使用不同采样率和多种视野的卷积核,以捕捉多尺度对象

DeepLabV3的提出是为了解决多尺度下的目标分割问题。如图2所示,不同目标在图中的尺寸大小不同,这也导致模型考虑不同尺寸的分割精度。

image-20210924225733868

图2 多尺度目标分割示例


 

2.2.提出解决方案

2.2.1.用级联的方式设计了空洞卷积模块

具体而言,DeepLabV3取ResNet中最后一个block(ResNet的block4),并将他们级联到了一起,如图3所示。

image-20210924231236147

图3 带Atrous和不带Atrous卷积的级联模块


 

有三个3×3卷积在这些块中,除了最后一个块,其余的模块中最后的一个卷积步长为2,类似于原来的ResNet。这么做背后的动机是,引入的stride使得更深的模块更容易捕获长距离的信息。如图3(a),整个图像的特征都可以汇聚在最后一个小分辨率的特征图中。

然而,我们发现连续的stride对语义分割是有害的,会造成细节信息的丢失(如下表)。

image-20210924231439096

表1 使用ResNet-50和block7 和不同的输出步长的更深层空洞卷积


 

从表中看得出,输出步长out_stride = 8时占用更多的内存,但同时带来了更好的性能。例如图3(b)中,输出步长为out_stride = 16。这样不增加参数量和计算量的同时有效的缩小了步幅。

2.2.2. 使用了Multi-Grid 策略

受到了采用不同大小网格层次结构的多重网格方法的启发,我们提出的模型在block4和block7中采用了不同的空洞率。

2.2.3.将 batch normalization 加入到 ASPP模块.

Atrous Spatial Pyramid Pooling(ASPP):

image-20210924235518873

图6 Deeplab系列ASPP结构


 

上图是DeeplabV2中的ASPP,在特征顶部映射图使用了四中不同采样率的空洞卷积。我这表明以不同尺度采样时有效的,在Deeolabv3中向ASPP中添加了BN层。不同采样率的空洞卷积可以有效捕获多尺度信息,但会发现随着采样率的增加,滤波器有效权重(权重有效的应用在特征区域,而不是填充0)逐渐变小。

当output_stride=8时,加倍了采样率。所有特征通过1x1级联到一起,生成最终的分数。

ASPPModule代码:

class ASPPModule(nn.Layer):"""Atrous Spatial Pyramid Pooling.Args:aspp_ratios (tuple): The dilation rate using in ASSP module.in_channels (int): The number of input channels.out_channels (int): The number of output channels.align_corners (bool): An argument of F.interpolate. It should be set to False when the output size of featureis even, e.g. 1024x512, otherwise it is True, e.g. 769x769.use_sep_conv (bool, optional): If using separable conv in ASPP module. Default: False.image_pooling (bool, optional): If augmented with image-level features. Default: False"""def __init__(self,aspp_ratios,in_channels,out_channels,align_corners,use_sep_conv=False,image_pooling=False,data_format='NCHW'):super().__init__()self.align_corners = align_cornersself.data_format = data_formatself.aspp_blocks = nn.LayerList()for ratio in aspp_ratios:if use_sep_conv and ratio > 1:conv_func = layers.SeparableConvBNReLUelse:conv_func = layers.ConvBNReLUblock = conv_func(in_channels=in_channels,out_channels=out_channels,kernel_size=1 if ratio == 1 else 3,dilation=ratio,padding=0 if ratio == 1 else ratio,data_format=data_format)self.aspp_blocks.append(block)out_size = len(self.aspp_blocks)if image_pooling:self.global_avg_pool = nn.Sequential(nn.AdaptiveAvgPool2D(output_size=(1, 1), data_format=data_format),layers.ConvBNReLU(in_channels,out_channels,kernel_size=1,bias_attr=False,data_format=data_format))out_size += 1self.image_pooling = image_poolingself.conv_bn_relu = layers.ConvBNReLU(in_channels=out_channels * out_size,out_channels=out_channels,kernel_size=1,data_format=data_format)self.dropout = nn.Dropout(p=0.1)  # drop ratedef forward(self, x):outputs = []if self.data_format == 'NCHW':interpolate_shape = paddle.shape(x)[2:]axis = 1else:interpolate_shape = paddle.shape(x)[1:3]axis = -1for block in self.aspp_blocks:y = block(x)y = F.interpolate(y,interpolate_shape,mode='bilinear',align_corners=self.align_corners,data_format=self.data_format)outputs.append(y)if self.image_pooling:img_avg = self.global_avg_pool(x)img_avg = F.interpolate(img_avg,interpolate_shape,mode='bilinear',align_corners=self.align_corners,data_format=self.data_format)outputs.append(img_avg)x = paddle.concat(outputs, axis=axis)x = self.conv_bn_relu(x)x = self.dropout(x)return x

2.2.4.将全局上下文信息纳入模型

具有不同 atrous rates 的 ASPP 能够有效的捕获多尺度信息。不过,论文发现,随着sampling rate的增加,有效filter特征权重(即有效特征区域,而不是补零区域的权重)的数量会变小,极端情况下,当空洞卷积的 rate 和 feature map 的大小一致时,3 ×3 卷积会退化成 1 ×1:

image-20210924231902861

图4 在65x65尺寸特征图上使用3x3卷积时标准化计数随空洞率的变化


 

为了克服这个问题,并将全局上下文信息纳入模型,采用了图像级特征。具体来说,在模型的最后一个特征图采用全局平均池化,将重新生成的图像级别的特征提供给带256个滤波器(和BN)的1×1卷积,然后双线性插值将特征提升到所需的空间维度。

最后改进后的ASPP包括:

  • (a)一个 1 ×1的卷积与三个3 ×3 的rates=(6,12,18)的空洞卷积,滤波器数量都为256,包含BN层。针对output_stride=16的情况

  • (b)图像级特征,如图5所示。当output_stride=8时,加倍了采样率。然后将所有分支的特征图通过一个1 ×11 ×1卷积(有256个滤波器和BN)concatenate起来,送入最后的1×1卷积以产生最终分数.

image-20210924232337417

图5 ASPP,增加了多级特征图


 

2.2.5.取消DenseCRF

​ CRF

CRF的全称是Conditional Random Field.它的形式如下所示:

可以看出,条件随机场在建模的时候同样需要计算联合概率,只不过这一次参与计算的有两部分随机变量——X和Y。一般来说,我们把X称作观察变量,也就是已知的变量;Y称作目标变量或者隐含变量,是我们想知道的变量。

比方说图像分割的问题,X就是图像的像素,Y就是每个像素所归属的类别。当然对于二维的图像问题还是有点复杂,那么我们用一个简单的一维问题做了例子:比方说自然语言处理中的词性标注问题,那么它的建模形式如下所示:

​ Dense CRF

我们看过了它的模型形式,下面直接来看看模型的能量函数表达形式:

可以看出每一个像素都有一个unary的函数,也就是说在这个特征函数里w,剩下的参数都出现在图像的像我们只考虑当前像素的类别,而暂时不考虑别的像素的类别信息。

而后面的pairwise函数里,每一个像素的类别都和其他像素计算一个energy feature。于是就有了上面的公式形式。注意这里的能量函数是所有像素点的联合能量和不是某一个像素点的能量,所以后面的pairwise项,我们有n(n-1)/2组特征,总的来说,特征数量是像素数量的平方级别,如果我们有一张100万像素的图片,那么我们就会建立4950亿组pairwise特征。正是因为这种复杂的形式,所以这个模型被称作Dense CRF。满满的全是dense啊!

关于unary函数的内容,我们可以尽情发挥,在denseCRF中我们并没有对这一部分做详细的限制。因此关于这部分我们就暂时略去不谈了,在后面的文章中我们会重新回来,挖掘unary函数的潜力。下面我们专注于解决pairwise这个大坑。

下面我们讲piarwise部分展开,其中

相同label条件下,能量才可以相互传导。具体来说,“一个像素可能是飞机”的能量可以和“另一个像素可能是飞机”的能量相互传导,从而增加或者减少后者“可能是飞机”的能量,从而影响“可能是飞机”的概率,而“一个像素可能是飞机”的能量是不能影响“另一个像素是人”的概率的。

文章中也提到了,这个简单地一刀切似乎有点不人性。拿Pascal-VOC中的20类+背景类来说,有些类别之间的相似性是很强的,而另外一些类别则完全不相似,所以作者后面提到了一些学习相关的事情,这里我们就不再深入下去了。

加和项里面就是经典的权重*feature的套路了,其中

这一项以特征的形式表示了不同像素之前的“亲密度”。前面我们提到了特征不同于tabular形式的factor,我们看不到表格,只能看到公式。上面的公式中,第一项被称作appearance kernel,第二项被称作smooth kernel。这里面有很多变量,我们一一来看。

appearance kernel里面的p表示像素的位置——position,我们的图像是2维的,那么position就有2维。I表示图像的像素值——Intensity,我们的图像是彩色的,那么Intensity就有3维。分式下面的两个参数无论从位置还是长相都像高斯分布中的方差,这里的含义也差不多的。

于是乎我们可以看出,如果两个像素距离近且颜色近,那么这个feature特征就会很强,反之则不强。同时分母也控制了强弱性,分母越大越难强起来。其实这一项和图像处理中的bilateral filter很像。我们相当于在一个5维的空间内寻找相近的像素对并给予它们的特征加强。

​ DeepLabV3 取消DenseCRF的原因

语义分割与分类不同。分类主要是识别物体,而语义分割不但要识别物体,还要找出物体的位置信息。DCNN卷积网络越深,其位置信息丢失的越严重。所以在deeplab v1/v2中用到了,全局CRF增强其位置信息。

但是在deeplabv3中,使用大采样率的3X3空洞卷积,图像边界响应无法捕捉远距离信息,会退化为1×1的卷积, 所以deeplabv3将图像级特征融合到ASPP模块中。融合图像级特征,相当于融合了其位置信息。所以就不需要最后再用CRF了。这就是用了CRF,其精度也增加的不多的原因。

2.3.训练策略

2.3.1.Learning rate policy:

2.3.2.Crop size:

  • 为了大采样率的空洞卷积能够有效,需要较大的图片大小;否则,大采样率的空洞卷积权值就会主要用于padding区域。

  • 在Pascal VOC 2012数据集的训练和测试中我们采用了513的裁剪尺寸。

2.3.3.Batch normalization:

  • 我们在ResNet之上添加的模块都包括BN层

  • 当output_stride=16时,采用batchsize=16,同时BN层的参数做参数衰减0.9997。

  • 在增强的数据集上,以初始学习率0.007训练30K后,冻结BN层参数,然后采用output_stride=8,再使用初始学习率0.001在PASCAL官方的数据集上训练30K。

  • 训练output_stride=16比output_stride=8要快很多,因为其中间的特征映射在空间上小四倍。但output_stride=16在特征映射上相对粗糙,快是因为牺牲了精度。

2.3.4.Upsampling logits:

  • 在先前的工作上,我们是将output_stride=8的输出与Ground Truth下采样8倍做比较。

  • 现在我们发现保持Ground Truth更重要,故我们是将最终的输出上采样8倍与完整的Ground Truth比较。

2.3.5.Data augmentation:

在训练阶段,随机缩放输入图像(从0.5到2.0)和随机左-右翻转

2.4.主要代码

DeepLabV3

class DeepLabV3(nn.Layer):"""The DeepLabV3 implementation based on PaddlePaddle.The original article refers toLiang-Chieh Chen, et, al. "Rethinking Atrous Convolution for Semantic Image Segmentation"(https://arxiv.org/pdf/1706.05587.pdf).Args:Please Refer to DeepLabV3P above."""def __init__(self,num_classes, #分割类别数backbone, # 主干网络backbone_indices=(3, ),aspp_ratios=(1, 6, 12, 18), # aspp 空洞卷积率aspp_out_channels=256, # aspp输出通道数align_corners=False, # 是否对齐pretrained=None): # 是否预处理super().__init__()self.backbone = backbone #主干网络backbone_channels = [backbone.feat_channels[i] for i in backbone_indices]#定义头模块self.head = DeepLabV3Head(num_classes, backbone_indices,backbone_channels, aspp_ratios,aspp_out_channels, align_corners) self.align_corners = align_cornersself.pretrained = pretrainedself.init_weight() # 初始化权重def forward(self, x):feat_list = self.backbone(x)logit_list = self.head(feat_list)return [# 执行上采样,填充方式使用‘bilinear’F.interpolate(logit,paddle.shape(x)[2:],mode='bilinear',align_corners=self.align_corners) for logit in logit_list]def init_weight(self):if self.pretrained is not None:utils.load_entire_model(self, self.pretrained) # 载入预处理模型

​ DeepLabV3Head

class DeepLabV3Head(nn.Layer):"""The DeepLabV3Head implementation based on PaddlePaddle.Args:Please Refer to DeepLabV3PHead above."""def __init__(self, num_classes, backbone_indices, backbone_channels,aspp_ratios, aspp_out_channels, align_corners):super().__init__()#定义ASPP模块self.aspp = layers.ASPPModule(aspp_ratios,backbone_channels[0],aspp_out_channels,align_corners,use_sep_conv=False,image_pooling=True)#定义分类头self.cls = nn.Conv2D(in_channels=aspp_out_channels,out_channels=num_classes,kernel_size=1)self.backbone_indices = backbone_indicesdef forward(self, feat_list):logit_list = []x = feat_list[self.backbone_indices[0]]x = self.aspp(x)logit = self.cls(x)logit_list.append(logit)return logit_list

3.实验结果

我们首先实验级联更多的空洞卷积模块。

ResNet50:

使用ResNet-50时,我们探究output_stride的影响。如表1所示。

  • 当output_stride为256时,由于严重的信号抽取,性能相比其他output_stride大大的下降了。

  • 当使用不同采样率的空洞卷积时,性能上升,这说明了语义分割中使用空洞卷积的必要性。

ResNet-50 vs. ResNet-101:

用更深的模型,并改变级联模块的数量。

image-20210924233250610

表2 使用不同叠块数的ResNet-50和ResNet-101时,使用输出步长Output_stride= 16


 

  • 当block增加,性能也随之增加。

  • 随着添加更多的block,提升变得更小。

  • 值得注意的是,ResNet-50使用block7会稍微降低性能,同时ResNet-101使用后仍然可以提升性能。

Multi-grid:

采用Multi-gird策略,在ResNet-101使用变体残差模块。block4和其他添加进来的block中,主分支中的三个卷积都使用空洞卷积,采样率设置Multi-gird策略。

image-20210924233654968

表3 使用ResNet-101对不同叠块数采用多重网格法,Output_stride = 16。


 

实验观察到的:

Inference strategy on val set:

模型训练阶段使用output_stride=16,在推理过程中应用output_stride=8以获得更精细的特征图。

image-20210924233908829

表4 推理策略. MG:多重网络. OS: 输出步长. MS: 多尺度输入. Flip: 输入左右翻转.


 

  • 评估时output_stride=8比output_stride=16性能提高了1.39%。

  • 使用多尺度输入(scales={0.5, 0.75, 1.0, 1.25, 1.5, 1.75})和左-右翻转,进行数据增强后,进一步提高了性能。

  • 最后,计算每个尺度和翻转图像的平均概率来作为最终结果。

Atrous Spatial Pyramid Pooling:

DeepLab V3的ASPP模块与DeepLab V2的主要区别在于,增加了BN层,增加了图像级别的特征。表5记录了ASPP模块block4使用multi-grid策略和图像级特征后的效果。

image-20210924234255382

表5 在Output_stide = 16下,使用多重网格方法和图像级特征的ASPP


 

Inference strategy on val set:

推断期间使用output_stride = 8,采用多尺度输入和左-右翻转数据增强。

image-20210924234451247

表6 推理策略 MG:多重网格方法。 ASPP:空洞空间金字塔。 OS:Output_stride。 MS:多尺度输入。 Flip: 输入左右翻转。COCO: 在MS-COCO上预训练。


 

4.总结

总的来说,本文从DeepLab系列出发,分别介绍了各版本的Deeplab的动机,并给予动机进行改进的创新点和策略。然后针对DeeplabV3详细的解释了该模型从问题的提出到实验结果相关内容。从解决问题的角度出发,DeeplabV3主要解决了物体的多尺度问题,在DCNN问题上并没有进行深入讨论。DCNN的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失,该问题于DeeplabV3+中进行了深入的讨论与解决。从实验结果来看,DeeplabV3表现出相较于以前版本更好的性能。

相关文章:

MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

目录 1、DeepLab系列简介 1.1.DeepLabV1 1.1.1创新点: 1.1.2. 动机: 1.1.3. 应对策略: 1.2.DeepLabV2 1.2.1.创新点: 1.2.2.动机 1.2.3. 应对策略: 1.3.DeepLabV3 1.3.1创新点: 1.3.2. 动机&am…...

road to master

零、学习计划 数据库相关 索引 我以为我对数据库索引很了解,直到我遇到了阿里面试官 - 知乎 (zhihu.com)给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)聚集索引(聚类索引)与非聚集索引(非聚类…...

<深度学习基础> 激活函数

为什么需要激活函数?激活函数的作用? 激活函数可以引入非线性因素,可以学习到复杂的任务或函数。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从…...

评价指标BLUE了解

BLEU (Bilingual Evaluation Understudy,双语评估基准)是一组度量机器翻译和自然语言生成模型性能的评估指标。BLEU指标是由IBM公司提出的一种模型评估方法,以便在机器翻译领域中开发更好的翻译模型。BLEU指标根据生成的句子与人工参考句子之间的词、短语…...

5G网关如何提升智慧乡村农业生产效率

得益于我国持续推进5G建设,截至今年5月,我国5G基站总数已达284.4万个,覆盖全国所有地级市、县城城区和9成以上的乡镇镇区,实现“镇镇通5G”,全面覆盖了从城市到农村的延伸。 依托5G网络的技术优势,智慧乡村…...

微信小程序分享后真机参数获取不到和部分参数不能获取问题问题解决

微信小程序的很多API,都是BUG,近期开发小程序就遇到了分享后开发工具可以获取参数,但是真机怎么都拿不到参数的问题 一、真机参数获取不到问题解决 解决方式: 在onLoad(options) 中。 onLoad方法中一定要有options 这个参数。…...

Confluence使用教程(用户篇)

1、如何创建空间 可以把空间理解成一个gitlab仓库,空间之间相互独立,一般建议按照部门(小组的人太少,没必要创建空间)或者按照项目分别创建空间 2、confluence可以创建两种类型的文档:页面和博文 从内容上来…...

网络基础知识socket编程

目录 网络通信概述网络互连模型:OSI 七层模型TCP/IP 四层/五层模型数据的封装与拆封 IP 地址IP 地址的编址方式IP 地址的分类特殊的IP 地址如何判断2 个IP 地址是否在同一个网段内 TCP/IP 协议TCP 协议TCP 协议的特性TCP 报文格式建立TCP 连接:三次握手关…...

基于SpringBoot的员工(人事)管理系统

基于SpringBoot的员工(人事)管理系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 项目名称:基于SPringBoot的员工管理系统 项目架构:B/S架构 开发语言:Java语言 前端技术:BootS…...

【计算机网络】序列化与反序列化

文章目录 1. 如何处理结构化数据?序列化 与 反序列化 2. 实现网络版计算器1. Tcp 套接字的封装——sock.hpp创建套接字——Socket绑定——Bind将套接字设置为监听状态——Listen获取连接——Accept发起连接——Connect 2. 服务器的实现 ——TcpServer.hpp初始化启动…...

Linux内核学习(七)—— 定时器和时间管理(基于Linux 2.6内核)

目录 一、内核中的时间概念 二、节拍率:HZ 实时时钟 系统定时器 三、定时器 系统定时器是一种可编程硬件芯片,能以固定频率产生定时器中断,它所对应的中断处理程序负责更新系统时间,也负责执行需要周期性运行的任务。 一、内…...

Tortoise Git(乌龟git)常用命令总结

查看全局和本地 Git 配置 打开命令行终端(如 Git Bash),分别执行以下命令查看全局和本地的 Git 配置信息: git config --global -l git config --local -l确保配置中没有任何与 SSH 相关的设置 移除全局和本地 SSH 相关配置&…...

SSM商城项目实战:物流管理

SSM商城项目实战:物流管理 在SSM商城项目中,物流管理是一个重要的功能模块。通过物流管理,可以实现订单的配送、运输和签收等操作。本文将介绍如何在SSM商城项目中实现物流管理功能的思路和步骤代码。 实现SSM商城项目中物流管理的思路总结如…...

nlp系列(7)三元组识别(Bert+CRF)pytorch

模型介绍 在实体识别中:使用了Bert模型,CRF模型 在关系识别中:使用了Bert模型的输出与实体掩码,进行一系列变化,得到关系 Bert模型介绍可以查看这篇文章:nlp系列(2)文本分类&…...

Druid配置类、Dubbo配置类、Captcha配置类、Redis配置类、RestTemplate配置类

DruidConfig配置类package com.xdclass.app.config;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.V…...

Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图

Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图 作者:安静到无声 个人主页 目录 Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图前言代码讲解总结完整代码推荐专栏前言 本博客将详细解释如何使用Python中的pyech…...

MySQL 基本操作

目录 数据库的列类型 数据库基本操作 SQL语言规范 SQL语句分类 查看表,使用表 管理数据库 创建数据库和表 删除数据库和表 向数据表中添加数据 查询数据表中数据 修改数据表的数据 删除数据表中数据 修改表明和表结构 扩展表结构(增加字段&…...

HHDESK一键改密功能

HHDESK新增实用功能——使用SSH连接,对服务器/端口进行密码修改。 1 测试 首页点击资源管理——客户端,选择需要修改的连接; 可以先对服务器及端口进行测试,看是否畅通; 右键——测试——ping; 以及右…...

瞬态电压抑制器(TVS)汽车级 SZESD9B5.0ST5G 工作原理、特性参数、封装形式

什么是汽车级TVS二极管? TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护,防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中,由于车辆启…...

ChatGPT 一条命令总结Mysql所有知识点

想学习Mysql的同学,可以使用ChatGPT直接总结mysql所有的内容与知识点大纲 输入 总结Mysql数据库所有内容大纲与大纲细分内容 ChatGPT不光生成内容,并且直接完成了思维导图。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Offi…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...