接触网绝缘子缺陷检测项目

news2025/9/10 14:44:58

目录

1. 接触网绝缘子作用

2. 接触网绝缘子破损原因及危害

3.接触网绝缘子缺陷检测图像数据集介绍

 4. 缺陷检测模型介绍

4.1 efficientnet模型介绍

 4.2 YOLOv3模型介绍

4.3 efficientnet-YOLOv3模型介绍

 5. 模型训练与测试

 5.1 模型训练

5.2 检测性能测试

参考

1. 接触网绝缘子作用

       绝缘子是接触网中广泛应用的重要部件之一,绝缘子用悬吊的支持接触悬挂并使用带电体与接地之间保持电气绝缘。我国电网正处于快速、健康、持续发展的新时期,绝缘子在输电线路的安全稳定运行中发挥重要作用,所以对绝缘子的需求很大。

  高压电线连接塔的一端挂了很多盘状的绝缘体,它是为了增加爬电距离的,通常由玻璃或陶瓷制成,就叫绝缘子。绝缘子是一种绝缘控件,在架空输电线路中起到重要作用,即起到支撑导线和防止电流回地的作用。以前绝缘子多用于电线杆,现在已逐步发展成为挂在高压电线连接塔一端的盘状绝缘体,通常是由陶瓷或玻璃制成的。绝缘子要保证在环境和电负荷条件发生变化时,各种机电应力保持不变,否则不仅起不到应有的作用,反而会损害整条线路的使用寿命。

2. 接触网绝缘子破损原因及危害

   (1)产品质量不良。由于雨季吸潮,绝缘子的绝缘性能低,而发生绝缘子闪络击穿或受热膨胀爆炸,导致炸裂,最终使绝缘子丧失绝缘。

   (2)施工不当损伤绝缘子。由于外力原因使绝缘子产生裂纹、损伤或缺釉现象,在阴雨天气导致闪络、击穿故障的发生。

3.接触网绝缘子缺陷检测图像数据集介绍

        图像数据的收集是接触网绝缘子缺陷检测的第一步,也是至关重要的一步,本项目共收集接触网绝缘子缺陷检测图像数据480幅。图像分辨率均为416×416,采集手段为夜间巡检,并利用labelimg软件对其中包含的缺陷进行标注,标签类型为两类(1.正常绝缘子;2. 损坏绝缘子)。

 4. 缺陷检测模型介绍

        本项目采用YOLOv3及轻量级网络efficientnet改进的YOLOv3对接触网缺陷绝缘子进行检测。

4.1 efficientnet模型介绍

      EfficientNet提出的compound scaling(depth, width, resolution)的方法也在论文中实验用到MobileNet v1/v2和ResNet-50上,在增加FLOPs与提升accuracy之间找最佳的trade-off。
EfficientNet v2在v1基础上提高了训练速度,同时也以损失一部分accuracy的同时大大减少了参数量,加快了推理速度(跟芯片有关,加速这个未必是确定的)。

tensorflow2版本的efficientnet实现方法:

import math
from copy import deepcopy

import tensorflow as tf
from tensorflow.keras import backend, layers


#-------------------------------------------------#
DEFAULT_BLOCKS_ARGS = [
    {'kernel_size': 3, 'repeats': 1, 'filters_in': 32, 'filters_out': 16,
     'expand_ratio': 1, 'id_skip': True, 'strides': 1, 'se_ratio': 0.25},

    {'kernel_size': 3, 'repeats': 2, 'filters_in': 16, 'filters_out': 24,
     'expand_ratio': 6, 'id_skip': True, 'strides': 2, 'se_ratio': 0.25},

    {'kernel_size': 5, 'repeats': 2, 'filters_in': 24, 'filters_out': 40,
     'expand_ratio': 6, 'id_skip': True, 'strides': 2, 'se_ratio': 0.25},

    {'kernel_size': 3, 'repeats': 3, 'filters_in': 40, 'filters_out': 80,
     'expand_ratio': 6, 'id_skip': True, 'strides': 2, 'se_ratio': 0.25},

    {'kernel_size': 5, 'repeats': 3, 'filters_in': 80, 'filters_out': 112,
     'expand_ratio': 6, 'id_skip': True, 'strides': 1, 'se_ratio': 0.25},

    {'kernel_size': 5, 'repeats': 4, 'filters_in': 112, 'filters_out': 192,
     'expand_ratio': 6, 'id_skip': True, 'strides': 2, 'se_ratio': 0.25},

    {'kernel_size': 3, 'repeats': 1, 'filters_in': 192, 'filters_out': 320,
     'expand_ratio': 6, 'id_skip': True, 'strides': 1, 'se_ratio': 0.25}
]

#-------------------------------------------------#

CONV_KERNEL_INITIALIZER = {
    'class_name': 'VarianceScaling',
    'config': {
        'scale': 2.0,
        'mode': 'fan_out',
        'distribution': 'normal'
    }
}

#-------------------------------------------------#

def correct_pad(inputs, kernel_size):
    img_dim = 1
    input_size = backend.int_shape(inputs)[img_dim:(img_dim + 2)]

    if isinstance(kernel_size, int):
        kernel_size = (kernel_size, kernel_size)

    if input_size[0] is None:
        adjust = (1, 1)
    else:
        adjust = (1 - input_size[0] % 2, 1 - input_size[1] % 2)

    correct = (kernel_size[0] // 2, kernel_size[1] // 2)

    return ((correct[0] - adjust[0], correct[0]),
            (correct[1] - adjust[1], correct[1]))

#-------------------------------------------------#

def round_filters(filters, divisor, width_coefficient):
    filters *= width_coefficient
    new_filters = max(divisor, int(filters + divisor / 2) // divisor * divisor)
    if new_filters < 0.9 * filters:
        new_filters += divisor
    return int(new_filters)

#-------------------------------------------------#

def round_repeats(repeats, depth_coefficient):
    return int(math.ceil(depth_coefficient * repeats))

#-------------------------------------------------#
#   efficient_block
#-------------------------------------------------#
def block(inputs, activation_fn=tf.nn.swish, drop_rate=0., name='',
          filters_in=32, filters_out=16, kernel_size=3, strides=1,
          expand_ratio=1, se_ratio=0., id_skip=True):

    filters = filters_in * expand_ratio
    #-------------------------------------------------#
    if expand_ratio != 1:
        x = layers.Conv2D(filters, 1,
                          padding='same',
                          use_bias=False,
                          kernel_initializer=CONV_KERNEL_INITIALIZER,
                          name=name + 'expand_conv')(inputs)
        x = layers.BatchNormalization(axis=3, name=name + 'expand_bn')(x)
        x = layers.Activation(activation_fn, name=name + 'expand_activation')(x)
    else:
        x = inputs

    #------------------------------------------------------#
   
    if strides == 2:
        x = layers.ZeroPadding2D(padding=correct_pad(x, kernel_size),
                                 name=name + 'dwconv_pad')(x)
        conv_pad = 'valid'
    else:
        conv_pad = 'same'
        
    x = layers.DepthwiseConv2D(kernel_size,
                               strides=strides,
                               padding=conv_pad,
                               use_bias=False,
                               depthwise_initializer=CONV_KERNEL_INITIALIZER,
                               name=name + 'dwconv')(x)
    x = layers.BatchNormalization(axis=3, name=name + 'bn')(x)
    x = layers.Activation(activation_fn, name=name + 'activation')(x)

    #------------------------------------------------------#
  
    if 0 < se_ratio <= 1:
        filters_se = max(1, int(filters_in * se_ratio))
        se = layers.GlobalAveragePooling2D(name=name + 'se_squeeze')(x)
        se = layers.Reshape((1, 1, filters), name=name + 'se_reshape')(se)
        #------------------------------------------------------#
  
        se = layers.Conv2D(filters_se, 1,
                           padding='same',
                           activation=activation_fn,
                           kernel_initializer=CONV_KERNEL_INITIALIZER,
                           name=name + 'se_reduce')(se)
        se = layers.Conv2D(filters, 1,
                           padding='same',
                           activation='sigmoid',
                           kernel_initializer=CONV_KERNEL_INITIALIZER,
                           name=name + 'se_expand')(se)
        x = layers.multiply([x, se], name=name + 'se_excite')

    #------------------------------------------------------#

    x = layers.Conv2D(filters_out, 1,
                      padding='same',
                      use_bias=False,
                      kernel_initializer=CONV_KERNEL_INITIALIZER,
                      name=name + 'project_conv')(x)
    x = layers.BatchNormalization(axis=3, name=name + 'project_bn')(x)

    #------------------------------------------------------#

    if (id_skip is True and strides == 1 and filters_in == filters_out):
        if drop_rate > 0:
            x = layers.Dropout(drop_rate,
                               noise_shape=(None, 1, 1, 1),
                               name=name + 'drop')(x)
        x = layers.add([x, inputs], name=name + 'add')

    return x

def EfficientNet(width_coefficient,
                 depth_coefficient,
                 drop_connect_rate=0.2,
                 depth_divisor=8,
                 activation_fn=tf.nn.swish,
                 blocks_args=DEFAULT_BLOCKS_ARGS,
                 inputs=None,
                 **kwargs):
    img_input = inputs

    #-------------------------------------------------#

    x = img_input
    x = layers.ZeroPadding2D(padding=correct_pad(x, 3),
                             name='stem_conv_pad')(x)
    x = layers.Conv2D(round_filters(32, depth_divisor, width_coefficient), 3,
                      strides=2,
                      padding='valid',
                      use_bias=False,
                      kernel_initializer=CONV_KERNEL_INITIALIZER,
                      name='stem_conv')(x)
    x = layers.BatchNormalization(axis=3, name='stem_bn')(x)
    x = layers.Activation(activation_fn, name='stem_activation')(x)

    #-------------------------------------------------#

    blocks_args = deepcopy(blocks_args)
    
    #-------------------------------------------------#

    b = 0
    blocks = float(sum(args['repeats'] for args in blocks_args))

    feats = []
    filters_outs = []
    #------------------------------------------------------------------------------#
  
    for (i, args) in enumerate(blocks_args):
        assert args['repeats'] > 0
        args['filters_in'] = round_filters(args['filters_in'], depth_divisor, width_coefficient)
        args['filters_out'] = round_filters(args['filters_out'], depth_divisor, width_coefficient)

        for j in range(round_repeats(args.pop('repeats'), depth_coefficient)):
            if j > 0:
                args['strides'] = 1
                args['filters_in'] = args['filters_out']
            x = block(x, activation_fn, drop_connect_rate * b / blocks,
                      name='block{}{}_'.format(i + 1, chr(j + 97)), **args)
            b += 1
        feats.append(x)
        if i == 2 or i == 4 or i == 6:
            filters_outs.append(args['filters_out'])
    return feats, filters_outs


def EfficientNetB0(inputs=None, **kwargs):
    return EfficientNet(1.0, 1.0, inputs=inputs, **kwargs)


def EfficientNetB1(inputs=None, **kwargs):
    return EfficientNet(1.0, 1.1, inputs=inputs, **kwargs)


def EfficientNetB2(inputs=None, **kwargs):
    return EfficientNet(1.1, 1.2, inputs=inputs, **kwargs)


def EfficientNetB3(inputs=None, **kwargs):
    return EfficientNet(1.2, 1.4, inputs=inputs, **kwargs)


def EfficientNetB4(inputs=None, **kwargs):
    return EfficientNet(1.4, 1.8, inputs=inputs, **kwargs)


def EfficientNetB5(inputs=None, **kwargs):
    return EfficientNet(1.6, 2.2, inputs=inputs, **kwargs)



def EfficientNetB6(inputs=None, **kwargs):
    return EfficientNet(1.8, 2.6, inputs=inputs, **kwargs)


def EfficientNetB7(inputs=None, **kwargs):
    return EfficientNet(2.0, 3.1, inputs=inputs, **kwargs)


if __name__ == '__main__':
    print(EfficientNetB0())

 4.2 YOLOv3模型介绍

     YOLOv3相比于之前的yolo1和yolo2,改进较大,主要改进方向有:
      1、使用了残差网络Residual,残差卷积就是进行一次3X3、步长为2的卷积,然后保存该卷积layer,再进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer作为最后的结果, 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
     2、提取多特征层进行目标检测,一共提取三个特征层,特征层的shape分别为(13,13,75),(26,26,75),(52,52,75),最后一个维度为75是因为该图是基于voc数据集的,它的类为20种,yolo3只有针对每一个特征层存在3个先验框,所以最后维度为3x25;
如果使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x85,三个特征层的shape为(13,13,255),(26,26,255),(52,52,255)
      3、其采用反卷积UmSampling2d设计,逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算,其可以更多更好的提取出特征。

tensorflow2.0版本的darknet53结构

from functools import wraps

from tensorflow.keras.initializers import RandomNormal
from tensorflow.keras.layers import (Add, BatchNormalization, Conv2D, LeakyReLU,
                          ZeroPadding2D)
from tensorflow.keras.regularizers import l2
from utils.utils import compose

#------------------------------------------------------#

@wraps(Conv2D)
def DarknetConv2D(*args, **kwargs):
    darknet_conv_kwargs = {'kernel_initializer' : RandomNormal(stddev=0.02), 'kernel_regularizer' : l2(kwargs.get('weight_decay', 5e-4))}
    darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2, 2) else 'same'   
    try:
        del kwargs['weight_decay']
    except:
        pass
    darknet_conv_kwargs.update(kwargs)
    return Conv2D(*args, **darknet_conv_kwargs)

#---------------------------------------------------#
def DarknetConv2D_BN_Leaky(*args, **kwargs):
    no_bias_kwargs = {'use_bias': False}
    no_bias_kwargs.update(kwargs)
    return compose( 
        DarknetConv2D(*args, **no_bias_kwargs),
        BatchNormalization(),
        LeakyReLU(alpha=0.1))

#---------------------------------------------------------------------#
def resblock_body(x, num_filters, num_blocks, weight_decay=5e-4):
    x = ZeroPadding2D(((1,0),(1,0)))(x)
    x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2), weight_decay=weight_decay)(x)
    for i in range(num_blocks):
        y = DarknetConv2D_BN_Leaky(num_filters//2, (1,1), weight_decay=weight_decay)(x)
        y = DarknetConv2D_BN_Leaky(num_filters, (3,3), weight_decay=weight_decay)(y)
        x = Add()([x,y])
    return x

#---------------------------------------------------#

def darknet_body(x, weight_decay=5e-4):
    # 416,416,3 -> 416,416,32
    x = DarknetConv2D_BN_Leaky(32, (3,3), weight_decay=weight_decay)(x)
    # 416,416,32 -> 208,208,64
    x = resblock_body(x, 64, 1)
    # 208,208,64 -> 104,104,128
    x = resblock_body(x, 128, 2)
    # 104,104,128 -> 52,52,256
    x = resblock_body(x, 256, 8)
    feat1 = x
    # 52,52,256 -> 26,26,512
    x = resblock_body(x, 512, 8)
    feat2 = x
    # 26,26,512 -> 13,13,1024
    x = resblock_body(x, 1024, 4)
    feat3 = x
    return feat1, feat2, feat3

  tensorflow2版本的FPN结构

def yolo_body(input_shape, anchors_mask, num_classes, weight_decay=5e-4):
    inputs      = Input(input_shape)
  
    #---------------------------------------------------#
    C3, C4, C5  = darknet_body(inputs, weight_decay)

    #---------------------------------------------------#
 
    # 13,13,1024 -> 13,13,512 -> 13,13,1024 -> 13,13,512 -> 13,13,1024 -> 13,13,512
    x   = make_five_conv(C5, 512, weight_decay)
    P5  = make_yolo_head(x, 512, len(anchors_mask[0]) * (num_classes+5), weight_decay)

    # 13,13,512 -> 13,13,256 -> 26,26,256
    x   = compose(DarknetConv2D_BN_Leaky(256, (1,1), weight_decay=weight_decay), UpSampling2D(2))(x)

    # 26,26,256 + 26,26,512 -> 26,26,768
    x   = Concatenate()([x, C4])
    #---------------------------------------------------#
 
    # 26,26,768 -> 26,26,256 -> 26,26,512 -> 26,26,256 -> 26,26,512 -> 26,26,256
    x   = make_five_conv(x, 256, weight_decay)
    P4  = make_yolo_head(x, 256, len(anchors_mask[1]) * (num_classes+5), weight_decay)

    # 26,26,256 -> 26,26,128 -> 52,52,128
    x   = compose(DarknetConv2D_BN_Leaky(128, (1,1), weight_decay=weight_decay), UpSampling2D(2))(x)
    # 52,52,128 + 52,52,256 -> 52,52,384
    x   = Concatenate()([x, C3])
    #---------------------------------------------------#

    # 52,52,384 -> 52,52,128 -> 52,52,256 -> 52,52,128 -> 52,52,256 -> 52,52,128
    x   = make_five_conv(x, 128, weight_decay)
    P3  = make_yolo_head(x, 128, len(anchors_mask[2]) * (num_classes+5), weight_decay)
    return Model(inputs, [P5, P4, P3])

4.3 efficientnet-YOLOv3模型介绍

     2019年,谷歌新出EfficientNet,网络如其名,这个网络非常的有效率,主要为以下几点:

     1、网络要可以训练,可以收敛。
     2、参数量要比较小,方便训练,提高速度。
     3、创新神经网络的结构,学到更深层语义特征。

 5. 模型训练与测试

 5.1 模型训练

       将接触网绝缘子检测图像数据集按9:1随机选取训练集及测试集。训练环境tensorflow2.2,3080显卡。采用带动量的随机梯度下降优化算法(SGDM)进行训练, 动量 = 0.937,权值衰减系数=0.0005。训练过程中损失值曲线如下:

YOLOv3

efficientnet-YOLOv3

YOLOv3

efficientnet-YOLOv3

5.2 检测性能测试

     经测试YOLOv3对接触网绝缘子检测的mAP值=90.42%,FPS=28.97。efficientnet-YOLOv3对接触网绝缘子检测的mAP值=88.99%,FPS=58.42。

YOLOv3
efficientnet-YOLOv3

利用预测框的尺寸对原图像中目标检测裁剪的python代码:

for i, c in list(enumerate(out_boxes)):
                top, left, bottom, right = out_boxes[i]
                top     = max(0, np.floor(top).astype('int32'))
                left    = max(0, np.floor(left).astype('int32'))
                bottom  = min(image.size[1], np.floor(bottom).astype('int32'))
                right   = min(image.size[0], np.floor(right).astype('int32'))
                
                dir_save_path = "img_crop"
                if not os.path.exists(dir_save_path):
                    os.makedirs(dir_save_path)
                crop_image = image.crop([left, top, right, bottom])
                crop_image.save(os.path.join(dir_save_path, "crop_" + str(i) + ".png"), quality=95, subsampling=0)
                print("save crop_" + str(i) + ".png to " + dir_save_path)

参考:

[1] 绝缘子的作用,未来发展会如何? - 知乎
[2]YOLOv3介绍((感谢Bubbliiiing大神))

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

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

相关文章

基于鲸鱼算法优化的lssvm回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于Wechaty+Docker打造一个ChatGPT机器人

所需资源 云服务器&#xff08;国外&#xff09;我的配置&#xff1a;腾讯香港轻量云 2H 2G 30MDockerGithub地址&#xff1a;https://github.com/fuergaosi233/wechat-chatgpt文章来自&#xff1a;与时团队-小染&#xff0c;以及我的部分修改 你也可以选择不适用Docker搭建&am…

windows WSL 安装并配置镜像与SSH

文章目录1 WSL介绍2 安装步骤2.1 启用适用于 Linux 的 Windows 子系统2.2 检查运行 WSL 2 的要求2.3 启用虚拟机功能2.4 下载 Linux 内核更新包2.5 将 WSL 2 设置为默认版本2.6 安装所选的Linux 分发解决无法打开微软商店2.6.1 配置网络2.6.2 使用官方教程的链接2.6.3 使用命令…

【C语言进阶】使用gettimeofday为你的程序运行时间做统计

作者简介 架构师李肯&#xff08;全网同名&#xff09;&#xff0c;一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验&#xff0c;深耕IoT领域多年&#xff0c;熟知IoT领域的业务发展&#xff0c;深度掌握IoT领域的相关技术栈&#xff0c;包括但不限于主流RTO…

pcl点云处理

pcl点云处理 1.安装 系统&#xff1a; ubuntu20.04 方法1. 直接命令行方式安装 sudo apt-get install libpcl-devubuntu20.04下默认的pcl版本是1.10. 头文件路径在/usr/include/pcl-1.10/ 方法2.源码编译安装 推荐源码安装&#xff0c;我们安装1.12.1版本&#xff0c;直…

pve制作资源池

pve制作资源池pve制作资源池步骤1.创建资源池2.添加资源池存储成员3.创建用户身份组进行管理4.查看用户角色权限划分单个权限5.创建新角色控制权限6.创建群组权限7.创建测试用户8.模板制作将模板进行迁移&#xff0c;错误&#xff1a;pve无法迁移&#xff1a; cant migrate VM …

kafaka ElasticSearch 集群,解决问题,工作流程及配置

一、作用 性能优化&#xff1a;jvm多线程和I/O&#xff0c;kafkaes 组合的架构&#xff0c;是为了降低es io瓶颈 二、工作流程 如下两图示意&#xff0c; agent&#xff08;指的是filebeat、metricbeat、auditbeat、API服务、logstash&#xff09;收集需要提取的日志文件&…

【linux】之大数据基础平台实施及运维下

一、完全分布式部署介绍 学习目标 能够了解完全分布式部署场景 完全分部式是真正利用多台Linux主机来进行部署Hadoop&#xff0c;对Linux机器集群进行规划&#xff0c;使得Hadoop各个模块分别部署在不同的多台机器上。 二、NameNode HA完全分布式部署 学习目标 能够了解HA完…

计算机网络习题集

文章目录题目答案&#xff1a;题目一&#xff1a;答案一&#xff1a;题目二答案二&#xff1a;题目三&#xff1a;题四&#xff1a;答案四&#xff1a;题目答案&#xff1a; 一、 单项选择题 计算机网络最突出的优点是( D ) A. 精度高 B. 内存容量大 C. 运算速度快 D. 共享资…

【深入浅出SpringCloud原理及实战】「SpringCloud-Alibaba系列」微服务模式搭建系统基础架构实战指南及版本规划踩坑分析

前提介绍 SpringCloud-Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件&#xff0c;方便开发者通过 Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&#xff0c;您只需要添加一些注解和少量配…

计算机网络(自顶向下)学习笔记——网络层

第四章—网络层 4.1、概述 转发功能和路由选择功能的区别&#xff1f; 转发涉及在单个的路由中从一条入链路到一条出链路的传送路由选择涉及一个网络的所有路由器&#xff0c;他们经路由选择协议共同交互&#xff0c;决定分组从源到目地结点所采用的的路径 4.1.1、转发和路…

Metal每日分享,调整透明度滤镜效果

本案例的目的是理解如何用Metal实现调整透明度效果滤镜&#xff0c;核心就是改变图像像素的透明度值&#xff1b; Demo HarbethDemo地址 实操代码 // 透明度滤镜 let filter C7Opacity.init(opacity: 0.75)// 方案1: ImageView.image try? BoxxIO(element: originImage, …

java MybatisPlus入门 字段映射 分页查询 逻辑删除 乐观锁

MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提高效率 入门案例 继承BaseMapper<自己的domain类> 就可以了&#xff0c;自动装配后直接会有各种方法 标准数据层开发 MP分页查询功能 条件查询 NULL值控制…

玩以太坊链上项目的必备技能(单位以及全局变量-Solidity之旅七)

以太币单位&#xff08;Ether&#xff09; 甭管是虚拟货币还是现实中的“稳定币”&#xff0c;他们都有各自的货币单位。当然咯&#xff0c;作为以太坊区块链上交易的虚拟货币以太坊也是有属于自己的那一套货币单位的。 而目前以太币&#xff08;Ether&#xff09;主要分为这…

python批量下载apache文件服务器文件

此脚本用于下载apache文件服务器中制定某个文件夹下所有文件与文件夹。 包含下载单个文件的方法、拼接url递归下载的方法、参数解析。 1 下载文件 功能点&#xff1a; 文件下载 以追加写的方式打开一个新文件&#xff0c;按照块大小写入文件 with open(filepath, wb) as fi…

Kafka实战 - 03 Kafka生产者:将X平台的告警和事件数据接入到S平台

文章目录1. 项目背景2. 依赖和配置3. 生产者配置 KafkaConfiguration4. 同步数据Topic枚举 SyncDataTopicEnum5. 请求体 DataSyncQo6. 同步数据控制层 AppSyncDataController7. 同步数据业务层 XdrDataSyncServiceImpl1. 项目背景 资产可能会遭受各种网络攻击&#xff0c;安全…

[附源码]Python计算机毕业设计SSM基于JAVA语言的宠物寄养管理(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

1,4-丁炔二醇BYD物料中含有大量铜离子、二氧化硅等杂质怎么办?

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…

[附源码]Python计算机毕业设计SSM基于web的社团管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

免费开源的图片修复工具Lama Cleaner

什么是 Lama Cleaner &#xff1f; Lama Cleaner 是由 SOTA AI 模型提供支持的图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人&#xff0c;或者擦除并替换&#xff08;powered by stable diffusion&#xff09;图片上的任何东西。 看看官方提供的视频&#xff0c;应…