计算机视觉的应用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 = 256
            self.low_level_inplanes = 64
        elif backbone == 'resnet34':
            backbone = resnet34(pretrained=not pretrained_path)
            self.final_out_channels = 256
            self.low_level_inplanes = 64
        elif backbone == 'resnet50':
            backbone = resnet50(pretrained=not pretrained_path)
            self.final_out_channels = 1024
            self.low_level_inplanes = 256
        elif backbone == 'resnet101':
            backbone = resnet101(pretrained=not pretrained_path)
            self.final_out_channels = 1024
            self.low_level_inplanes = 256
        else:  # backbone == 'resnet152':
            backbone = resnet152(pretrained=not pretrained_path)
            self.final_out_channels = 1024
            self.low_level_inplanes = 256
        if 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 NotImplementedError

        self.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 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)

# DeepLabv3模型
class DeepLabv3(nn.Module):
    def __init__(self, num_classes=None):
        super().__init__()
        self.num_classes = num_classes

        self.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 outputs

if __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])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

56、FreeRTOS/GPIO与定时器相关学习20240329

一、代码实现控制开发板上的指示灯闪烁。 /* USER CODE BEGIN 0 */ //利用定时器机制 定时器溢出时对应的回调函数实现如下 //本次实现控制PB0,PB1两个灯 int flag1 0,flag2 0;//使用一个标记执行以下代码 会造成一个灯常亮 另一个常灭 void HAL_TIM_PeriodElaps…

JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

【threejs】较大物体或shape的贴图较小问题处理方法

问题 有的场景内相对体型差距过大的物体(如山地 海洋等)由于尺寸问题,加载贴图过于小,同时shader也无法完全展示,如图 我们可以获取物体的uv,进行缩放使得贴图可以完全展开 如果uv是乱的 可以用xyz坐标最…

模组软件通用|GNSS坐标系的转换

“GNSS定位不准确,漂移了好几公里,是怎么回事呢?”很多用户在初次使用GNSS定位时都会有这样的问题,这主要是由于GNSS坐标系转换错误造成的位置偏移问题。下面将从常见坐标系、国内地图软件采用的坐标系、经纬度表示方法、示例以及…

Qt 完成图片的缩放拖动

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

深入并广泛了解Redis常见的缓存使用问题

Redis 作为一门主流技术,缓存应用场景非常多,很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存,也会面临各种使用问题,比如数据一致性,缓存穿透,缓存击穿,缓存雪崩&#…

k8s下搭建redis集群

记录一下近期实现的在k8s上搭建redis集群的过程 1、新建存储类 主要是为了和其它服务的存储类区分一下 redis-beta-storage 2、编写configMap redis启动时从configMap中读取配置 bind:默认的127.0.0.1可能会导致其它ip地址无法远程访问,因此修改为0.0…

stm32定时器中断函数回调函数

方式一:stm32定时器中断可以直接在硬件中断函数TIM3_IRQHandler执行。 在HAL库中可以注册回调函数,在定时器中断发生时调用注册的函数,这样可以统一接口,大大提高函数可读性,和硬件解耦提高程序可移植性。 使用过程如…

用Unity制作正六边形拼成的地面

目录 效果演示 1.在Unity中创建正六边形 2.创建一个用于管理正六边形的类 3.创建一个用于管理正六边形地面的类 4.创建一个空对象并将游戏控制脚本挂上 5.设置正六边形碰撞所需组件 6.创建正六边形行为触发脚本并挂上 7.创建圆柱体——田伯光 8.创建圆柱体移动脚本 运…

搜索与图论——bellman—ford算法、spfa算法求最短路

bellman-ford算法 时间复杂度O(nm) 在一般情况下&#xff0c;spfa算法都优于bf算法&#xff0c;但遇到最短路的边数有限制的题时&#xff0c;只能用bf算法 bf算法和dijkstra很像 #include<iostream> #include<queue> #include<cstring> #include<algori…

华清远见STM32U5开发板助力2024嵌入式大赛ST赛道智能可穿戴设备及IOT选题项目开发

第七届&#xff08;2024&#xff09;全国大学生嵌入式芯片与系统设计竞赛&#xff08;以下简称“大赛”&#xff09;已经拉开帷幕&#xff0c;大赛的报名热潮正席卷而来&#xff0c;高校电子电气类相关专业&#xff08;电子、信息、计算机、自动化、电气、仪科等&#xff09;全…

用navicat进行mysql表结构同步

用navicat进行mysql表结构同步 前言新增一个列然后进行表结构同步删除一个列然后进行表结构同步把Int列转成TinyInt列&#xff0c;看数字溢出的情况下能不能表结构同步总结 前言 从同事那边了解到还能用navicat进行表结构同步&#xff0c;他会在发布更新的时候&#xff0c;直接…

Reasoning on Graphs: Faithful and Interpretable Large Language Model Reasonin

摘要 大型语言模型(llm)在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;他们在推理过程中缺乏最新的知识和经验幻觉&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式捕获了大量的事实…

在哪买国外服务器便宜?

在哪买国外服务器便宜&#xff1f;在寻找便宜且可靠的国外服务器商家时&#xff0c;我们需要考虑多个因素&#xff0c;包括价格、性能、可靠性、技术支持和扩展性等。下面是一些备受推崇的便宜国外服务器商家。 Amazon Web Services (AWS)。作为全球最大的云服务提供商之一&am…

WebSocket 详解-小案例展示

简介&#xff1a;Websocket是一种用于H5浏览器的实时通讯协议&#xff0c;可以做到数据的实时推送&#xff0c;可适用于广泛的工作环境&#xff0c;例如客服系统、物联网数据传输系统&#xff0c;该测试工具可用于websocket开发初期的测试工作。 文章末尾有此案例的完整源代码。…

从vivo X Fold3看vivo“质”变

撰文 | 何玺 排版 | 叶媛 vivo的气质变了&#xff01;虽然依旧内敛、低调&#xff0c;但更自信、从容&#xff0c;气场也更强大。这是玺哥在本次vivo X Fold3系列新品发布会上的一个直观感受。 是什么改变了vivo的气质&#xff1f;产品&#xff1f;技术&#xff1f;又或是其他…

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…

代码随想录算法训练营第二十四天(回溯1)|77. 组合(JAVA)

文章目录 回溯理论基础概念类型回溯模板 77. 组合解题思路源码 回溯理论基础 概念 回溯是递归的副产品&#xff0c;本质上是一种穷举 回溯解决的问题可以抽象为一种树形结构 类型 回溯主要用来解决以下问题 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问…

eNSP综合实验(PPP认证、VPN配置、RIP协议、NAT)

题目如上 第一步:配置IP地址 ip分配如下图所示 开始配置IP(PC省略&#xff09; R1&#xff1a; [R1]undo [R1]undo in [R1]undo info-centere [R1]undo info-center e [R1]undo info-center enable Info: Information center is disabled. [R1]int g0/0/0 [R1-Gigabit…

2024年MathorCup数学建模思路A题B题C题D题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…