基于改进YOLOv5s的跌倒行为检测 | 引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合

news2024/12/26 7:44:56

前言:Hello大家好,我是小哥谈。为了实现电厂人员跌倒行为的实时检测,防止跌倒昏迷而无法及时发现并救援的事件发生,针对跌倒行为检测实时性以及特征提取能力不足的问题,提出了一种改进YOLOv5s的跌倒行为检测算法网络:在YOLOv5s模型中引入SKAttention注意力模块,使得网络可以自动地利用对分类有效的感受野捕捉到的信息,这种新的深层结构允许CNN在卷积核心上执行动态选择机制,从而自适应地调整其感受野的大小;同时结合ASFF自适应空间融合,并在其中充分利用不同特征,又在算法中引入权重参数,以多层次功能为基础,实现了水下目标识别精度提升的目标;加入空间金字塔池化结构SPPFCSPC,大幅缩短了推理时间。实验结果表明,相比于原始YOLOv5s,新网络在mAP平均精度均值方面提升了2.1%,查全率提升了16%;改进后的网络在感知细节和空间建模方面更加强大,能够更准确地捕捉到人 员跌倒的异常行为,检测效果有了显著提升。🌈

      目录

🚀1.基础概念

🚀2.网络结构

🚀3.添加步骤

🚀4.改进方法

🍀🍀步骤1:common.py文件修改

🍀🍀步骤2:创建SKAttention.py文件

🍀🍀步骤3:yolo.py文件修改

🍀🍀步骤4:创建自定义yaml文件 

🍀🍀步骤5:修改自定义yaml文件

🍀🍀步骤6:验证是否加入成功

🍀🍀步骤7:修改默认参数 

🍀🍀步骤8:实际训练测试

🚀1.基础概念

YOLOv5在2020年对外公开,发行者是美国学者Alexey及其带领的团队,作为著名的实时对象识别网络模型,已经发行多个不同版本,如YOLOv5sYOLOv5mYOLOv5nYOLOv5lYOLOv5x等,其中相对优势较大的版本为YOLOv5s,因为其检测速度最快,同时模型网络较为简单,同时又能够实现模型权重最小,从而能够作为研究与开发的基础版本,为其他网络开发与扩大提供支撑。YOLOv5s网络可根据功能简单划分为:输入端、特征提取与融合网络、预测端。

SKAttention注意力机制:

为了使得网络可以自动地利用对分类有效的感受野捕捉到的信息,提出了一种新的深度结构,这种新的深层结构允许CNN在卷积核心上执行动态选择机制,从而自适应地调整其感受野的大小,称为“选择性核(Selective Kernel)”,它可以更好地捕捉复杂图像空间的多尺度特征,而不会像一般的CNN那样浪费大量的计算资源。SKN的另一个优点是它可以聚合深度特征,使它更容易理解,同时也允许更好的可解释性。灵感来自这样一个事实,即当我们看到不同大小和距离的物体时,视觉皮层神经元的感受域的大小会随着刺激而调整。具有不同核大小的几个点以这些点的信息为指导,并与SoftMax进行融合。

同时,为了能更好地增加网络的检测性能,现提出一个“选择核”,此(SK)卷积可以在原有的基础之上完成自动选择操作,提升了对输入数据提取的能力,使得网络神经元获 得在不同的复杂情况之下能够对射频大小自动调整的能力。具体地说,我们通过3个运算符 ——分割、融合和选择来实现SK卷积,如下图所示。

空间金字塔池化结构SPPFCSPC:

该结构是基于SPPF对SPP结构的改进,所以这里先对SPP模块结构进行说明。YOLO算法中的SPP结构如图所示。该模块将输入的原特征图按不同分块进行操作,然后将3个子图中每一个框的最大值取出,完成了最大池化(Maxpool),最后再将得出的不同特征图Concat叠加在一起。空间金字塔结构SPP的最早提出者为何凯,最初设计该结构的目标是为了解决输入图像的尺寸问题,在应用中发现其具有3个优点首先,不需要提供输入变量,直接可以根据内部逻辑生成固定长度的输出;然后,使用了Maxpool的多尺度空间容器;最后,可以从不同尺度的特征图中提取特征信息,有效地提高了检测精度。

本文中引入的SPPFCSPC结构,其具体框架如下图所示,从实质上解析该机构,其是基于SPPF对SPP的优化版本,同时还将YOLOv7中的该结构的最大池化部分进行了一定调整,其中采用了多个小卷积核的级联处理方式。实验证实,如果参数集保持不变,推理时间将减少到SPPCPC的72.7%。

ASFF自适应空间融合:

在现有的对象识别算法中,最普通、最经典的体系结构为特征金字塔网络(FPN,feature pyramid network),其特点是利用了分别利用了高级低级特征的不同特性,前者的语义信息,后者的细化融合。而前文提到的自适应空间特征融合(ASFF),其实质就是通过一定算法机制综合高级和低级特征特性,从而获得了不同层次的功能。基于上述分析,本文在YOLOv5s的适应性改进中融合了ASFF,利用其特性与优势,提高水下目标识别质量。FPN详细结构如图3所示,ASFF结构如图4所示。


🚀2.网络结构

本文的改进是基于YOLOv5-6.0版本,关于其网络结构具体如下图所示:

本文对YOLOv5的改进是引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合,改进后的网络结构图具体如下图所示: 

在论文中,改进后的结构图如下图所示:


🚀3.添加步骤

针对本文的改进,具体步骤如下所示:👇

步骤1:common.py文件修改

步骤2:创建SKAttention.py文件

步骤3:yolo.py文件修改

步骤4:创建自定义yaml文件

步骤5:修改自定义yaml文件

步骤6:验证是否加入成功

步骤7:修改默认参数

步骤8:实际训练测试


🚀4.改进方法

🍀🍀步骤1:common.py文件修改

common.py中添加ASFFSPPFCSPC模块代码,所要添加模块的代码如下所示,将其复制粘贴到common.py文件末尾的位置。

# ASFF模块代码
# By CSDN 小哥谈
def add_conv(in_ch, out_ch, ksize, stride, leaky=True):
    """
    Add a conv2d / batchnorm / leaky ReLU block.
    Args:
        in_ch (int): number of input channels of the convolution layer.
        out_ch (int): number of output channels of the convolution layer.
        ksize (int): kernel size of the convolution layer.
        stride (int): stride of the convolution layer.
    Returns:
        stage (Sequential) : Sequential layers composing a convolution block.
    """
    stage = nn.Sequential()
    pad = (ksize - 1) // 2
    stage.add_module('conv', nn.Conv2d(in_channels=in_ch,
                                       out_channels=out_ch, kernel_size=ksize, stride=stride,
                                       padding=pad, bias=False))
    stage.add_module('batch_norm', nn.BatchNorm2d(out_ch))
    if leaky:
        stage.add_module('leaky', nn.LeakyReLU(0.1))
    else:
        stage.add_module('relu6', nn.ReLU6(inplace=True))
    return stage

class ASFF(nn.Module):
    def __init__(self, level, rfb=False, vis=False):
        super(ASFF, self).__init__()
        self.level = level
        # 特征金字塔从上到下三层的channel数
        # 对应特征图大小(以640*640输入为例)分别为20*20, 40*40, 80*80
        self.dim = [512, 256, 128]
        self.inter_dim = self.dim[self.level]
        if level==0: # 特征图最小的一层,channel数512
            self.stride_level_1 = add_conv(256, self.inter_dim, 3, 2)
            self.stride_level_2 = add_conv(128, self.inter_dim, 3, 2)
            self.expand = add_conv(self.inter_dim, 512, 3, 1)
        elif level==1: # 特征图大小适中的一层,channel数256
            self.compress_level_0 = add_conv(512, self.inter_dim, 1, 1)
            self.stride_level_2 = add_conv(128, self.inter_dim, 3, 2)
            self.expand = add_conv(self.inter_dim, 256, 3, 1)
        elif level==2: # 特征图最大的一层,channel数128
            self.compress_level_0 = add_conv(512, self.inter_dim, 1, 1)
            self.compress_level_1 = add_conv(256, self.inter_dim, 1, 1)
            self.expand = add_conv(self.inter_dim, 128, 3, 1)

        compress_c = 8 if rfb else 16  #when adding rfb, we use half number of channels to save memory

        self.weight_level_0 = add_conv(self.inter_dim, compress_c, 1, 1)
        self.weight_level_1 = add_conv(self.inter_dim, compress_c, 1, 1)
        self.weight_level_2 = add_conv(self.inter_dim, compress_c, 1, 1)

        self.weight_levels = nn.Conv2d(compress_c*3, 3, kernel_size=1, stride=1, padding=0)
        self.vis= vis

    def forward(self, x_level_0, x_level_1, x_level_2):
        if self.level==0:
            level_0_resized = x_level_0
            level_1_resized = self.stride_level_1(x_level_1)

            level_2_downsampled_inter =F.max_pool2d(x_level_2, 3, stride=2, padding=1)
            level_2_resized = self.stride_level_2(level_2_downsampled_inter)

        elif self.level==1:
            level_0_compressed = self.compress_level_0(x_level_0)
            level_0_resized =F.interpolate(level_0_compressed, scale_factor=2, mode='nearest')
            level_1_resized =x_level_1
            level_2_resized =self.stride_level_2(x_level_2)
        elif self.level==2:
            level_0_compressed = self.compress_level_0(x_level_0)
            level_0_resized =F.interpolate(level_0_compressed, scale_factor=4, mode='nearest')
            level_1_compressed = self.compress_level_1(x_level_1)
            level_1_resized =F.interpolate(level_1_compressed, scale_factor=2, mode='nearest')
            level_2_resized =x_level_2

        level_0_weight_v = self.weight_level_0(level_0_resized)
        level_1_weight_v = self.weight_level_1(level_1_resized)
        level_2_weight_v = self.weight_level_2(level_2_resized)
        levels_weight_v = torch.cat((level_0_weight_v, level_1_weight_v, level_2_weight_v),1)
        levels_weight = self.weight_levels(levels_weight_v)
        levels_weight = F.softmax(levels_weight, dim=1)

        fused_out_reduced = level_0_resized * levels_weight[:,0:1,:,:]+\
                            level_1_resized * levels_weight[:,1:2,:,:]+\
                            level_2_resized * levels_weight[:,2:,:,:]

        out = self.expand(fused_out_reduced)

        if self.vis:
            return out, levels_weight, fused_out_reduced.sum(dim=1)
        else:
            return out

# SPPFCSPC模块代码
# By CSDN 小哥谈
class SPPFCSPC(nn.Module):

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=5):
        super(SPPFCSPC, self).__init__()
        c_ = int(2 * c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(c_, c_, 3, 1)
        self.cv4 = Conv(c_, c_, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
        self.cv5 = Conv(4 * c_, c_, 1, 1)
        self.cv6 = Conv(c_, c_, 3, 1)
        self.cv7 = Conv(2 * c_, c2, 1, 1)

    def forward(self, x):
        x1 = self.cv4(self.cv3(self.cv1(x)))
        x2 = self.m(x1)
        x3 = self.m(x2)
        y1 = self.cv6(self.cv5(torch.cat((x1, x2, x3, self.m(x3)), 1)))
        y2 = self.cv2(x)
        return self.cv7(torch.cat((y1, y2), dim=1))

🍀🍀步骤2:创建SKAttention.py文件

在源码根目录下创建SKAttention.py文件,代码如下:

import torch
from torch import nn
from collections import OrderedDict

# 定义SKAttention类,继承自nn.Module类
class SKAttention(nn.Module):

    # 定义初始化函数,channel参数为输入的特征通道数,kernels参数为卷积核的大小列表,reduction参数为降维比例,group参数为卷积组数,L参数为维度
    def __init__(self, channel=512, kernels=[1, 3, 5, 7], reduction=16, group=1, L=32):
        super().__init__()

        # 定义d参数,为L和channel除以reduction中最大值
        self.d = max(L, channel // reduction)

        # 定义一个nn.ModuleList,用于存放卷积层
        # 在输入图像上使用不同大小的卷积核卷积,获得多个不同尺寸的特征图;
        self.convs = nn.ModuleList([])
        for k in kernels:
            self.convs.append(
                nn.Sequential(OrderedDict([  # 定义一个nn.Sequential,包含一个OrderedDict
                    ('conv', nn.Conv2d(channel, channel, kernel_size=k, padding=k // 2, groups=group)),
                    ('bn', nn.BatchNorm2d(channel)),
                    ('relu', nn.ReLU())
                ]))
            )
        self.fc = nn.Linear(channel, self.d)
        self.fcs = nn.ModuleList([])
        for i in range(len(kernels)):
            self.fcs.append(nn.Linear(self.d, channel))
        self.softmax = nn.Softmax(dim=0)

    def forward(self, x):
        bs, c, _, _ = x.size()
        conv_outs = []
        ### 对输入input进行分割。使用kernels参数指定的不同卷积核大小,使用同一组卷积参数,对这个input进行卷积操作,从而得到k个不同特征;
        for conv in self.convs:
            conv_outs.append(conv(x))
        feats = torch.stack(conv_outs, 0)  # k,bs,channel,h,w

        ### fuse融合层 将这k个特征直接相加,得到融合特征U
        U = sum(conv_outs)  # bs,c,h,w

        ### reduction channel 降维层 将这个融合特征U的每一个通道求平均值,得到降维的特征S,然后进行全连接运算
        S = U.mean(-1).mean(-1)  # bs,c

        Z = self.fc(S)  # bs,d

        ### calculate attention weight
        weights = []

        # 对于这个降维后的特征S,使用多个不同的全连接层fcs,
        for fc in self.fcs:
            weight = fc(Z)
            weights.append(weight.view(bs, c, 1, 1))  # bs,channel
        # 把降维后的特征S转换为各个不同卷积核大小特征的权重,
        attention_weughts = torch.stack(weights, 0)  # k,bs,channel,1,1
        attention_weughts = self.softmax(attention_weughts)  # k,bs,channel,1,1

        ### fuse 将权重与特征叠加求和,得到最终的融合特征V
        V = (attention_weughts * feats).sum(0)
        return V

if __name__ == '__main__':
    input = torch.randn(50, 512, 7, 7)
    se = SKAttention(channel=512, reduction=8)
    output = se(input)
    print(output.shape)
🍀🍀步骤3:yolo.py文件修改

首先,在下图所示位置加入代码:

# By CSDN 小哥谈
class ASFF_Detect(Detect):
    # ASFF model for improvement
    def __init__(self, nc=80, anchors=(), ch=(), inplace=True):  # detection layer
        super().__init__(nc, anchors, ch, inplace)
        self.nl = len(anchors)
        self.asffs = nn.ModuleList(ASFF(i) for i in range(self.nl))
        self.detect = Detect.forward

    def forward(self, x): # x中的特征图从大到小,与ASFF中顺序相反,因此输入前先反向
        x = x[::-1]
        for i in range(self.nl):
            x[i] = self.asffs[i](*x)
        return self.detect(self, x[::-1])

具体添加位置如下图所示:

然后,针对ASFF模块进行修改。

采用Ctrl + F进行搜索Detect, Segment,可以看到共有三处

分别在其后加入ASFF_Detect关于这三处修改如下图所示:

最后,在yolo.py文件中找到parse_model函数,在下图中所示位置添加SPPFCSPC,并且添加下列代码:

 # ---------------start-----------------
        elif m is SKAttention:
            c1, c2 = ch[f], args[0]
            if c2 != no:
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, *args[1:]]
        # ----------------end------------------

具体添加位置如下图所示:

🍀🍀步骤4:创建自定义yaml文件 

models文件夹中复制yolov5s.yaml,粘贴并重命名为:yolov5s_ASFF.yaml具体如下图所示:

🍀🍀步骤5:修改自定义yaml文件

本步骤是修改yolov5s_ASFF.yaml,根据改进后的网络结构图进行修改。

修改后的完整yaml文件如下所示:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# By CSDN 小哥谈
# Parameters
nc: 2  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SKAttention, [1024]],
   [-1, 1, SPPFCSPC, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 15], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 11], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[18, 21, 24], 1, ASFF_Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]
🍀🍀步骤6:验证是否加入成功

yolo.py文件里,将配置改为我们刚才自定义的yolov5s_ASFF.yaml

修改1,位置位于yolo.py文件165行左右,具体如图所示:

修改2,位置位于yolo.py文件363行左右,具体如下图所示:

配置完毕之后,点击“运行”,结果如下图所示:

由运行结果可知,与我们前面更改后的网络结构图相一致,证明添加成功了!✅

参数量对比:

yolov5s.yaml:214 layers, 7235389 parameters, 7235389 gradients, 16.6 GFLOPs

yolov5s_ASFF.yaml:271 layers, 40990552 parameters, 40990552 gradients, 47.0 GFLOPs

🍀🍀步骤7:修改默认参数 

train.py文件中找到parse_opt函数,然后将第二行 '--cfg' 的default改为 ' models/yolov5s_ASFF.yaml ',然后就可以开始进行训练了。🎈🎈🎈

🍀🍀步骤8:实际训练测试

在本步骤中,parse_opt函数中的参数'--weights'采用的是yolov5s.pt'--data'所采用的是helmet.yaml(作者提前创建的安全帽佩戴检测地址及分类信息,同学可自定义),然后设置'--epochs'100轮。相关参数设置完毕后,点击运行train.py文件,没有发生报错,模型正常训练,具体如下图所示:👇

说明:后期实际训练时,根据论文所设置的指标进行训练,上述只是进行测试。  

结束语:

本文分析主要是立足实时监测个人跌倒行为的相关研究,对人群中跌倒行为检测中出现的一些问题进行了阐述。基于YOLOv5s网络,参考已有成果,对其进行了优化和改进,在其中加入注意力模块,从而提高了感知分类信息的利用质量和效率,这种结构特性能够为CNN卷积核提供优化路径,实现动态选择,丰富了神经元的功能区间,使其能够根据多尺度的输入信息进行动态且即时性的感受野的区间调整;此外,也加入了自适应空间融合ASFF,其支持了权重参数学习,因此能够实现多特征融合,并结合层次函数,实现算法优化,提高目标识别准确性;从本文实验结果来看,利用改进的YOLOv5s,进行设计和开发的跌倒检测算法在实验中得到了正向反馈,在查准率、查全率和平均精度均值等维度上都有较好表现。本文之后将完善数据集,并不断加入新检测场景,以继续对该算法进行进一步完善。 

说明:

本节课根据文章《基于改进YOLOv5s的跌倒行为检测》进行代码实现。

作者:朱正林、钱予阳、马辰宇、王悦炜、史腾

期刊:计算机测量与控制 ISSN 1671-4598,CN 11-4762/TP

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

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

相关文章

公网IP变更自动微信通知与远程执行命令的C++开源软件

基本功能 智能公网IP变更监测与微信通知 一旦检测到公网IP地址发生变更,系统将自动通过预设的QQ邮箱(该邮箱与微信绑定,实现微信通知)发送新IP地址通知。同时,软件会即时更新本地配置文件中的IP地址及变更时间&#…

MySQL Server使用

MySQL Server MySQL Server基本操作查看数据库服务命令行连接(这些操作都可以在workbench中进行) MySQL Server基本操作 MySQL基础:安装卸载与配置 查看数据库服务 电脑–管理–管理和应用程序–服务–MySQL80 命令行连接(这…

Linux线程:编织并发的梦幻世界

目录 🚩引言 🚩听故事,引概念 🚩生产者消费者模型 🚀再次理解生产消费模型 🚀挖掘特点 🚩条件变量 🚀条件变量常用接口 🚀条件变量的原理 🚩引言 上一篇…

HQChart报价列表高级应用教程7-走势列数据对接

HQChart报价列表高级应用教程7-走势列数据对接 走势列小程序效果图PC效果图HQChart代码地址走势列类型配置走势列数据格式示例走势列 单独使用一列显示每个股票的走势图 小程序效果图 PC效果图 HQChart代码地址 地址:github.com/jones2000/HQChart

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语:您好,我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣,欢迎联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术,B/S架构 工具:Eclipse,MyEclips…

大模型对汽车行业意味着什么?_汽车企业大模型

引 言 大模型是一种利用海量数据进行训练的深度神经网络模型,其特点是拥有庞大的参数规模和复杂的计算结构。通过在大规模数据集上进行训练,大模型能够学习到丰富的模式和特征,从而具备强大的泛化能力,可以对未知数据做出准确的预…

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数 0. 引言1. 关于m_patch2. 关于m_streamline3. 关于m_scatter4. 关于m_annotation5. 结语 0. 引言 本篇介绍下m_map中绘制多边形区域函数(m_patch)、绘制流…

Landsat数据从Collection1更改为Collection2

目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续,请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错,因为代码里面用的是老的数据集 解决 对于地表反射率SR,需要在name中,将C01换为C02&…

Mysql-基础-DDL操作

1、数据库操作 查询 查询所有数据库 show databases; 创建 创建数据库 create database [if not exists] 数据库名 使用及查询 use 数据库名 select database() 查询当前所处数据库 删除 drop database [if not exists] 数据库名 2、表操作 查询当前库中的所…

SpringBoot源码阅读3-启动原理

SpringBootApplication public class DistApplication {public static void main(String[] args) {// 启动入口SpringApplication.run()SpringApplication.run(DistApplication.class, args);} }1、服务构建 这里"服务"指的是SpringApplication对象,服务…

安防视频监控/视频汇聚EasyCVR平台国标GB28181级联上级平台,视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供7*24小时实时高清视频监控、云端录像、云存储、录像检索与回看、智能告警…

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法

在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…

【postgreessql 】统计库中的所有表数量

在PostgreSQL中,你可以使用SQL查询来统计数据库中的所有表数量。这通常涉及到查询系统目录表,特别是 pg_catalog.pg_tables 表,它存储了关于数据库中所有表的信息。 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN …

游戏冻结工具 -- 雪藏HsFreezer v1.78

软件简介 HsFreezer是一款多功能游戏冻结工具,它允许用户随意暂停和继续游戏,同时具备系统优化和进程管理的功能。这款软件特别适合希望在游戏加载时间节省或在游戏与其他任务之间快速切换的用户。其主要特点包括快捷键操作、单锁模式的丝滑切换&#x…

【大数据】StarRocks的系统架构

StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE (Backend) 或 CN (Compute Node) 两类进程,方便部署与维护,节点可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。…

数据大小端问题

文章目录 大小端前言函数引用(接下来使用此函数对高低位进行切换)先看截取的对于大小端的定义大小端数据的直观理解[重点] 对uchar数组进行取操作定义一个uint8_t的数组观察起内部内存尝试使用uint32_t 每次区 1、2、3、4byte数据 提升经过上面的介绍一定对大小端有了一定的了解…

桥梁监测系统:守护桥梁结构安全的科技利器

桥梁是城市交通的重要组成部分,然而,长期以来,桥梁结构的健康问题一直是人们关注的焦点。传统的人工巡检方式无法全面准确地掌握桥梁结构的实时状况,因此,桥梁监测系统应运而生。桥梁监测系统是一种基于传感器、信息处…

数据结构 - C/C++ - 树

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 树的概念 结构特性 树的样式 树的存储 树的遍历 节点增删 二叉搜索树 平衡二叉树 树的概念 二叉树是树形结构,是一种非线性结构。 非线性结构:在二叉树中&#x…

<电力行业> - 《第15课:电力领域(一)》

1 电网 发电厂与最终用电用户(负荷)往往相距很远,因此电力需要由电厂”输送“到最终用户,即“输电环节“,电流的输送往往导致因线路发热造成损耗,所以在输送的时候都是通过变电升高电压,让电流…

C语言刷题小记

前言 本篇博客和大家分享一些C语言的OJ题目,希望大家可以通过这些题目进一步提升自己的编程能力,如果你对本篇内容感兴趣,可以一键三连,多多关注,下面进入正文部分。 题目1 十六进制转十进制 描述 BoBo写了一个十六…