计算机视觉的应用25-关于Deeplab系列语义分割模型的应用场景,以及空洞卷积的介绍

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用25-关于Deeplab系列语义分割模型的应用场景,以及空洞卷积的介绍。Deeplab是Google研发的一系列深度学习模型,主要用于图像语义分割任务,其在众多应用场景中展现出卓越性能,如自动驾驶、医学影像分析、遥感图像处理、无人机场景理解等。该模型通过精确地对图像中的每个像素进行分类,实现图像内容的细粒度理解与解析。

Deeplab模型结构基于卷积神经网络(CNN),并引入了空洞卷积(Atrous Convolution)和空间金字塔池化(Spatial Pyramid Pooling)等创新技术以获取多尺度上下文信息。其中,Deeplab v1率先采用深度可分离卷积提升模型效率;Deeplab v2引入了条件随机场(CRF)优化输出结果;Deeplab v3进一步使用编码器-解码器结构以及空洞卷积实现更大感受野;而Deeplab v3+则在v3的基础上增加了语义分支,有效融合了边界信息,提升了边缘分割效果。Deeplab系列模型以其高效、精准的特性,在图像语义分割领域发挥了重要作用,并为相关应用提供了强大的技术支持。
在这里插入图片描述

文章目录

  • 一、Deeplab应用场景:智慧城市与自动驾驶
    • 智慧城市建设中的应用
    • 自动驾驶领域的关键角色
  • 二、Deeplab模型结构篇:深度学习与空洞卷积
    • 深度学习架构设计
    • 空洞卷积(Atrous Convolution)原理
  • 三、优化与拓展篇: Deeplabv3+ 的 Encoder-Decoder 结构
    • Encoder-Decoder 架构介绍
    • 边界检测与精细化分割
  • 四、Deeplabv3+模型的数学原理
  • 五、Deeplabv3+模型的代码实现

一、Deeplab应用场景:智慧城市与自动驾驶

智慧城市建设中的应用

智慧城市与自动驾驶是现代科技发展的重要成果,在智慧城市建设中发挥着关键作用。智慧城市通过集成物联网、大数据、云计算、人工智能等先进技术,实现城市运行的智能化和高效化。例如,交通管理方面,通过部署智能交通信号系统,能够实时分析车流量数据,自动调整红绿灯时长,有效缓解交通拥堵;同时,自动驾驶技术在智慧城市的框架下得以广泛应用,无人驾驶车辆可根据路况信息自主规划行驶路线,提高道路使用效率,减少交通事故。

在未来的智慧城市中,小明早上准备去上班,他预约的自动驾驶汽车准时到达家门口。车辆通过车载传感器和云端数据,实时获取路况信息,避开拥堵路段,选择最优路径。行驶过程中,车辆与城市交通管理系统联动,根据实时信号灯信息调整车速,确保行车安全且高效。此外,当车辆驶过市区的智慧停车场时,通过物联网技术自动识别并完成停车缴费,全程无需人工操作。这就是智慧城市与自动驾驶在实际生活中的具体应用,极大地提升了城市生活的便利性和出行效率。

自动驾驶领域的关键角色

在智慧城市与自动驾驶这一前沿领域中,有几个关键角色发挥着至关重要的作用:

  1. 自动驾驶汽车制造商:他们是技术的直接实施者和硬件提供者,如特斯拉、Waymo等公司,负责研发并生产具备高级自动驾驶功能的智能车辆,通过集成传感器(如激光雷达、摄像头)、高精度地图以及强大的AI算法,使车辆能够实现自主导航、避障等功能。

  2. AI与算法开发者:他们是自动驾驶的核心驱动力,通过深度学习、机器视觉等先进技术训练模型,让车辆能识别路况、理解交通规则,并做出实时决策。例如,阿里云、百度Apollo等企业就为自动驾驶提供了强大的计算平台和算法支持。

  3. 高精地图服务商:高精度地图是自动驾驶汽车的“眼睛”,四维图新、HERE等公司提供的厘米级精度地图数据,帮助自动驾驶汽车精确了解道路信息,包括车道线、交通标志、地形地貌等。

  4. 智慧城市基础设施建设者:政府及相关部门在智慧城市建设中,通过部署5G网络、V2X通信设施等,为自动驾驶提供高效稳定的数据传输环境,同时优化交通信号系统,使其能与自动驾驶车辆进行交互,提升整体交通效率。

设想一下,在一个高度智能化的城市中,你预约了一辆自动驾驶出租车。这辆车由特斯拉制造,搭载了先进的AI算法和高精度地图,可以自动规划最优路线,避开拥堵路段,准确识别红绿灯和行人。在行驶过程中,它通过5G网络与城市交通管理系统实时交互,获取最新的交通信息,确保安全高效的接送服务。这就是智慧城市与自动驾驶技术相结合的具体应用实例。

二、Deeplab模型结构篇:深度学习与空洞卷积

深度学习架构设计

深度学习与空洞卷积是一种在计算机视觉和图像处理领域中广泛应用的技术。深度学习架构设计中,空洞卷积(又称为扩张卷积)是一种对传统卷积操作的改进,它通过在卷积核之间引入额外的间隔(即“空洞”),从而在不增加参数数量的前提下,扩大感受野,获取更大范围的信息。

在传统的卷积神经网络中,每个卷积核在输入特征图上连续滑动并进行计算,而空洞卷积则是在每次滑动时跳过一些像素,这样可以在不牺牲分辨率的情况下,使网络能够捕获更广泛的上下文信息。例如,在识别一张风景照片中的物体时,普通卷积可能只能关注到局部细节,如树叶的纹理;而空洞卷积则能同时考虑树叶及其周围环境,如树干、天空等全局信息,这对于准确识别物体类别至关重要。

生活中的一个类比是,假设你在拼一幅大型拼图,普通卷积就像是紧盯着手中的一小块拼图,只关注其自身的图案和边缘细节;而空洞卷积则像是每隔一段距离就抬头看看整个拼图的大致布局,既能把握局部又能理解全局,使得拼图过程更为高效和准确。这就是空洞卷积在深度学习架构设计中的重要作用。

空洞卷积(Atrous Convolution)原理

深度学习中的空洞卷积(Atrous Convolution),又称为扩张卷积或 dilated convolution,是一种特殊的卷积操作,其核心在于改变了传统卷积核在处理输入特征图时的采样间隔,即在卷积过程中引入了“孔洞”。在标准卷积中,卷积核在每个位置都会与输入特征进行逐点相乘并求和;而在空洞卷积中,卷积核在移动时不连续地跳跃过一些像素,从而增大了感受野而无需增加参数数量或计算复杂度。

具体来说,空洞卷积通过设置一个扩张率(dilation rate)来控制孔洞大小,扩张率越大,卷积核在输入特征图上的步长就越大,能够获取更大范围的信息,这对于图像识别、语义分割等任务尤其有用,可以有效捕获更广阔的空间上下文信息。

生活中的一个生动例子是观察一幅画作。假设我们正在尝试理解这幅画的整体布局和细节。常规卷积就像是以正常视距仔细查看画的每一部分,然后拼接这些局部信息以理解整体。而空洞卷积则像是站在一定距离外,透过望远镜(扩张率)观察画作,每次聚焦在不同区域,虽然跳过了某些局部细节,但却能更快地把握画面的整体结构和远距离元素间的关联。例如,在欣赏一幅风景画时,我们可能不需要关注每一片树叶,而是需要快速感知到树木、山川、河流的大致分布和相互关系,这就是空洞卷积在实际应用中的直观体现。

三、优化与拓展篇: Deeplabv3+ 的 Encoder-Decoder 结构

Encoder-Decoder 架构介绍

Encoder-Decoder结构是深度学习中一种广泛应用的网络架构,特别是在图像分割任务中,如Deeplabv3+模型就采用了这种设计。该结构主要包括两个主要部分:编码器(Encoder)和解码器(Decoder)。

编码器的主要功能是对输入的高分辨率图像进行下采样操作,通过一系列卷积、池化等操作提取特征,逐步减少空间维度,同时增加通道数,从而捕获更高级别的语义信息,但会丢失一些空间细节信息。在Deeplabv3+中,通常使用ResNet或Xception等预训练模型作为编码器,用于高效地提取丰富的深度特征。

解码器则负责对编码器输出的低分辨率、高语义信息特征图进行上采样,恢复到原始输入图像的尺寸,同时结合低层的细节信息,以精确地定位每个像素所属的类别。在Deeplabv3+中,采用空洞卷积(atrous convolution)和跳跃连接(skip connection)等技术,既保留了高层语义特征,又融合了底层的空间细节特征。

生活中的一个生动例子可以这样理解:假设我们要制作一幅精细的城市地图,编码器就像是一个经验丰富的地理学家,他从高空鸟瞰整个城市,虽然看不清每一条小巷的具体情况,但他能快速把握城市的整体布局和各个区域的功能划分(高级语义信息)。而解码器则像是一个细致入微的测绘员,他将地理学家提供的宏观信息与实地测量的详细数据相结合,绘制出既有宏观布局又有微观细节的城市地图。在这个过程中,编码器和解码器相互协作,共同完成了高质量图像分割的任务。

边界检测与精细化分割

Deeplabv3+是一种深度学习模型,主要用于图像语义分割任务,其核心设计采用了Encoder-Decoder结构。Encoder部分主要负责特征提取,通过一系列卷积和下采样操作,捕获图像的高级抽象特征和上下文信息;Decoder部分则负责将这些高层特征与原始图像的低层细节信息进行融合并上采样,以实现对图像中每个像素精确分类的目标。

在Deeplabv3+中,为了提升边界检测和精细化分割的效果,引入了Xception作为Encoder,并结合空洞卷积(atrous convolution)来扩大感受野,获取更丰富的上下文信息。同时,在Decoder部分采用了一种称为“ASPP”(Atrous Spatial Pyramid Pooling)的模块,它能够从多尺度上提取特征,有效解决了物体边缘模糊的问题,提高了边界检测的精度。

此外,Deeplabv3+还创新性地在Encoder和Decoder之间添加了一个简单的解码路径,直接将Encoder的浅层特征与Decoder的上采样特征相连接,这样可以更好地保留和恢复图像的细节信息,从而实现精细化分割。

生活实例解释:假设我们正在使用Deeplabv3+模型帮助一个果园自动识别并标记出不同种类的水果。Encoder就像一位经验丰富的果农,他能快速扫描整个果园,把握全局布局和各类果树的大致特征(如树冠形状、果实颜色等)。Decoder则像是一位细心的采摘工,他不仅关注整体布局,还能细致到每一片叶子、每一个果实的位置和轮廓,确保准确无误地标记出每一类水果的边界。而Encoder-Decoder之间的额外连接就像是果农和采摘工之间的即时沟通,使得采摘工在了解全局的同时,也能注意到局部细微差异,比如某片叶子下的隐藏果实,从而实现对果园图像的精细化分割。

四、Deeplabv3+模型的数学原理

Deeplab系列模型主要基于深度卷积神经网络(如VGG、ResNet等)和空洞卷积(Atrous Convolution)、以及ASPP(Atrous Spatial Pyramid Pooling)模块进行语义分割。

  1. 空洞卷积(Atrous Convolution)
    空洞卷积可以增加感受野而不增加参数量或计算复杂度,其公式可以表示为:
    y [ i , j ] = ∑ k x [ i + r ⋅ k , j + s ⋅ k ] ⋅ w [ k ] y[i,j] = \sum_{k} x[i+r \cdot k, j+s \cdot k] \cdot w[k] y[i,j]=kx[i+rk,j+sk]w[k]
    其中, x x x是输入特征图, y y y是输出特征图, w w w是滤波器权重, ( r , s ) (r,s) (r,s)是空洞率(dilation rate)决定的步长。

  2. Atrous Spatial Pyramid Pooling (ASPP)
    ASPP模块并行地应用多个不同空洞率的卷积层,以捕获多尺度上下文信息,然后将结果concatenate起来。公式上难以直接表达,但可理解为对输入特征图 f f f应用一系列空洞卷积操作:
    f o u t = C o n c a t ( f a t r o u s 1 , f a t r o u s 2 , . . . , f g l o b a l ) f_{out} = Concat\left( f_{atrous1}, f_{atrous2}, ..., f_{global}\right) fout=Concat(fatrous1,fatrous2,...,fglobal)
    其中, f a t r o u s f_{atrous} fatrous代表不同空洞率的空洞卷积输出, f g l o b a l f_{global} fglobal通常是一个全局平均池化层的输出,用于捕获全局上下文信息。
    在这里插入图片描述

  3. Fully Connected Conditional Random Field (CRF)
    在某些版本的Deeplab中,还会在CNN预测后添加全连接条件随机场(CRF)来优化边缘和平滑标签分布,其能量函数可以表示为:
    E ( x ) = ∑ i ψ u ( x i ) + ∑ i , j ψ p ( x i , x j ) E(x) = \sum_{i}\psi_u(x_i) + \sum_{i,j}\psi_p(x_i, x_j) E(x)=iψu(xi)+i,jψp(xi,xj)
    其中 x x x是像素标签向量, ψ u \psi_u ψu是Unary potential,由CNN预测得到, ψ p \psi_p ψp是Pairwise potential,用于建模像素间的相互影响。

以上仅为Deeplab模型的部分数学原理简介,实际模型还包括许多其他细节和优化策略。

五、Deeplabv3+模型的代码实现

使用PyTorch构建Deeplabv3+模型的代码实现,并附带一个简单的数据预处理和模型测试部分。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.models.resnet import resnet18, resnet34, resnet50, resnet101, resnet152# 残差网络
class ResNet(nn.Module):def __init__(self, backbone='resnet50', pretrained_path=None):super().__init__()if backbone == 'resnet18':backbone = resnet18(pretrained=not pretrained_path)self.final_out_channels = 256self.low_level_inplanes = 64elif backbone == 'resnet34':backbone = resnet34(pretrained=not pretrained_path)self.final_out_channels = 256self.low_level_inplanes = 64elif backbone == 'resnet50':backbone = resnet50(pretrained=not pretrained_path)self.final_out_channels = 1024self.low_level_inplanes = 256elif backbone == 'resnet101':backbone = resnet101(pretrained=not pretrained_path)self.final_out_channels = 1024self.low_level_inplanes = 256else:  # backbone == 'resnet152':backbone = resnet152(pretrained=not pretrained_path)self.final_out_channels = 1024self.low_level_inplanes = 256if pretrained_path:backbone.load_state_dict(torch.load(pretrained_path))self.early_extractor = nn.Sequential(*list(backbone.children())[:5])self.later_extractor = nn.Sequential(*list(backbone.children())[5:7])conv4_block1 = self.later_extractor[-1][0]conv4_block1.conv1.stride = (1, 1)conv4_block1.conv2.stride = (1, 1)conv4_block1.downsample[0].stride = (1, 1)def forward(self, x):x = self.early_extractor(x)out = self.later_extractor(x)return out,x# ASPP模块
class _ASPPModule(nn.Module):def __init__(self, inplanes, planes, kernel_size, padding, dilation):super(_ASPPModule, self).__init__()self.atrous_conv = nn.Conv2d(inplanes, planes, kernel_size=kernel_size,stride=1, padding=padding, dilation=dilation, bias=False)self.bn = nn.BatchNorm2d(planes)self.relu = nn.ReLU(inplace=True)self._init_weight()def forward(self, x):x = self.atrous_conv(x)x = self.bn(x)return self.relu(x)def _init_weight(self):for m in self.modules():if isinstance(m, nn.Conv2d):torch.nn.init.kaiming_normal_(m.weight)elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()
# ASPP模块
class ASPP(nn.Module):def __init__(self, inplanes=2048, output_stride=16):super(ASPP, self).__init__()if output_stride == 16:dilations = [1, 6, 12, 18]elif output_stride == 8:dilations = [1, 12, 24, 36]else:raise NotImplementedErrorself.aspp1 = _ASPPModule(inplanes, 256, 1, padding=0, dilation=dilations[0])self.aspp2 = _ASPPModule(inplanes, 256, 3, padding=dilations[1], dilation=dilations[1])self.aspp3 = _ASPPModule(inplanes, 256, 3, padding=dilations[2], dilation=dilations[2])self.aspp4 = _ASPPModule(inplanes, 256, 3, padding=dilations[3], dilation=dilations[3])self.global_avg_pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)),nn.Conv2d(inplanes, 256, 1, stride=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True))self.conv1 = nn.Conv2d(1280, 256, 1, bias=False)self.bn1 = nn.BatchNorm2d(256)self.relu = nn.ReLU(inplace=True)self.dropout = nn.Dropout(0.5)self._init_weight()def forward(self, x):x1 = self.aspp1(x)x2 = self.aspp2(x)x3 = self.aspp3(x)x4 = self.aspp4(x)x5 = self.global_avg_pool(x)x5 = F.interpolate(x5, size=x4.size()[2:], mode='bilinear', align_corners=True)x = torch.cat((x1, x2, x3, x4, x5), dim=1)x = self.conv1(x)x = self.bn1(x)x = self.relu(x)return self.dropout(x)def _init_weight(self):for m in self.modules():if isinstance(m, nn.Conv2d):# n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels# m.weight.data.normal_(0, math.sqrt(2. / n))torch.nn.init.kaiming_normal_(m.weight)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.Linear):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)
# 解码器
class Decoder(nn.Module):def __init__(self, num_classes, low_level_inplanes=256):super(Decoder, self).__init__()self.conv1 = nn.Conv2d(low_level_inplanes, 48, 1, bias=False)self.bn1 = nn.BatchNorm2d(48)self.relu = nn.ReLU()self.last_conv = nn.Sequential(nn.Conv2d(304, 256, kernel_size=3, stride=1, padding=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Dropout(0.1),nn.Conv2d(256, num_classes, kernel_size=1, stride=1))self._init_weight()def forward(self, x, low_level_feat):low_level_feat = self.conv1(low_level_feat)low_level_feat = self.bn1(low_level_feat)low_level_feat = self.relu(low_level_feat)x = F.interpolate(x, size=low_level_feat.size()[2:], mode='bilinear', align_corners=True)x = torch.cat((x, low_level_feat), dim=1)x = self.last_conv(x)return xdef _init_weight(self):for m in self.modules():if isinstance(m, nn.Conv2d):# n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels# m.weight.data.normal_(0, math.sqrt(2. / n))torch.nn.init.kaiming_normal_(m.weight)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.Linear):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)# DeepLabv3模型
class DeepLabv3(nn.Module):def __init__(self, num_classes=None):super().__init__()self.num_classes = num_classesself.backbone = ResNet('resnet50', None)self.aspp = ASPP(inplanes=self.backbone.final_out_channels)self.decoder = Decoder(self.num_classes, self.backbone.low_level_inplanes)def forward(self, imgs, labels=None, mode='infer', **kwargs):x, low_level_feat = self.backbone(imgs)x = self.aspp(x)x = self.decoder(x, low_level_feat)outputs = F.interpolate(x, size=imgs.size()[2:], mode='bilinear', align_corners=True)return outputsif __name__ == '__main__':model = DeepLabv3(num_classes=19)print(model)input = torch.randn(2,3,1024,2048)output = model(input)print(output.shape)

运行结果如下:
torch.Size([2, 19, 1024, 2048])

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

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

相关文章

Java读取超过内存大小的文件

读取文件内容,然后进行处理,在Java中我们通常利用 Files 类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时&#xff…

设计模式之代理模式精讲

代理模式(Proxy Pattern)也叫委托模式,是一个使用率非常高的模式,比如我们在Spring中经常使用的AOP(面向切面编程)。 概念:为其他对象提供一种代理以控制对这个对象的访问。 代理类和实际的主题…

C#WPF控件Button详解

本文详解WPF的Button控件。 目录 前言 定义 属性 事件 应用实例 1、普通应用

mysql 常见运算符

学习了mysql数据类型,接下来学习mysql常见运算符。 2,常见运算符介绍 运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。运用运算符 可以更加灵活地使用表中的数据,常见的运算符类型有:算…

【Go】Context

https://www.fengfengzhidao.com/article/WdlGxI0BEG4v2tWkq3bD#go%E8%AF%AD%E8%A8%80%E7%9A%84context https://blog.csdn.net/weixin_52690231/article/details/124518402 https://blog.csdn.net/m0_57960197/article/details/132529334 基于源码 学一点,整一点&a…

pytorch | torchvision.transforms.CenterCrop

torchvision.transforms.CenterCrop>从图像中心裁剪图片 transforms.CenterCrop torchvision.transforms.CenterCrop(size) 功能:从图像中心裁剪图片 size: 所需裁剪的图片尺寸 transforms.CenterCrop(196)的效果如下: (也可…

蓝桥杯刷题--python-34-dp

2. 01背包问题 - AcWing题库 n,vmap(int,input().split()) dp[[0 for i in range(v1)] for i in range(n1)] for i in range(1,n1): v_,wmap(int,input().split()) for j in range(v1): dp[i][j]dp[i-1][j] if j>v_: dp[i][j]max(dp[i]…

2024年水电站大坝安全监测工作提升要点

根据《水电站大坝运行安全监督管理规定》(国家发改委令第23号)和《水电站大坝运行安全信息报送办法》(国能安全〔2016〕261号)的相关规定、要求,电力企业应当在汛期向我中心报送每日大坝汛情。近期,全国各地…

uniapp实现u-datetime-picker时间选择器的默认日期定位,解决default-value不生效问题

uniapp实现u-datetime-picker&#xff0c;设置默认定位日期&#xff0c;解决default-value不生效问题 想实现的效果是点开时间选择器默认显示当前日期&#xff0c;而不是该选择器最早的日期 给选择器添加ref属性&#xff0c;如下&#xff1a; <u-datetime-picker :show&q…

HarmonyOS-如何使用ArkTS声明式语法和基础组件,实现待办列表。

介绍 本篇Codelab将介绍如何使用ArkTS声明式语法和基础组件&#xff0c;实现简易待办列表。效果为点击某一事项&#xff0c;替换标签图片、虚化文字。效果如图所示&#xff1a; 相关概念 ArkTS语法&#xff1a;ArkTS是HarmonyOS的主要应用开发语言。ArkTS基于TypeScript&…

Java八股文(高并发,分布式,JUC)

Java八股文の高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 对于高并发的系统&#xff0c;为了提高用户的体验&#xff0c;你是如何做的&#xff1f;或者说高并发的技巧你用过哪些&#xff1f; …

视频实时行为检测——基于yolov5+deepsort+slowfast算法

1. 背景介绍 随着互联网和移动设备的普及&#xff0c;视频数据量呈爆炸式增长。视频监控、智能家居、自动驾驶等领域对视频内容的理解和分析提出了更高的要求。实时行为检测技术能够从视频中识别出特定行为&#xff0c;为这些领域提供智能化的解决方案。本文将介绍一种基于yol…

Flink学习(一)-flink 本地部署

1&#xff0c;安装 jdk 官网推荐 jdk11 版本。我用 17也可以跑起来 2&#xff0c;下载 flink-1.19 的版本并解压 下载 release 1.19.0 并解压。 tar -xzf flink-1.19.0-bin-scala_2.12.tgz cd flink-1.19.0 3&#xff0c;启动 ./bin/start-cluster.sh 4&#xff0c;访问…

springboot通过threadLocal+参数解析器实现保存当前用户登录信息

首先先介绍一下threadLocal ThreadLocal 线程局部变量&#xff0c;创建一个线程变量后&#xff0c;针对这个变量可以让每个线程拥有自己的变量副本&#xff0c;每个线程是访问的自己的副本&#xff0c;与其他线程的相互独立。 大致知道threadLocal就可以了&#xff0c;然后我…

家电维修之 电子元件 学习

上面一个三角形 下面一根横线是什么电子元件 上面一个三角形下面一根横线是电子元件的图形通常表示一个二极管。二极管是一种常见的电子元件&#xff0c;它具有两个电极&#xff0c;即正极&#xff08;阳极&#xff09;和负极&#xff08;阴极&#xff09;。 上面的三角形表示…

Qt 完成图片的缩放拖动

1. 事件和函数 主要使用事件paintEvent(QPaintEvent *event)和drawTiledPixmap函数实现绘图。 paintEvent事件在改变窗口大小、移动窗口、手动调用update等情形下会被调用。需先了解下绘图该函数的用法。 - QPainter::drawTiledPixmap(int x, int y, int w, int h, const QPi…

Docker部署MongoDB+整合Mongo版MyBatis—Plus

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、 MongoDB简介1.1 适用场景1.2 应…

缓冲区溢出漏洞学习总结(漏洞原理及其利用方法)

文章目录 前言1、缓冲区溢出漏洞概述1.1、漏洞概述1.2、缓冲区溢出漏洞概述1.3、缓冲区溢出攻击概述1.4、引发缓冲区溢出的原因 2、栈溢出漏洞2.1、栈溢出漏洞概述2.2、栈溢出漏洞利用2.2.1、利用方法一&#xff1a;修改返回地址2.2.2、利用方法二&#xff1a;覆盖临接变量 3、…

(js)循环条件满足时终止循环

(js)循环条件满足时终止循环 功能需求&#xff1a;勾选的字段中若包含“数据标注划分”则显示数据划分&#xff0c;不包含则不显示 包含&#xff1a; 不包含&#xff1a; // 标注划分显示 const markStr 数据标注划分 for (let i 0; i < value.length; i) { //value为勾选…

Coursera自然语言处理专项课程03:Natural Language Processing with Sequence Models笔记 Week02

Natural Language Processing with Sequence Models Course Certificate 本文是https://www.coursera.org/learn/sequence-models-in-nlp 这门课程的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Sequence ModelsWeek 02…