GoogleNet网络详解与keras实现

GoogleNet网络详解与keras实现

  • GoogleNet网络详解与keras实现
      • GoogleNet系列网络的概览
      • Pascal_VOC数据集
        • 第一层目录
        • 第二层目录
        • 第三层目录
      • InceptionV1模块介绍
      • Inception的架构
      • GoogleNet的图片
      • Keras代码实现
        • 为了搭建Inception网络我们使用了以下策略
        • 整个代码的流程如下
      • 实验结果
      • 实验结果分析
      • 本博客相关引用

本博客旨在给经典的GoogleNet网络进行详解与代码实现,如有不足或者其他的见解,请在本博客下面留言。

GoogleNet系列网络的概览

  1. InceptionV1,通过把不同尺寸的卷积核如1x1,3x3,5x5进行堆叠增加了网络对不同尺度的适应性。并且通过在3x3的网络,5x5的网络后加入1x1使得网络的计算复杂度降低,而且提高网络的非线性的程度,基于更强的表征能力。
  2. InceptionV2,加入了BatchNormalization层,减少了Internal Variance Shift。使得每一程的输出的分布都满足指定的高斯分布,可以防止训练集与测试集之间分布的不匹配,还能加快网络收敛速度,防止过拟合。
  3. InceptionV3,在InceptionV3中google将分解的思想用到了极致,把二维卷积核(NxN)拆成两个方向上的一维卷积核(Nx1,1xN)。这样做不仅仅加快了网络的运算速度,而且由于增加网络的层数,使得网络的非线性增加,提高网络的表征能力
  4. InceptionV4,尝试着把Inception的结构与Resnet的结构进行结合,并设计了一个更深更加优秀的网络InceptionV4。

在本篇博客中,我们将实现一个类似于InceptionV2的结构,并用VOC2012的数据集进行网络的训练,验证,与测试。为了快速开发,本次我们把Keras作为代码的框架。

Pascal_VOC数据集

Pascal VOC为图像识别,检测与分割提供了一整套标准化的优秀的数据集,每一年都会举办一次图像识别竞赛。下面是VOC2012,训练集(包括验证集)的下载地址。

VOC2012里面有20类物体的图片,图片总共有1.7万张。我把数据集分成了3个部分,训练集,验证集,测试集,比例为8:1:1。
下面是部分截图:

第一层目录

第一层目录


第二层目录

第二层目录


第三层目录

第三层目录


接着我们使用keras代码来使用这个数据集,代码如下:

IM_WIDTH=224 #图片宽度
IM_HEIGHT=224 #图片高度
batch_size=32 #批的大小#train data
train_datagen = ImageDataGenerator(rotation_range=30, width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)train_generator = train_datagen.flow_from_directory(train_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)#vaild data
vaild_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)
vaild_generator = train_datagen.flow_from_directory(vaildation_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)#test data
test_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)
test_generator = train_datagen.flow_from_directory(test_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)

我使用了3个ImageDataGenerator,分别来使用训练集,验证集与测试集的数据。使用ImageDataGenerator需要导入相应的模块,==from keras.preprocessing.image import ImageDataGenerator==。ImageDataGenrator可以用来做数据增强,提高模型的鲁棒性.它里面提供了许多变换,包括图片旋转,对称,平移等等操作。里面的flow_from_directory方法可以从相应的目录里面批量获取图片,这样就可以不用一次性读取所有图片(防止内存不足)。

InceptionV1模块介绍

要想理解Googlenet的结构,第一步必须先知道Inception的结构,因为它是由多个Inception的结构组合而成的。如下图Fig.2所示,(a)表示朴素的版本的inception v1示意图,(b)表示降维版本的Inception v1示意图。
V1
Inception的主要思想基于——一个卷积网络里面的局部稀疏最优结构往往可以由简单可复用的密集组合来近似或者替代。就像(a)里面,1x1,3x3,5x5的卷积层,与3x3的池化层的组合一个inception。这样做的几点说明:

  • 不同尺寸的卷积核可以提取不同尺度的信息。
  • 采用1x1,3x3,5x5可以方便对齐,padding分别为0,1,2就可以对齐。
  • 由于池化层在CNN网络里面的成功运用,也把池化层当做组合的一部分。
  • 由于Googlenet是好几个Inception模块的堆叠,而且往往越后面的Inception模块提取的是更加高级抽象的特征,而由于高级抽象的特征的时域联系会降低。(在这里加上一点个人理解,当提取的特征比较简单,比如边缘,轮廓的时候,往往只需要提取某个像素附近的几个像素就行了,这时卷积核比较小,没有问题。但是当提取的特征变得复杂的时候,比如提取的是人的鼻子,耳朵的时候,需要的可能就是某个像素旁边几十或者几百个像素了。当然我说的这些像素指的是特征图里面的像素。)因此为了获取这些高级信息,我们在后面的Inception模块里面需要增大3x3,5x5这些大卷积核的比例。

但是这么做,问题又来了,如果提高大卷积核的比例,那么这会意味着计算复杂度的飙升。为此,google的工程师们又提出(b)的这个Inception结构。

Inception的架构

下面的Table.1给出了Googlenet是怎么由Inception模块和一些传统的卷积层与池化层构成的。比较Inception(3a)和Inception(5b),我们可以看到大卷积核的滤波器的个数的比例已经提高了。最后需要注意两点,该网络的使用了avg pool来替代第一层全连接层,大大降低了参数的个数。后面在avg pool后面加入全连接层则是为了方便微调的操作。
Inception

GoogleNet的图片

根据上面的表格我们可以画出这样的一幅图。
这里写图片描述

Keras代码实现

#-*- coding: UTF-8 -*-from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, ZeroPadding2D
from keras.layers import Flatten, Dense, Dropout,BatchNormalization
from keras.layers import Input, concatenate
from keras.models import Model,load_model
from keras.preprocessing.image import ImageDataGenerator
from keras.utils import plot_model,np_utils
from keras import regularizers
import keras.metrics as metric
import os# Global Constants
NB_CLASS=20
LEARNING_RATE=0.01
MOMENTUM=0.9
ALPHA=0.0001
BETA=0.75
GAMMA=0.1
DROPOUT=0.4
WEIGHT_DECAY=0.0005
LRN2D_NORM=True
DATA_FORMAT='channels_last' # Theano:'channels_first' Tensorflow:'channels_last'
USE_BN=True
IM_WIDTH=224
IM_HEIGHT=224
EPOCH=50train_root='/home/faith/keras/dataset/traindata/'
vaildation_root='/home/faith/keras/dataset/vaildationdata/'
test_root='/home/faith/keras/dataset/testdata/'IM_WIDTH=224
IM_HEIGHT=224
batch_size=32#train data
train_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)
train_generator = train_datagen.flow_from_directory(train_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)#vaild data
vaild_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)
vaild_generator = train_datagen.flow_from_directory(vaildation_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)#test data
test_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,featurewise_center=True
)
test_generator = train_datagen.flow_from_directory(test_root,target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size,
)#normalization
def conv2D_lrn2d(x,filters,kernel_size,strides=(1,1),padding='same',data_format=DATA_FORMAT,dilation_rate=(1,1),activation='relu',use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,lrn2d_norm=LRN2D_NORM,weight_decay=WEIGHT_DECAY):#l2 normalizationif weight_decay:kernel_regularizer=regularizers.l2(weight_decay)bias_regularizer=regularizers.l2(weight_decay)else:kernel_regularizer=Nonebias_regularizer=Nonex=Conv2D(filters=filters,kernel_size=kernel_size,strides=strides,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(x)if lrn2d_norm:#batch normalizationx=BatchNormalization()(x)return xdef inception_module(x,params,concat_axis,padding='same',data_format=DATA_FORMAT,dilation_rate=(1,1),activation='relu',use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,lrn2d_norm=LRN2D_NORM,weight_decay=None):(branch1,branch2,branch3,branch4)=paramsif weight_decay:kernel_regularizer=regularizers.l2(weight_decay)bias_regularizer=regularizers.l2(weight_decay)else:kernel_regularizer=Nonebias_regularizer=None#1x1pathway1=Conv2D(filters=branch1[0],kernel_size=(1,1),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(x)#1x1->3x3pathway2=Conv2D(filters=branch2[0],kernel_size=(1,1),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(x)pathway2=Conv2D(filters=branch2[1],kernel_size=(3,3),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(pathway2)#1x1->5x5pathway3=Conv2D(filters=branch3[0],kernel_size=(1,1),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(x)pathway3=Conv2D(filters=branch3[1],kernel_size=(5,5),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(pathway3)#3x3->1x1pathway4=MaxPooling2D(pool_size=(3,3),strides=1,padding=padding,data_format=DATA_FORMAT)(x)pathway4=Conv2D(filters=branch4[0],kernel_size=(1,1),strides=1,padding=padding,data_format=data_format,dilation_rate=dilation_rate,activation=activation,use_bias=use_bias,kernel_initializer=kernel_initializer,bias_initializer=bias_initializer,kernel_regularizer=kernel_regularizer,bias_regularizer=bias_regularizer,activity_regularizer=activity_regularizer,kernel_constraint=kernel_constraint,bias_constraint=bias_constraint)(pathway4)return concatenate([pathway1,pathway2,pathway3,pathway4],axis=concat_axis)def create_model():#Data format:tensorflow,channels_last;theano,channels_lastif DATA_FORMAT=='channels_first':INP_SHAPE=(3,224,224)img_input=Input(shape=INP_SHAPE)CONCAT_AXIS=1elif DATA_FORMAT=='channels_last':INP_SHAPE=(224,224,3)img_input=Input(shape=INP_SHAPE)CONCAT_AXIS=3else:raise Exception('Invalid Dim Ordering')x=conv2D_lrn2d(img_input,64,(7,7),2,padding='same',lrn2d_norm=False)x=MaxPooling2D(pool_size=(3,3),strides=2,padding='same',data_format=DATA_FORMAT)(x)x=BatchNormalization()(x)x=conv2D_lrn2d(x,64,(1,1),1,padding='same',lrn2d_norm=False)x=conv2D_lrn2d(x,192,(3,3),1,padding='same',lrn2d_norm=True)x=MaxPooling2D(pool_size=(3,3),strides=2,padding='same',data_format=DATA_FORMAT)(x)x=inception_module(x,params=[(64,),(96,128),(16,32),(32,)],concat_axis=CONCAT_AXIS) #3ax=inception_module(x,params=[(128,),(128,192),(32,96),(64,)],concat_axis=CONCAT_AXIS) #3bx=MaxPooling2D(pool_size=(3,3),strides=2,padding='same',data_format=DATA_FORMAT)(x)x=inception_module(x,params=[(192,),(96,208),(16,48),(64,)],concat_axis=CONCAT_AXIS) #4ax=inception_module(x,params=[(160,),(112,224),(24,64),(64,)],concat_axis=CONCAT_AXIS) #4bx=inception_module(x,params=[(128,),(128,256),(24,64),(64,)],concat_axis=CONCAT_AXIS) #4cx=inception_module(x,params=[(112,),(144,288),(32,64),(64,)],concat_axis=CONCAT_AXIS) #4dx=inception_module(x,params=[(256,),(160,320),(32,128),(128,)],concat_axis=CONCAT_AXIS) #4ex=MaxPooling2D(pool_size=(3,3),strides=2,padding='same',data_format=DATA_FORMAT)(x)x=inception_module(x,params=[(256,),(160,320),(32,128),(128,)],concat_axis=CONCAT_AXIS) #5ax=inception_module(x,params=[(384,),(192,384),(48,128),(128,)],concat_axis=CONCAT_AXIS) #5bx=AveragePooling2D(pool_size=(7,7),strides=1,padding='valid',data_format=DATA_FORMAT)(x)x=Flatten()(x)x=Dropout(DROPOUT)(x)x=Dense(output_dim=NB_CLASS,activation='linear')(x)x=Dense(output_dim=NB_CLASS,activation='softmax')(x)return x,img_input,CONCAT_AXIS,INP_SHAPE,DATA_FORMATdef check_print():# Create the Modelx,img_input,CONCAT_AXIS,INP_SHAPE,DATA_FORMAT=create_model()# Create a Keras Modelmodel=Model(input=img_input,output=[x])model.summary()# Save a PNG of the Model Buildplot_model(model,to_file='GoogLeNet.png')model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc',metric.top_k_categorical_accuracy])print 'Model Compiled'return modelif __name__=='__main__':if os.path.exists('inception_1.h5'):model=load_model('inception_1.h5')else:model=check_print()model.fit_generator(train_generator,validation_data=vaild_generator,epochs=EPOCH,steps_per_epoch=train_generator.n/batch_size,validation_steps=vaild_generator.n/batch_size)model.save('inception_1.h5')model.metrics=['acc',metric.top_k_categorical_accuracy]loss,acc,top_acc=model.evaluate_generator(test_generator,steps=test_generator.n/batch_size)print 'Test result:loss:%f,acc:%f,top_acc:%f'%(loss,acc,top_acc)

为了搭建Inception网络,我们使用了以下策略:

  • 使用了inception_module这个函数构造每个inception模块,里面有4路,分别对应着1x1,(1x1,3x3),(1x1,5x5),(3x3,1x1) 这四路。
  • 使用了3个正则化的手段,分别是L2正则化,BatchNormalization,dropout,来防止模型过拟合。
  • create_model这个函数里面的网络搭建可以参考Tabel.1,可以边看表里面的具体参数边搭网络。

整个代码的流程如下:

  • 导入相应库
  • 模型参数设置以及其它配置
  • 生成训练集,测试集,验证集的三个迭代器
  • Inception module函数的编写
  • create model函数编写,仿照Table.1
  • 模型编译,画出模型的图
  • 模型训练与验证
  • 模型保存
  • 模型在测试集上测试

实验结果

datasetlossacctop5-acc
Training set1.8539.9%85.3%
Vaildation set2.0136.6%82.0%
Testing set2.0835.7%78.1%

实验结果分析

我们可以发现模型最后在测试集上的效果与训练集上的效果有一定程度上的差距,模型出现了一点过拟合。以下是个人对此问题的一些分析:由于采用了L2正则化,BatchNormalization,Dropout等等方法,但是还是出现了过拟合,可能是由于VOC数据比较少,20类物体才1.7万张,相当于每个物体850张左右,要想取得比较好的效果,每个类别物体的图片至少得几千张。所以可以通过降低网络层数,增加数据量,增加训练次数等手段来提高网络的性能。

本博客相关引用

以下是本博客的引用,再次本人对每个引用的作者表示感谢。读者如果对googlenet这个网络仍然存在一些疑虑,或者想要有更深的理解,可以参考以下的引用。

引用博客1

引用博客2

引用博客3

引用文献1:InceptionV1

引用文献2:InceptionV2

引用文献3:InceptionV3

引用文献4:InceptionV4!

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

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

相关文章

循环输出

使用foreach循环输出List中的数据 步骤详解: 1.数据库的设计和实现 2. Java代码的书写 3. jsp页面的显示 效果图展示 数据库数据 查询结果的显示 功能分析: 链接数据库查找数据库内容把这些内容放入List数组里面用session传递jsp页面获取session内…

我的Go+语言初体验——(4)零基础学习 Go+ 爬虫

我的Go语言初体验——(4)零基础学习 Go 爬虫 “我的Go语言初体验” | 征文活动进行中… Go 语言非常适合编写爬虫程序,具有并发机制完善、并发数量大、占用资源少、运行速度快、部署方便的优点。 本文结合官方文档与 Go 语言的资料&#xff…

latex的基本使用

LaTeX使用 LaTeX使用基本使用源文件的基本结构中文处理办法字体字号设置文章基本结构特殊字符处理图片的使用表格的使用Texstduio的导入表格功能会更快浮动体的使用数学公式初步矩阵的使用TexStudio里面的矩阵模板功能参考文献使用BibTex定义自己的命令 基本使用 sublime使用…

【OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。 直方图匹配又称为直方图规定化&a…

Vue的安装和配置

Vue是目前最流行的前端框架之一,给大家讲一下如何安装和配置Vue环境。 网上也有许多关于安装和配置Vue的教程,但是他们的方法太过于麻烦了,而且对于初学者来说对网上的一些安装和配置Vue的方法不理解,看了之后还是没有一点思绪&a…

【OpenCV 例程300篇】49. 直方图处理之局部直方图处理(cv2.createCLAHE)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】49. 直方图处理之局部直方图处理(cv2.createCLAHE) 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素…

ResNet网络详解与keras实现

ResNet网络详解与keras实现 ResNet网络详解与keras实现Resnet网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录 梯度退化Residual LearningIdentity vs Projection ShortcutsBottleneck architectureResnet网络构建表ResNet论文结果为了搭建Resnet网络我们使用了以下…

简易计算器

用JavaScript实现简易计算器 先看效果图 计算加法弹框输出计算结果 程序解读&#xff1a; 1.两个输入框和一个下拉框 2. 弹框显示结果 3. 加减乘除的简单运算 代码演示 Html页面内容 <!DOCTYPE html> <html><head><meta charset"utf-8">…

【OpenCV 例程300篇】50. 直方图处理之直方图统计量图像增强

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】50. 直方图处理之直方图统计量图像增强 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。 直方图统计量图像增强&…

在大数据时代下金融风控的分类

Date&#xff1a;2018-05-24 Author&#xff1a;等等 依托城市数据湖海量数据资源&#xff0c;尤其是在信贷领域对企业或者个人的个人信贷画像描述评判准则已经是第三方房贷企业或者银行对借贷人的评分标准。风控建模以数据价值挖掘为导向&#xff0c;吸纳大量数据、人工智能科…

多功能标准型计算器

实现一个标准型计算器及其各项功能的实现 效果图欣赏 是不是看起来很漂亮的呢&#xff1f;&#xff1f;&#xff1f; 功能详解&#xff1a; 屏幕显示输入的数字和符号实现加减乘除运算回退和清零功能小数的运算结果的输出 相信小伙伴们都已经迫不及待的想要知道源码了。 代…

【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪(cv2.calcBackProject)

『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪&#xff08;cv2.calcBackProject&#xff09; 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。…

【转需】【金融干货】四步教你:开发风控模型?

一、市场调研 目前市面主流的风控模型 1、互联网金融前10名排行榜(数据截止日期2017-09-12) 互联网金融公司排名分别是蚂蚁金服、陆金所、京东金融、苏宁金融、百度金融、腾讯理财通、宜信、钱大掌柜、万达金融和网易理财。 1.1 蚂蚁金服 1.1.1 大数据技术对接第三方征信公司芝…

推箱子

推箱子小游戏原理的实现 功能分析&#xff1a; 1.找一张类似于箱子的图片自行设置图片的大小 2.设置控制箱子移动的四个方向的按钮 3.使用键盘控制图片上下左右的移动、 效果图演示 原始位置 点击键盘向右移动三次向下移动一次后的位置 看了上述过程是不是感觉很有意思呀&…

java web 开发之写在前面(0)

java是sun公司&#xff08;现在属于Oracle公司&#xff09;推出的能够跨越多平台的、可以执行最高的一种面向对象的编程语言&#xff0c;也是目前最先进、特征最丰富、功能最强大的计算机语言。利用java可以编写桌面应用程序&#xff0c;web应用程序、分布式系统、嵌入式系统程…

【OpenCV 例程200篇】52. 图像的相关与卷积运算

【OpenCV 例程200篇】52. 图像的相关与卷积运算 欢迎关注 『OpenCV 例程200篇』 系列&#xff0c;持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列&#xff0c;持续更新中 滤波通常是指对图像中特定频率的分量进行过滤或抑制。图像滤波是在尽可能保留图像细节特征的条件…

java web 之 网页前端开发基础(1)

1.HTML&#xff08;Hypertext Markup Language&#xff0c;HTML&#xff0c;超文本标记语言&#xff09; 1.1 创建第一个HTML文件 编写html语言可以通过两种方式&#xff0c;一种是手工编写html代码&#xff0c;一种是借助一些开发软件&#xff0c;如Dreamweaver或者微软公司…

文本框为空按钮不可点击

在form表单的提交中判断输入框的内容是否为空&#xff0c;如果输入框的内容为空则按钮不可点击&#xff0c;只有当输入框的内容不为空时才能点击并执行之后的提交等操作。 效果图演示 输入框为空&#xff08;按钮不可点击&#xff0c;点击无效果&#xff09; 输入框不为空时…

【youcans 的 OpenCV 学习课】7. 空间域图像滤波

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】7. 空间域图像滤波 图像滤波是在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是常用的图像预处理操作。 …

java web开发之上机指导(2)

创建一个用户注册的页面&#xff0c;让用户输入姓名、密码、电话和邮箱&#xff0c;使用javascript脚本完成密码校验、电话号码校验、邮箱校验和空格内容校验。 开发步骤如下。 &#xff08;1&#xff09;创建一个项目名为CheckInfomation&#xff0c;在WebContent文件夹下创…