YOLOv5 backbone(一)

2023-11-17

Backbone概览及参数

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# 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, SPPF, [1024, 5]],  # 9
  ]

yolov5 的 Backbone 部分的网络结构使用 yaml 文件配置,通过 yolo.py 解析文件加了一个输入构成的网络模块。

Backbone主干网络,是用来提取特征的网络,其作用就是提取图片中的信息,以供后面的网络使用。

这些网络如 ResNet、VGG,并非是自己设计的,因为这些网络已经证明,在分类等问题上的特征提取能力是很强的。在用这些网络作为 Backbone 的时候,直接加载官方训练好的模型参数,后面接着自己的网络。在训练过程中,对其微调,使得更适合于我们的任务。

Param

nc: 80  # 数据集上的类别个数
depth_multiple: 0.33
width_multiple: 0.5
"""
以下两个参数为缩放因子,通过这两个参数就能够实现不同复杂度的模型设计

depth_multiple: 0.33
用来控制模型的深度(BottleneckCSP数), 在number≠1时启用;
第一个C3层的参数设置为[-1, 3, C3, [128]], number=3表示含有1个C3(3*0.33)

width_multiple: 0.5
用来控制模型的宽度, 作用于args中的ch_out;
第一个Conv层, ch_out=64, 运算中会将卷积核设为64x0.5, 输出32通道的特征图
"""

backbone

backbone:
  """
  [from, number, module, args]
  from列参数: 当前模块输入来源, -1表示从上一层获得取
  number列参数:模块重复的次数, 1表示只有一个, 3表示有三个相同模块
  """
  [[-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, SPPF, [1024, 5]],  # 9
  ]
  """
  [-1, 1, Conv, [64, 6, 2, 2]
  input:3x640x640
  [ch_out, kernel, stride, padding]=[64, 6, 2, 2]
  新通道数为64x0.5=32
  特征图计算公式: Feature_new = (Feature_old - kernel + 2 * padding) / stride + 1
    新特征图尺寸为: Feature_new = (640 - 6 + 2 * 2) / 2 + 1 = 320
  """

Backbone组成

YOLOv6.0 版本的 Backbone 去除了 Focus 模块(便于模型导出部署),Backbone主要由CBL、BottleneckCSP/C3以及SPP/SPPF等组成,具体如下图所示:

Input(3×640×640) -> CBS(32×320×320) -> CBS(64×160×160) -> CSP1_1(64×160×160) -> CBS(128×80×80) -> CSP1_2(128×80×80) -> CBS(256×40×40) -> CSP1_3(256×40×40) -> CBS(512×20×20) -> CSP1_1(512×20×20) -> SSPF(512×20×20)

CBS模块

class Conv(nn.Module):
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # 初始化构造函数
        """
        Standard convolution: Conv + BN + SiLU
        :params c1 : 输入的channel值
        :params c2 : 输出的channel值
        :params k  : 卷积的kernel_size
        :params s  : 卷积的stride
        :params p  : 卷积的padding, 一般是None, 可通过autopad自行计算需要的padding数
        :params g  : 卷积的groups数, =1是普通的卷积, >1是深度可分离卷积
        :params act: 激活函数类型, False就是不使用激活函数, 类型是nn.Module, 使用传进的激活函数类型
        """
        super().__init__()
        # 不使用bias偏置,Conv2d和BatchNorm2d结合使用以后,会进行融合操作,融合时卷积的bias值会被消掉
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        # 激活函数改进,近年较火且效果较好的激活函数
        # nn.Identity()是网络中的占位符, 无实际操作, 在增减网络过程中, 可使整个网络层数据不变, 便于迁移权重数据;
        # self.act = nn.Tanh() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = nn.Sigmoid() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = nn.ReLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = nn.LeakyReLU(0.1) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = nn.Hardswish() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = Mish() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = FReLU(c2) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = AconC(c2) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = MetaAconC(c2) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = DyReLUA(c2, conv_type='2d') if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        # self.act = DyReLUB(c2, conv_type='2d') if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

    def forward(self, x):  # 网络的执行顺序根据forward函数来决定的
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        """
        用于Model类的fuse函数
        没有bn,减少推理时间,一般用于测试/验证阶段
        """
        return self.act(self.conv(x))

padding

def autopad(k, p=None):  # kernel, padding
    """
    根据卷积核大小k自动计算卷积核padding数(0填充),让特征图大小不变
    v5有两种卷积:
        1、下采样卷积: conv3x3 s=2 p=k//2=1
        2、feature size不变的卷积: conv1x1 s=1 p=k//2=1
    :params k: 卷积核的kernel_size
    :return p: 自动计算需要的pad值(0填充)
    """
    if p is None:
        # 如果k是整数, p为k与2整除后向下取整; 如果k是列表等, p对应的是列表中每个元素整除2
        p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # 自动计算pad数
    return p

groups

分组卷积
当groups = 1时, 所有输入都卷积到所有输出

当groups = 2时, 该操作等效于两个并排的卷积层, 每个层看到一半的输入通道, 产生一半的输出通道, 并且两者随后连接在一起。


在groups= in_channels时(深度可分离卷积), 每个输入通道都使用自己的滤波器进行卷积, 其大小为: out_channels/in_channels

activate(待补充)

决定是否对特征图进行激活操作, SiLU表示使用Sigmoid进行激活

CSP/C3

CSP 即 Backbone 中的 C3,因为在 Backbone 中 C3 存在 shortcut,而在 Neck 中 C3 不使用 shortcut,所以 backbone 中的 C3 层使用 CSP1_x 表示,Neck 中的 C3 使用 CSP2_x 表示。

CSP结构

class C3(nn.Module):
    # 简化版的BottleneckCSP, 除Bottleneck只有3个卷积,所以取名C3, 它更简单、更快、更轻,具有相似的性能
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        """
        在 C3TR 模块和 yolo.py 的 parse_model 模块调用
        :params c1: 整个BottleneckCSP的输入channel
        :params c2: 整个BottleneckCSP的输出channel
        :params n : 有n个Bottleneck
        :params shortcut: bool Bottleneck中是否有shortcut,默认True
        :params g : Bottleneck中的3x3卷积类型  =1普通卷积  >1深度可分离卷积
        :params e : expansion ratio c2*e=中间其他所有层的卷积核个数/中间所有层的输入输出channel数
        """
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
        # 实验性 CrossConv
        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

从源码中得:输入特征图一条分支先经过 cv1,再经过 m,得到子特征图1;另一分支经过 cv2 后得到子特征图2。最后将子特征图1和子特征图2拼接后输入 cv3 得到C3层的输出。CV操作即前面的 Conv2d + BN + SiLU,关键是 m 操作。

m操作:使用 nn.Sequential 将多个 Bottleneck( Resx )串接到网络中,for 循环中的n 即网络配置文件 args 中的 number,即将 number × depth_multiple 个 Bottleneck 串接到网络中。

Bottleneck

在 Resnet 出现之前,人们认为网络越深获取信息也越多,模型泛化效果越好。

然而网络深度到达一定程度后,模型的准确率反而降低。这并不是过拟合造成的,而是由于反向传播过程中的梯度爆炸和梯度消失。即网络越深,模型越难优化,而不是学习不到更多的特征。

为了让深层次的网络模型达到更好的训练效果,残差网络提出了残差映射替换以往的基础映射。

对于输入 x,期望输出 H(x),网络利用恒等映射将 x 作为初始结果,将原来的映射关系变成 F(x)+x。与其让多层卷积去近似估计 H(x) ,不如近似估计 H(x)-x,即近似估计残差 F(x)。

因此,ResNet 相当于将学习目标改变为目标值 H(x) 和 x 的差值,后面的训练目标就是要将残差结果逼近于 0。

目前要求解的映射为:H(x),将这个问题转换为求解网络的残差映射函数,即F(x),其中F(x) = H(x)-x。残差:观测值与估计值之间的差。H(x)是观测值,x就是估计值(即上一层ResNet输出的特征映射)。

残差模块优点

1、梯度弥散方面。加入ResNet中的shortcut结构在反传时,每两个block之间不仅传递梯度,还加上了求导之前的梯度,相当于把每一个block中向前传递的梯度人为加大,就会减小梯度弥散的可能性。
2、特征冗余方面。正向卷积时,对每一层做卷积其实只提取了图像的一部分信息,越到深层,原始图像信息的丢失越严重,仅仅是对原始图像中的一小部分特征做提取。这会发生类似欠拟合的现象,加入shortcut结构,相当于在每个block中又加入了上一层图像的全部信息,一定程度上保留了更多的原始信息。

在resnet中,人们使用带有shortcut的残差模块搭建几百层甚至上千层的网络,浅层的残差模块被命名为Basicblock(18、34),深层网络使用的的残差模块,被命名为Bottleneck(50+)。

Bottleneck 与 Basicblock 最大的区别是卷积核的组成。

Basicblock由两个3x3的卷积层组成,Bottleneck由两个1x1卷积层夹一个3x3卷积层组成:其中1x1卷积层降维后再恢复维数,让3x3卷积在计算过程中的参数量更少、速度更快。

第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。

Bottleneck减少了参数量,优化了计算,保持了原有的精度。

# Standard bottleneck(True/False)  Conv + Conv + shortcut(True/False)
class Bottleneck(nn.Module):
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):
        """
        在BottleneckCSP和yolo.py的parse_model中调用
        :params c1: 第一个卷积的输入channel
        :params c2: 第二个卷积的输出channel
        :params shortcut: bool 是否有shortcut连接 默认是True
        :params g : 卷积分组的个数  =1就是普通卷积
        :params e : expansion ratio  c2*e=第一个卷积的输出channel=第二个卷积的输入channel
        """
        super().__init__()
        c_ = int(c2 * e)                    # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)       # 1x1
        self.cv2 = Conv(c_, c2, 3, 1, g=g)  # 3x3
        self.add = shortcut and c1 == c2    # shortcut=True and c1 == c2 才能做shortcut

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

CSP中的Bottleneck与ResNet类似,先是1x1的卷积层(CBS),然后再是3x3的卷积层,最后通过shortcut与初始输入相加。

与ResNet的不同在于:CSP将输入维度减半运算后并,未再使用1x1卷积核进行升维,而是将原始输入x也降了维,采取concat的方法进行张量的拼接,得到与原始输入相同维度的输出。

ResNet中的shortcut通过add实现,是特征图对应位置相加而通道数不变;

CSP中的shortcut通过concat实现,是通道数的增加。

SSPF

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        """
        :params c1: 第一个卷积的输入channel
        :params c2: 第二个卷积的输出channel
        :params k : 初始化的kernel size
        """
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)  # 对应第一个CBS
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        x = self.cv1(x)  # 先通过CBS进行通道数减半
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            # 上述两次最大池化
            return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))        

SSPF模块将经过CBS的x、一次池化后的y1、两次池化后的y2和三次池化后的self.m(y2)先进行拼接,然后再CBS提取特征。

虽然SSPF对特征图进行了多次池化,但特征图尺寸并未变化,通道数更不会变化,所以后续的4个输出能在channel维度进行融合。

这一模块的主要作用是对高层特征进行提取并融合,在融合的过程中作者多次运用最大池化,尽可能多的去提取高层次的语义特征。

YOLOv5s的Backbone总览

参考 

 YOLOv5 Backbone详解

分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)

YOLOV5-5.x 源码讲解

ResNet详解——通俗易懂版

YOLOv5中的SPP/SPPF结构详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv5 backbone(一) 的相关文章

  • 【卡尔曼滤波】粗略模型和过滤技术在模型不确定情况下的应用研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 基于java的ssh医院在线挂号系统设计与实现

    基于java的ssh医院在线挂号系统设计与实现 I 引言 A 研究背景和动机 基于Java的SSH医院在线挂号系统设计与实现的研究背景和动机 随着信息技术的迅速发展和应用 医院在线挂号系统已成为医院管理的重要组成部分 传统的挂号方式存在许多
  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 链上繁荣,合作不断,外媒热议波场 TRON 2023 年度成绩

    近日 权威外媒Theblock 美联社和Decrypt等就波场 TRON 2023大事件进行了年度盘点 报道指出 波场TRON网络在2023年取得了一系列的发展和合作 提升了其在Web3领域的地位 其中 波场TRON网络账户数量增加了 54
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 明日 15:00 | NeurIPS 2023 Spotlight 论文

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AITIME哔哩哔哩官方账号预约直播 1月17日 15 00 16 00 讲者介绍 黄若孜 腾讯AI LAB游戏AI研究员 2020年复旦大学硕士毕业后
  • 毕业设计:基于卷积神经网络的验证码识别系统 机器视觉 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 字符分割算法 2 2 深度学习 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 无人机视角、多模态、模型剪枝、国产AI芯片部署

    无人机视角 多模态 模型剪枝 国产AI芯片部署是当前无人机技术领域的重要研究方向 其原理和应用价值在以下几个方面进行详细讲述 一 无人机视角 无人机视角是指在无人机上搭载摄像头等设备 通过航拍图像获取环境信息 并进行图像处理和分析 这种技术
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • 做大模型也有1年多了,聊聊这段时间的感悟!

    自ChatGPT问世以来 做大模型也有1年多了 今天给大家分享这一年后的感悟 过去一年应该是AI圈最万千瞩目的一年了 大家对大模型 OpenAI ChatGPT AI Native Agent这些词投入了太多的关注 以至于有一年的时间好像经
  • 2023最新pytorch安装(超详细版)

    前言 一 判断是否有Nvidia 英伟达显卡 二 CPU版 2 1 安装Anaconda 2 2 创建虚拟环境 2 3安装pytorch 2 4 验证pytorch是否安装成功 三 GPU版 3 1 安装Anaconda 3 2 创建虚拟环
  • AI在保护环境、应对气候变化中的作用

    对于AI生命周期数据领域的全球领导者而言 暂时搁置我们惯常的AI见解和AI生命周期数据内容产出 来认识诸如世界地球日这样的自然环境类活动日 似乎是个奇怪的事情 我们想要知道 数据是否真的会影响我们的地球环境 简而言之 是 确实如此 但作为一
  • 史上最全自动驾驶岗位介绍

    作者 自动驾驶转型者 编辑 汽车人 原文链接 https zhuanlan zhihu com p 353480028 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 本
  • 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?(浙江大学最新)...

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 今天自动驾驶之心为大家分享浙大刚刚出炉的3D Gaussian Splatting综述 文章首先回顾了3D Gaussian的原理和应用 借着全面比较了3D GS在静态
  • 如何将Yolo格式边界框坐标转换为OpenCV格式

    I have Yolo格式化保存在 a 中的对象的边界框注释 txt文件 现在我想加载这些坐标并使用它在图像上绘制它OpenCV 但我不知道如何将浮点值转换为OpenCV格式化坐标值 我试过这个post https stackoverflo
  • 无法将大小为 1665179 的数组重塑为形状 (512,512,3,3)

    该脚本用于进行检测 权重文件是 yolov4 coco 预训练模型 可以在这里找到 https drive google com file d 1cewMfusmPjYWbrnuJRuKhPMwRe b9PaT view https dri
  • 了解 YOLO 是如何训练的

    我试图了解 YOLO v2 是如何训练的 为此 我使用这个 keras 实现https github com experiencor keras yolo2 https github com experiencor keras yolo2在
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 使用 keras 澄清 Yolo v3 模型输出

    我将 yolo v3 模型与 keras 一起使用 该网络为我提供了形状如下的输出容器 1 13 13 255 1 26 26 255 1 52 52 255 所以我找到了这个link https www cyberailab com ho

随机推荐

  • 06-PS中的四种蒙版

    Photoshop中的蒙版就是遮罩的意思 主要作用就是将其所在的图层 把不同的明暗度转化成相应的透明度 黑色为完全透明 灰色为半透明 白色为完全不透明 添加蒙版有便于灵活修改 不影响图层原貌 PS蒙版有四类 图层蒙版 剪切蒙版 矢量蒙版 快
  • Nmap食用指北

    Nmap食用指北 Nmap简介 Nmap Network mapper 是目前最流行的网络扫描工具 它不仅能够准确地探测单台主机的详细情况 而且能够高效率地对大范围IP地址段进行扫描 使用Nmap能够得知目标网络上哪些主机是存活的 以及哪些
  • 新闻网大数据实时分析可视化系统项目——10、数据采集/存储/分发完整流程测试...

    一 idea工具开发数据生成模拟程序 1 在idea开发工具中构建weblogs项目 编写数据生成模拟程序 package main java import java io public class ReadWrite static Str
  • LeetCode 面试题 03.02. 栈的最小值

    文章目录 一 题目 二 C 题解 一 题目 请设计一个栈 除了常规栈支持的 pop 与 push 函数以外 还支持 min 函数 该函数返回栈元素中的最小值 执行 push pop 和 min 操作的时间复杂度必须为 O 1 点击此处跳转题
  • 面试题:6种解法-顺序打印A1B2C3

    金不三 银不四的高频面试题 Java 中顺序打印 A1B2C3 是多线程中的一个经典面试问题 其解决方法可以锻炼程序员的多线程编程能力 本文将从多个角度 介绍 Java 中顺序打印 A1B2C3 的实现方式 总共分为如下6种方式 synch
  • VAE-GAN学习记录

    一 遇到的问题以及学习目的 学习VAE GAN主要是因为最近在做故障诊断相关的东西 之前在某篇论文里得知 使用GAN算法时 可以使用判别损失 重构损失对异常样本进行检测 然而 那篇论文 基于 LSTM GAN 的加油时序数据异常检测 里面
  • SpringBoot数据库连接池Hikari配置

    在项目中 一般情况下访问数据库 会创建一个连接 用完后就关闭它 对于简单的系统这样不会带来什么明显的性能上的开销 但是对于一个复杂的系统 频繁的建立 关闭连接 会极大的减低系统的性能 因为对于数据库连接的使用可能会成为系统性能的瓶颈 数据库
  • MATLAB2017a使用FasterRcnn目标检测训练及其测试流程

    本文在matlab2017a已有的FasterRcnn算法基础上来检测人群 流程比较简单 对一些初学者来说比较容易理解和操作 1 安装所需要的软硬件环境 1 1 硬件环境 CPU Intel i5 GPU GTX940m 内存 4G 硬盘
  • Java 8使用Steam().map()提出List对象的某一列的值及重新排序

    这几天遇到一个这样的问题 本来想着是从map中拿到数据在遍历出来的的 但是显得自己很麻烦 于是找了很多方式 测试各个方法的可用性 这里就简单记录一下一些Java8里面的好用的一些方法 Java8 使用 stream map 提取List对象
  • QT开发 - 信号槽写法

    1 Lambda写法 非重载函数 QCheckBox checkBox1 new QCheckBox check box1 connect checkBox1 QCheckBox stateChanged int state m statu
  • 类的访问权限-public、private、protected

    访问权限 protected 保护 访问权限 为什么要使用protected访问权限 子类的成员函数中 不能直接访问父类的private成员 已经这些成员已经被继承下来了 但是却不能访问 只有通过父类的public函数来间接访问 不是很方便
  • Windows server 2008搭建文件服务器

    服务器达到要求 各部门只能访问自己部门服务器 公司员工只能读取和修改文档 普通用户限制磁盘空间是20M 部门经理50M 总经理不受限制 市场部文件允许读取和修改 不能删除 限制电影 照片文件格式 完成数据备份 并模拟数据丢失进行还原 总体思
  • Protobuf Java (1)

    参考 https developers google cn protocol buffers docs javatutorial 目录 1 定义protobuf 文件 2 编译你的 Protocol Buffers 3 ProtoBuf A
  • git源代码泄露

    需要的工具 kali githack win版没下载成功 安装方法 kali命令行中输入 git clone https github com lijiejie GitHack 下载成功如下 输入GitHack 然后输入python Git
  • Java文件输入流如何才能一行一行读取,一行一行写入

    文件输入流 而且和行有关 那么就必须要想到使用Buffered缓冲流了 BufferedReader和BufferedWriter这两个类里面有很重要的方法 BufferedReader里是readLine BufferedWriter里是
  • UE4 通过Echarts实现各种统计图

    主要内容 本文主要讲解UE4 UMG向网页发送数据 通过WebBrowser插件将用Echarts定制好的统计图在UE4内展现出来 达到数据可视化的效果 本文主要演示柱形图的效果 其它类型的统计图可以结合Echarts官方案列以及文档自行修
  • springboot整合JSR303校验

    4 7 JSR303校验 4 7 1 统一校验的需求 前端请求后端接口传输参数 是在controller中校验还是在Service中校验 答案是都需要校验 只是分工不同 Contoller中校验请求参数的合法性 包括 必填项校验 数据格式校
  • coalesce 函数详解与学习记录

    1 在工作中都用到了此函数 特此学习并记录一下 2 coalesce 用途 1 将空值替换成其他值 2 返回第一个非空值 3 SQL实例 一 select coalesce success cnt 1 from tableA 当succes
  • Python使用管道、队列、zeromq进行IPC速度对比测试

    管道 import sys from multiprocessing import Process Pipe import time import result msg list for i in range 100 msg list ap
  • YOLOv5 backbone(一)

    Backbone概览及参数 Parameters nc 80 number of classes depth multiple 0 33 model depth multiple width multiple 0 50 layer chan