深度学习之卷积神经网络

目的:提取出图像中的关键信息(轮廓),再建立mlp模型进行训练

图像卷积运算(convolution)

对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵
作用:将图片与轮廓滤波器进行卷积运算,可快速定位固定轮廓特征的位置
A与B的卷积通常表示为:A*B或convolution(A,B)
常用轮廓过滤器
在这里插入图片描述

RGB图像的卷积:对RGB三个通道分别求卷积再相加

卷积运算导致的两个问题:

图像被压缩,造成信息丢失
边缘信息使用少,容易被忽略

解决方式:
图像填充(padding)
通过在图像各边增加像素,使其在进行卷积运算后维持原图大小
通过padding增加像素的数量,由过滤器尺寸与stride决定

池化实现维度缩减

池化:按照一个固定规则对图像矩阵进行处理,将其转化为更低维度的矩阵,目的是为了保留核心信息的情况下实现维度缩减,有最大池化法,平均池化法
在这里插入图片描述

卷积神经网络cnn

把卷积、池化、mlp先后连接在一起,组成卷积神经网络,其中常用的还有Relu激活函数
在这里插入图片描述
卷积神经网络两大特点

  • 参数共享(parameter sharing):同一个特征过滤器可用于整张图片
  • 稀疏连接(sparsity of connections):生成的特征图片每个节点只与原图片中特定节点连接

使用

参考经典的CNN结构搭建新模型
使用经典的CNN模型结构对图像预处理,再建立MLP模型(加载经典的cnn模型,剥除其FC层,对图像进行预处理,把预处理完成的数据作为输入,分类结果为输出,建立一个mlp模型,进行模型训练)

经典的CNN模型:

  • LeNet-5 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

  • AlexNet 学术界开始相信深度学习技术,再计算机视觉应用中可以得到很不错的结果

  • VGG -16 https://arxiv.org/pdf/1409.1556.pdf
    在这里插入图片描述
    LeNet-5特点:

  • 随着网络越深,图像的高度和宽度在缩小,通道数在增加

  • 卷积与池化先后成对使用
    在这里插入图片描述
    AlexNet特点:

  • 使用与识别较为复杂的彩色图,可识别1000种类别

  • 结构比LeNet更为复杂,使用Relu作为激活函数
    在这里插入图片描述
    VGG - 16特点:

  • 所有卷积层fliter宽和高都是3,步长为1,padding都使用same convolution;

  • 所有池化层的filter宽和高都是2,步长都是2;

  • 相比alexnet, 有更多的filter用于提取轮廓信息,具有更高精准性

源代码讲解

# 图片加载
# https://keras.io/preprocessing/image/
from keras.preprocessing.image import ImageDataGenerator

# 图像增强/预处理配置(数值归一化、缩放、旋转、平移等)
train_datagen = ImageDataGenerator(rescale = 1./255)

#加载图像
training_set = train_datagen.flow_from_directory('./train',target_size = (50,50),batch_size = 32,class_mode = 'binary')

# 建立cnn模型:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential()
# 卷积层
model.add(conv2D(32, (3, 3), input_shape = (50,50,3), activation = 'relu'))
# 池化层
model.add(MaxPooling2D(pool_size =(2,2)))

# 第二个卷积层、池化层
model.add(Conv2D(32, (3, 3), activation ='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

# Flattening层
model.add(Flatten())

# 全连接层
model.add(Dense(units = 128, activation ='relu'))
model.add(Dense(units = 1, activation = 'sigmoid'))

# 配置模型
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# 查看模型结构
model.summary()

# 训练模型
model.fit_generator(training_set, epochs =25)

# 计算预测准确率
model.evaluate_generator(training_set)

# 基于VGG16的加载方式
# 图片加载
from keras.preprocessing.image import img_to_array, load_img
img_path = '1.jpg'
img = load_img(img_path, target_size=(224,224))
img = img_to_array(img)

#图片预处理
from keras.applications.vgg16 import preprocess_input
x = np.expand_dims(img,axis=0)
#把图片矩阵转化为可用于VGG16输入的矩阵
x = preprocess_input(x)

#载入VGG16结构(去除全连接层)
from keras.applications.vgg16 import VGG16
model_vgg = VGG16(weights='imagenet', include_top =False)

#特征提取
feature = model_vgg.predict(x)

源代码链接

posted @ 2021-01-20 11:55  samuelzhou  阅读(57)  评论(0)    收藏  举报