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

news2024/11/27 14:51:04

大家好,我是微学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])

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

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

相关文章

基于8086密码锁可修改仿真

**单片机设计介绍,基于8086密码锁可修改仿真 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的密码锁可修改仿真设计是一个结合了微处理器控制、密码管理和仿真技术的综合性项目。通过此设计,用户可以设定和…

nginx界面管理工具之nginxWebUI 搭建与使用

nginx界面管理工具之nginxWebUI 搭建与使用 一、nginxWebUI 1.nginx网页配置工具 官网地址: http://www.nginxwebui.cn 源码地址:https://git.chihiro.org.cn/chihiro/nginxWebUI 2.功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议…

非关系型数据库--------------Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用…

正弦实时数据库(SinRTDB)的使用(10)-数据文件的无损压缩

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

Python 用pygame简简单单实现一个打砖块

# -*- coding: utf-8 -*- # # # Copyright (C) 2024 , Inc. All Rights Reserved # # # Time : 2024/3/30 14:34 # Author : 赫凯 # Email : hekaiiii163.com # File : ballgame.py # Software: PyCharm import math import randomimport pygame import sys#…

JAVA学习笔记21

1.IDEA的使用 1.ctrl B 快速定位到方法 2.ctrl Y 快速删除行 3.ctrl D 快速复制行 4.ctrl H 查看继承的层级关系 5.快速格式化代码 ctrl shift L 6.alt R 快速允许程序 7.ctrl / 快速添加注释 1.包(软件包) 1.1包的三大作用 1.区分相同名字的类 2.当类很多的…

企业数智化进入“加速期”,互联网企业越来越离不开IDC机房

近年来,随着人工智能技术的快速发展和大数据的广泛应用,企业数智化已经进入了“加速期”。越来越多的企业意识到,通过数字化技术和数据分析,可以提高企业的运营效率、降低成本、改善决策能力,进而在激烈的市场竞争中取…

奥比中光Astra SDK相机SDK openni相机成像原理

目录 1.1 成像原理简介 1.1.1 结构光 1.1.2 双目视觉 1.1.3 光飞行时间TOF​ 2.使用手册 参考网址 2.1 产品集成设计 2.2 SDK介绍与使用 2.3 常用API介绍 OPENNI API 2 OpenNI类(OpenNI.h) 1.1 成像原理简介 1.1.1 结构光 结构光&#xff0…

关于POE供电你必须知道的13个问题

你们好,我的网工朋友。 近年来,PoE供电技术的发展势头越来越强劲。 凭借简化用电设备的安装和部署、节能,安全等一系列优势,PoE供电成为无线覆盖、安防监控、以及智能电网等场景的新宠。 在技术交流中,工程商困惑最…

Dijkstra堆优化之蓝桥王国

Dijkstra堆优化 Dijkstra算法是一种用于解决单源最短路径问题的算法,即从图中的一个顶点出发到所有其他顶点的最短路径。然而,处理大图时,常规的Dijkstra算法可能会遇到性能问题。这就是Dijkstra的堆优化算法派上用场的地方。在堆优化版本中…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入,企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式,通过提供强大丰富的库文件包,极大地简化了应用开发过程,降低了技术门槛。Python开发有哪些优势、挑战以及…

如何查找合适自己的EI期刊和会议?

大家都知道EI工程索引包含期刊和会议,两者含金量都是比较高的,那么如何才能找到适合自己的EI期刊和会议?ei期刊数量众多,ei国际会议举办次数也是很多的,下面分享几种查找的渠道仅供参考: 渠道一、通过搜索引擎查找&am…

【蓝桥杯第十三届省赛B组】(详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

【Emgu CV教程】10.11、MatchShapes()比较轮廓的相似度

文章目录 一、函数介绍二、演示1.原始素材2.代码3.运行结果 一、函数介绍 MatchShapes()函数&#xff0c;可以比较两个轮廓的相似度&#xff0c;而且对于旋转、放大、缩小的轮廓都能适用&#xff0c;利用这个函数就能实现最简单的物体检测。函数官方定义如下 public static d…

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Web应急响应

2024年护网将至&#xff0c;最近我将分享一些红蓝对抗的一些技巧&#xff0c;应急响应、信息收集相关的知识概念以及相关技巧。 目录 1. 黑客攻击流程 2. webshell流量特征 1.1.菜刀特征 1.2.冰蝎3.0 &#xff1a; 1.3.冰蝎2.0&#xff1a; 1.4.冰蝎3.11流量特征 1.5.蚁…

申请小程序https证书

背景&#xff1a;目前小程序在开发阶段是必须要使用SSL证书实现服务器https访问&#xff0c;在2017年12月30后http将无法调用微信公众平台接口&#xff0c;需要上线微信小程序的个人或企业&#xff0c;需要办理SSL证书&#xff0c;才能实现网站HTTPS化&#xff0c;让小程序顺利…

用python做一个终身免费的听书工具,一文搞定!!!

你好&#xff0c;小编有多年大厂经验&#xff0c;努力构建通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 一、前言 话说某天&#xff0c…

SCTNet 项目排坑

SCTNet 项目排坑 任务过程记录在旧环境下运行重配环境训练测试速度测试 任务 想跑一下最新的实时分割代码。由于这个项目也是基于mmsegmentation的&#xff0c;所以我想先看看之前那个环境是否能直接适配。不行&#xff0c;我再新建环境。 过程记录 在旧环境下运行 必要工作…

16-代码检查:如何进行静态代码检查?

在做Go项目开发的过程中&#xff0c;我们肯定需要对Go代码做静态代码检查。虽然Go命令提供了go vet和go tool vet&#xff0c; 今天我想给你介绍的golangci-lint&#xff0c;是目前使用最多&#xff0c;也最受欢迎的静态代码检查工具 接下来&#xff0c;我就从golangci-lint…