竞赛选题 深度学习+python+opencv实现动物识别 - 图像识别

文章目录

  • 0 前言
  • 1 课题背景
  • 2 实现效果
  • 3 卷积神经网络
    • 3.1卷积层
    • 3.2 池化层
    • 3.3 激活函数:
    • 3.4 全连接层
    • 3.5 使用tensorflow中keras模块实现卷积神经网络
  • 4 inception_v3网络
  • 5 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 **基于深度学习的动物识别算法 **

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

在这里插入图片描述

1 课题背景

利用深度学习对野生动物进行自动识别分类,可以大大提高野生动物监测效率,为野生动物保护策略的制定提供可靠的数据支持。但是目前野生动物的自动识别仍面临着监测图像背景信息复杂、质量低造成的识别准确率低的问题,影响了深度学习技术在野生动物保护领域的应用落地。为了实现高准确率的野生动物自动识别,本项目基于卷积神经网络实现图像动物识别。

2 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 卷积神经网络

受到人类大脑神经突触结构相互连接的模式启发,神经网络作为人工智能领域的重要组成部分,通过分布式的方法处理信息,可以解决复杂的非线性问题,从构造方面来看,主要包括输入层、隐藏层、输出层三大组成结构。每一个节点被称为一个神经元,存在着对应的权重参数,部分神经元存在偏置,当输入数据x进入后,对于经过的神经元都会进行类似于:y=w*x+b的线性函数的计算,其中w为该位置神经元的权值,b则为偏置函数。通过每一层神经元的逻辑运算,将结果输入至最后一层的激活函数,最后得到输出output。
在这里插入图片描述

3.1卷积层

卷积核相当于一个滑动窗口,示意图中3x3大小的卷积核依次划过6x6大小的输入数据中的对应区域,并与卷积核滑过区域做矩阵点乘,将所得结果依次填入对应位置即可得到右侧4x4尺寸的卷积特征图,例如划到右上角3x3所圈区域时,将进行0x0+1x1+2x1+1x1+0x0+1x1+1x0+2x0x1x1=6的计算操作,并将得到的数值填充到卷积特征的右上角。
在这里插入图片描述

3.2 池化层

池化操作又称为降采样,提取网络主要特征可以在达到空间不变性的效果同时,有效地减少网络参数,因而简化网络计算复杂度,防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式,如下图所示。虽然池化操作可以有效的降低参数数量,但过度池化也会导致一些图片细节的丢失,因此在搭建网络时要根据实际情况来调整池化操作。
在这里插入图片描述

3.3 激活函数:

激活函数大致分为两种,在卷积神经网络的发展前期,使用较为传统的饱和激活函数,主要包括sigmoid函数、tanh函数等;随着神经网络的发展,研宄者们发现了饱和激活函数的弱点,并针对其存在的潜在问题,研宄了非饱和激活函数,其主要含有ReLU函数及其函数变体

3.4 全连接层

在整个网络结构中起到“分类器”的作用,经过前面卷积层、池化层、激活函数层之后,网络己经对输入图片的原始数据进行特征提取,并将其映射到隐藏特征空间,全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间,一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化,也是图像处理当中的重要一环。

3.5 使用tensorflow中keras模块实现卷积神经网络

class CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tf.keras.layers.Conv2D(filters=32,             # 卷积层神经元(卷积核)数目kernel_size=[5, 5],     # 感受野大小padding='same',         # padding策略(vaild 或 same)activation=tf.nn.relu   # 激活函数)self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5, 5],padding='same',activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)self.dense2 = tf.keras.layers.Dense(units=10)def call(self, inputs):x = self.conv1(inputs)                  # [batch_size, 28, 28, 32]x = self.pool1(x)                       # [batch_size, 14, 14, 32]x = self.conv2(x)                       # [batch_size, 14, 14, 64]x = self.pool2(x)                       # [batch_size, 7, 7, 64]x = self.flatten(x)                     # [batch_size, 7 * 7 * 64]x = self.dense1(x)                      # [batch_size, 1024]x = self.dense2(x)                      # [batch_size, 10]output = tf.nn.softmax(x)return output

4 inception_v3网络

简介
如果 ResNet 是为了更深,那么 Inception 家族就是为了更宽。Inception
的作者对训练更大型网络的计算效率尤其感兴趣。换句话说:怎样在不增加计算成本的前提下扩展神经网络?

网路结构图
在这里插入图片描述
主要改动
在这里插入图片描述

  • 将7×7卷积分解为3个3×3的卷积。
  • 35×35的Inception模块采用图1所示结构,之后采用图5类似结构进行下采样
  • 17×17的Inception模块采用图2所示结构,也是采用图5类似结构下采样
  • 8×8的Inception模块采用图3所示结构,进行较大维度的提升。

Tensorflow实现代码

import osimport kerasimport numpy as npimport tensorflow as tffrom tensorflow.keras import layersfrom tensorflow.keras.models import Modelconfig = tf.compat.v1.ConfigProto()config.gpu_options.allow_growth = True      # TensorFlow按需分配显存config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 指定显存分配比例inceptionV3_One={'1a':[64,48,64,96,96,32],'2a':[64,48,64,96,96,64],'3a':[64,48,64,96,96,64]}inceptionV3_Two={'1b':[192,128,128,192,128,128,128,128,192,192],'2b':[192,160,160,192,160,160,160,160,192,192],'3b':[192,160,160,192,160,160,160,160,192,192],'4b':[192,192,192,192,192,192,192,192,192,192]}keys_two=(list)(inceptionV3_Two.keys())inceptionV3_Three={'1c':[320,384,384,384,448,384,384,384,192],'2c':[320,384,384,384,448,384,384,384,192]}keys_three=(list)(inceptionV3_Three.keys())def InceptionV3(inceptionV3_One,inceptionV3_Two,inceptionV3_Three):keys_one=(list)(inceptionV3_One.keys())keys_two = (list)(inceptionV3_Two.keys())keys_three = (list)(inceptionV3_Three.keys())input=layers.Input(shape=[299,299,3])# 输入部分conv1_one = layers.Conv2D(32, kernel_size=[3, 3], strides=[2, 2], padding='valid')(input)conv1_batch=layers.BatchNormalization()(conv1_one)conv1relu=layers.Activation('relu')(conv1_batch)conv2_one = layers.Conv2D(32, kernel_size=[3, 3], strides=[1,1],padding='valid')(conv1relu)conv2_batch=layers.BatchNormalization()(conv2_one)conv2relu=layers.Activation('relu')(conv2_batch)conv3_padded = layers.Conv2D(64, kernel_size=[3, 3], strides=[1,1],padding='same')(conv2relu)conv3_batch=layers.BatchNormalization()(conv3_padded)con3relu=layers.Activation('relu')(conv3_batch)pool1_one = layers.MaxPool2D(pool_size=[3, 3], strides=[2, 2])(con3relu)conv4_one = layers.Conv2D(80, kernel_size=[3,3], strides=[1,1], padding='valid')(pool1_one)conv4_batch=layers.BatchNormalization()(conv4_one)conv4relu=layers.Activation('relu')(conv4_batch)conv5_one = layers.Conv2D(192, kernel_size=[3, 3], strides=[2,2], padding='valid')(conv4relu)conv5_batch = layers.BatchNormalization()(conv5_one)x=layers.Activation('relu')(conv5_batch)"""filter11:1x1的卷积核个数filter13:3x3卷积之前的1x1卷积核个数filter33:3x3卷积个数filter15:使用3x3卷积代替5x5卷积之前的1x1卷积核个数filter55:使用3x3卷积代替5x5卷积个数filtermax:最大池化之后的1x1卷积核个数"""for i in range(3):conv11 = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][0]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion11 = layers.BatchNormalization()(conv11)conv11relu = layers.Activation('relu')(batchnormaliztion11)conv13 = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][1]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion13 = layers.BatchNormalization()(conv13)conv13relu = layers.Activation('relu')(batchnormaliztion13)conv33 = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][2]), kernel_size=[5, 5], strides=[1, 1], padding='same')(conv13relu)batchnormaliztion33 = layers.BatchNormalization()(conv33)conv33relu = layers.Activation('relu')(batchnormaliztion33)conv1533 = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][3]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion1533 = layers.BatchNormalization()(conv1533)conv1522relu = layers.Activation('relu')(batchnormaliztion1533)conv5533first = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][4]), kernel_size=[3, 3], strides=[1, 1], padding='same')(conv1522relu)batchnormaliztion5533first = layers.BatchNormalization()(conv5533first)conv5533firstrelu = layers.Activation('relu')(batchnormaliztion5533first)conv5533last = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][4]), kernel_size=[3, 3], strides=[1, 1], padding='same')(conv5533firstrelu)batchnormaliztion5533last = layers.BatchNormalization()(conv5533last)conv5533lastrelu = layers.Activation('relu')(batchnormaliztion5533last)maxpool = layers.AveragePooling2D(pool_size=[3, 3], strides=[1, 1], padding='same')(x)maxconv11 = layers.Conv2D((int)(inceptionV3_One[keys_one[i]][5]), kernel_size=[1, 1], strides=[1, 1], padding='same')(maxpool)batchnormaliztionpool = layers.BatchNormalization()(maxconv11)convmaxrelu = layers.Activation('relu')(batchnormaliztionpool)x=tf.concat([conv11relu,conv33relu,conv5533lastrelu,convmaxrelu],axis=3)conv1_two = layers.Conv2D(384, kernel_size=[3, 3], strides=[2, 2], padding='valid')(x)conv1batch=layers.BatchNormalization()(conv1_two)conv1_tworelu=layers.Activation('relu')(conv1batch)conv2_two = layers.Conv2D(64, kernel_size=[1, 1], strides=[1, 1], padding='same')(x)conv2batch=layers.BatchNormalization()(conv2_two)conv2_tworelu=layers.Activation('relu')(conv2batch)conv3_two = layers.Conv2D( 96, kernel_size=[3, 3], strides=[1,1], padding='same')(conv2_tworelu)conv3batch=layers.BatchNormalization()(conv3_two)conv3_tworelu=layers.Activation('relu')(conv3batch)conv4_two = layers.Conv2D( 96, kernel_size=[3, 3], strides=[2, 2], padding='valid')(conv3_tworelu)conv4batch=layers.BatchNormalization()(conv4_two)conv4_tworelu=layers.Activation('relu')(conv4batch)maxpool = layers.MaxPool2D(pool_size=[3, 3], strides=[2, 2])(x)x=tf.concat([conv1_tworelu,conv4_tworelu,maxpool],axis=3)"""filter11:1x1的卷积核个数filter13:使用1x3,3x1卷积代替3x3卷积之前的1x1卷积核个数filter33:使用1x3,3x1卷积代替3x3卷积的个数filter15:使用1x3,3x1,1x3,3x1卷积卷积代替5x5卷积之前的1x1卷积核个数filter55:使用1x3,3x1,1x3,3x1卷积代替5x5卷积个数filtermax:最大池化之后的1x1卷积核个数"""for i in range(4):conv11 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][0]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion11 = layers.BatchNormalization()(conv11)conv11relu=layers.Activation('relu')(batchnormaliztion11)conv13 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][1]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion13 = layers.BatchNormalization()(conv13)conv13relu=layers.Activation('relu')(batchnormaliztion13)conv3313 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][2]), kernel_size=[1, 7], strides=[1, 1], padding='same')(conv13relu)batchnormaliztion3313 = layers.BatchNormalization()(conv3313)conv3313relu=layers.Activation('relu')(batchnormaliztion3313)conv3331 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][3]), kernel_size=[7, 1], strides=[1, 1], padding='same')(conv3313relu)batchnormaliztion3331 = layers.BatchNormalization()(conv3331)conv3331relu=layers.Activation('relu')(batchnormaliztion3331)conv15 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][4]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion15 = layers.BatchNormalization()(conv15)conv15relu=layers.Activation('relu')(batchnormaliztion15)conv1513first = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][5]), kernel_size=[1, 7], strides=[1, 1], padding='same')(conv15relu)batchnormaliztion1513first = layers.BatchNormalization()(conv1513first)conv1513firstrelu=layers.Activation('relu')(batchnormaliztion1513first)conv1531second = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][6]), kernel_size=[7, 1], strides=[1, 1], padding='same')(conv1513firstrelu)batchnormaliztion1531second = layers.BatchNormalization()(conv1531second)conv1531second=layers.Activation('relu')(batchnormaliztion1531second)conv1513third = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][7]), kernel_size=[1, 7], strides=[1, 1], padding='same')(conv1531second)batchnormaliztion1513third = layers.BatchNormalization()(conv1513third)conv1513thirdrelu=layers.Activation('relu')(batchnormaliztion1513third)conv1531last = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][8]), kernel_size=[7, 1], strides=[1, 1], padding='same')(conv1513thirdrelu)batchnormaliztion1531last = layers.BatchNormalization()(conv1531last)conv1531lastrelu=layers.Activation('relu')(batchnormaliztion1531last)maxpool = layers.AveragePooling2D(pool_size=[3, 3], strides=[1, 1], padding='same')(x)maxconv11 = layers.Conv2D((int)(inceptionV3_Two[keys_two[i]][9]), kernel_size=[1, 1], strides=[1, 1], padding='same')(maxpool)maxconv11relu = layers.BatchNormalization()(maxconv11)maxconv11relu = layers.Activation('relu')(maxconv11relu)x=tf.concat([conv11relu,conv3331relu,conv1531lastrelu,maxconv11relu],axis=3)conv11_three=layers.Conv2D(192, kernel_size=[1, 1], strides=[1, 1], padding='same')(x)conv11batch=layers.BatchNormalization()(conv11_three)conv11relu=layers.Activation('relu')(conv11batch)conv33_three=layers.Conv2D(320, kernel_size=[3, 3], strides=[2, 2], padding='valid')(conv11relu)conv33batch=layers.BatchNormalization()(conv33_three)conv33relu=layers.Activation('relu')(conv33batch)conv7711_three=layers.Conv2D(192, kernel_size=[1, 1], strides=[1, 1], padding='same')(x)conv77batch=layers.BatchNormalization()(conv7711_three)conv77relu=layers.Activation('relu')(conv77batch)conv7717_three=layers.Conv2D(192, kernel_size=[1, 7], strides=[1, 1], padding='same')(conv77relu)conv7717batch=layers.BatchNormalization()(conv7717_three)conv7717relu=layers.Activation('relu')(conv7717batch)conv7771_three=layers.Conv2D(192, kernel_size=[7, 1], strides=[1, 1], padding='same')(conv7717relu)conv7771batch=layers.BatchNormalization()(conv7771_three)conv7771relu=layers.Activation('relu')(conv7771batch)conv33_three=layers.Conv2D(192, kernel_size=[3, 3], strides=[2, 2], padding='valid')(conv7771relu)conv3377batch=layers.BatchNormalization()(conv33_three)conv3377relu=layers.Activation('relu')(conv3377batch)convmax_three=layers.MaxPool2D(pool_size=[3, 3], strides=[2, 2])(x)x=tf.concat([conv33relu,conv3377relu,convmax_three],axis=3)"""filter11:1x1的卷积核个数filter13:使用1x3,3x1卷积代替3x3卷积之前的1x1卷积核个数filter33:使用1x3,3x1卷积代替3x3卷积的个数filter15:使用3x3卷积代替5x5卷积之前的1x1卷积核个数filter55:使用3x3卷积代替5x5卷积个数filtermax:最大池化之后的1x1卷积核个数"""for i in range(2):conv11 = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][0]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion11 = layers.BatchNormalization()(conv11)conv11relu=layers.Activation('relu')(batchnormaliztion11)conv13 = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][1]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion13 = layers.BatchNormalization()(conv13)conv13relu=layers.Activation('relu')(batchnormaliztion13)conv33left = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][2]), kernel_size=[1, 3], strides=[1, 1], padding='same')(conv13relu)batchnormaliztion33left = layers.BatchNormalization()(conv33left)conv33leftrelu=layers.Activation('relu')(batchnormaliztion33left)conv33right = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][3]), kernel_size=[3, 1], strides=[1, 1], padding='same')(conv33leftrelu)batchnormaliztion33right = layers.BatchNormalization()(conv33right)conv33rightrelu=layers.Activation('relu')(batchnormaliztion33right)conv33rightleft=tf.concat([conv33leftrelu,conv33rightrelu],axis=3)conv15 = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][4]), kernel_size=[1, 1], strides=[1, 1], padding='same')(x)batchnormaliztion15 = layers.BatchNormalization()(conv15)conv15relu=layers.Activation('relu')(batchnormaliztion15)conv1533 = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][5]), kernel_size=[3, 3], strides=[1, 1], padding='same')(conv15relu)batchnormaliztion1533 = layers.BatchNormalization()(conv1533)conv1533relu=layers.Activation('relu')(batchnormaliztion1533)conv1533left = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][6]), kernel_size=[1, 3], strides=[1, 1], padding='same')(conv1533relu)batchnormaliztion1533left = layers.BatchNormalization()(conv1533left)conv1533leftrelu=layers.Activation('relu')(batchnormaliztion1533left)conv1533right = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][6]), kernel_size=[3, 1], strides=[1, 1], padding='same')(conv1533leftrelu)batchnormaliztion1533right = layers.BatchNormalization()(conv1533right)conv1533rightrelu=layers.Activation('relu')(batchnormaliztion1533right)conv1533leftright=tf.concat([conv1533right,conv1533rightrelu],axis=3)maxpool = layers.AveragePooling2D(pool_size=[3, 3], strides=[1, 1],padding='same')(x)maxconv11 = layers.Conv2D((int)(inceptionV3_Three[keys_three[i]][8]), kernel_size=[1, 1], strides=[1, 1], padding='same')(maxpool)batchnormaliztionpool = layers.BatchNormalization()(maxconv11)maxrelu = layers.Activation('relu')(batchnormaliztionpool)x=tf.concat([conv11relu,conv33rightleft,conv1533leftright,maxrelu],axis=3)x=layers.GlobalAveragePooling2D()(x)x=layers.Dense(1000)(x)softmax=layers.Activation('softmax')(x)model_inceptionV3=Model(inputs=input,outputs=softmax,name='InceptionV3')return model_inceptionV3model_inceptionV3=InceptionV3(inceptionV3_One,inceptionV3_Two,inceptionV3_Three)model_inceptionV3.summary()

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突

注释掉2.0引入的俩包 直接引入3.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency> swagger配置文件粘贴即用哦 import org.springfram…

git多分支、git远程仓库、ssh方式连接远程仓库、协同开发(避免冲突)、解决协同冲突(多人在同一分支开发、 合并分支)

1 git多分支 2 git远程仓库 2.1 普通开发者&#xff0c;使用流程 3 ssh方式连接远程仓库 4 协同开发 4.1 避免冲突 4.2 协同开发 5 解决协同冲突 5.1 多人在同一分支开发 5.2 合并分支 1 git多分支 ## 命令操作分支-1 创建分支git branch dev-2 查看分支git branch-3 分支合…

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单&#xff0c;允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台&#xff0c;但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示&#xff0c;留存联系方式更加精…

伦敦银单位转换很简单

伦敦银源自于英国伦敦的电子化的白银投资方式&#xff0c;高杠杆和高收益的它的基本属性&#xff0c;但有别于国内大家所熟悉的投资品种&#xff0c;伦敦银在交易过程中有很多不一样的地方&#xff0c;需要大家地去留意。 比如伦敦银的计价单位是盎司&#xff0c;而且具体来说…

我们又组织了一次欧洲最大开源社区活动,Hugging Face 博客欢迎社区成员发帖、Hugging Chat 功能更新!...

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

应用在汽车发动机温度检测中的高精度温度传感芯片

汽车发动机是为汽车提供动力的装置&#xff0c;是汽车的心脏&#xff0c;决定着汽车的动力性、经济性、稳定性和环保性。根据动力来源不同&#xff0c;汽车发动机可分为柴油发动机、汽油发动机、电动汽车电动机以及混合动力等。 常见的车用温度传感器有进气温度传感器、变速器…

Mysql数据库 1.概述

Mysql内容概述 1. Mysql概述 数据库相关概念&#xff1a; 名称 全称 简称 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储 …

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…

Chrome插件精选 — 鼠标手势插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件记录下比较好用的一款或几款&#xff0c;便于节省尝试的时间和精力。 下面是两款比较好用的鼠标手势插件&#xff0c;支持很多设置选项&#xff0c;可以自定义手势&…

【问题思考】为什么SCAN CSCAN会导致磁臂黏着而FCFS不会导致磁臂黏着?

问题 这道18年的真题引起了我的疑惑&#xff0c;SCAN和CSCAN我认为应该也不会导致磁臂黏着&#xff0c;因为他们对于一个访问序列&#xff0c;比如19&#xff0c;24&#xff0c;52&#xff0c;现在正往外走&#xff0c;但是来了一个12的&#xff0c;不是早晚会往回走&#xff…

【C++】如何使用RapidXML读取和创建XML文件

2023年10月11日&#xff0c;周三下午 目录 RapidXML的官网使用rapidXML读取XML文件中的元素的属性和值此次要读取的XML文件&#xff1a;ReadExample.xml用于读取此XML文件的C代码运行结果使用rapidXML创建XML文件用于创建XML文件的C代码 如果上面的代码无法运行运行结果​编辑…

动态分区分配算法之首次适应算法,最佳适应算法,最坏适应算法以及邻近适应算法

1.首次适应算法(First Fit) 1.算法思想: 每次都从低地址开始查找&#xff0c;找到第一个能满足大小的空闲分区。 2.如何实现: 空闲分区以地址递增的次序排列。 每次分配内存时顺序查找空闲分区链&#xff08;或空闲分区表&#xff09;&#xff0c;找到大小能满足要求的第一…

【MySql】7- 实践篇(五)

文章目录 1. 加锁规则1.1 案例一&#xff1a;等值查询间隙锁1.2 案例二&#xff1a;非唯一索引等值锁1.3 案例三&#xff1a;主键索引范围锁1.4 案例四&#xff1a;非唯一索引范围锁1.5 案例五&#xff1a;唯一索引范围锁 bug1.6 案例六&#xff1a;非唯一索引上存在"等值…

7 使用Docker容器管理的tomcat容器中的项目连接mysql数据库

1、查看容器的IP 1&#xff09;进入容器 docker exec -it mysql-test /bin/bash 2&#xff09;显示hosts文件内容 cat /etc/hosts 这里容器的ip为172.17.0.2 除了上面的方法外&#xff0c;也可以在容器外使用docker inspect查看容器的IP docker inspect mysql-test 以下为…

postman 密码rsa加密登录-1获取公钥

fiddler抓包看到&#xff1a;请求系统地址会自动跳转到sso接口&#xff0c;查看200状态的接口返回的html里存在一个encrypt的信息&#xff0c;咨询开发这个就是返回的公钥。 在postman的tests里对该返回进行处理&#xff0c;获取公钥并设为环境变量 //获取公钥 var pubKey re…

js深拷贝与浅拷贝

1.浅拷贝概念 浅拷贝是其属性与拷贝源对象的属性共享相同引用&#xff0c;当你更改源或副本时&#xff0c;也可能&#xff08;可能说的是只针对引用数据类型&#xff09;导致其他对象也发生更改。 特性&#xff1a; 会新创建一个对象&#xff0c;即objobj2返回fasle&#xf…

渗透测试漏洞挖掘技巧

文章目录 一、使用.json进行敏感数据泄漏二、如何查找身份验证绕过漏洞三、在Drupal上找到隐藏的页面四、遗忘的数据库备份五、电子邮件地址payloads六、HTTP主机头&#xff1a;localhost七、通过篡改URI访问管理面板八、通过URL编码空格访问管理面板九、篡改URI绕过403十、Byp…

【Spring源码分析】Bean的元数据和一些Spring的工具

Bean的元数据和一些Spring工具 一、BeanDefinition1、认识 BeanDifinition2、AbstractBeanDefinition3、GenericBeanDefinition测试 二、BeanDefinition 注册器三、加载BeanDefinition四、包扫描过程分析包扫描过程总结 五、内省 API六、反射工具Bean 的创建批量构造Resolvable…

c++视觉处理---仿射变换和二维旋转变换矩阵的函数

仿射变换cv::warpAffine cv::warpAffine 是OpenCV中用于执行仿射变换的函数。仿射变换是一种线性变换&#xff0c;可用于执行平移、旋转、缩放和剪切等操作。下面是 cv::warpAffine 函数的基本用法&#xff1a; cv::warpAffine(src, dst, M, dsize, flags, borderMode, borde…

【学习笔记】Spring Security 01 认识Spring Security的重要特征(Features)

Spring Security 零、概述 Spring Security&#xff08;简称SS&#xff09;是一个高可用的、可自定义的身份认证和鉴权控制的框架。 类似的框架还有Shiro。 需求场景&#xff1a; 现今流行的web开发中&#xff0c;安全的第一位。 原本的鉴权开发流程&#xff1a;springweb自…