Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP

  • CNN卷积神经网络
    • 图像基本处理
    • 图像卷积运算
    • Stride、Padding、卷积后尺寸大小
    • 图像存储及展现形式
    • 图像滤波
    • 灰度值(HSV 颜色空间)
    • 现实问题
    • 池化
    • 卷积神经网络
  • 应用
    • CNN实现猫狗识别
      • 数据载入可视化
      • 建立CNN模型训练
      • 模型存储
      • 测试集准确率
      • 对本地图片进行预测
    • VGG16+自定义MLP

CNN卷积神经网络

图像基本处理

形变、缩放、旋转、亮度变化等处理、通过python均可实现

图像卷积运算

图像的卷积(convolution)运算,即通过对图像矩阵与滤波器矩阵进行对应相乘再求和运算,可实现图像中特定轮廓特征的快速搜索。
表示为A*B或者convolution(A,B)
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第1张图片

Stride、Padding、卷积后尺寸大小

上图我们可以观察到中间X22参与了4次运算,而四个角落上X11,X13,X31,X33次数都较少
这会导致一部分特征丢失的问题,同时还可以保证前后尺寸一致、所以引出了padding在3*3矩阵之外再添加层数,如下图
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第2张图片

stride=1时候步长为一,比如第一次是以X00为起点,第二次就是以X01为起点

卷积后尺寸大小:
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第3张图片

图像存储及展现形式

考虑到图像的存储、读取和现实、
是通过数字矩阵格式实现、即RGB三通道、如下图所示

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第4张图片
对于多通道图像的卷积
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第5张图片
只需要对R\G\B三个通道分别求卷积再相加即可

图像滤波

计算机根据训练图片和类别,应当寻找合适的轮廓过滤器
简单的过滤器有横向过滤器
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第6张图片

竖向过滤器
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第7张图片
了解简单的滤波器后,有常用的高斯滤波、边缘滤波等
此外,对图像的操作也可称为算子,有用于边缘检测的如Prewitt算子
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第8张图片
Sobel算子
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第9张图片
Canny算子等等。

灰度值(HSV 颜色空间)

在图像处理中使用较多的是 HSV 颜色空间,HSV 分别代表:
H–Hue(色调、色相):色彩的基本属性、
S–Saturation(饱和度、色彩纯净度):越低就逐渐 变灰,取0-100%数值
V–Value(明度):亮度,同上
它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,具有较强的感知度。Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第10张图片

现实问题

现实图片中的很多信息一定是冗余,不重要的,如果把所有特征提取进行训练一定会造成过拟合现象、对模型容错率大大降低、同时计算量过大也是无法承受的。
这个时候就需要一种方式来简化信息,提取关键特征

池化

池化也称为欠采样或下采样,指按照一定的规则对图像矩阵进行处理,实现信息压缩与数据降维

有如AveragePooling,MaxPooling等
当pooling_size=(2,2),stride= (2,2)、来看举例:

MaxPooling
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第11张图片AveragePooling:
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第12张图片
最终在卷积之后,池化之前加入激活函数,就可以保留重要特征
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第13张图片
最终再加入全连接层进入模型进行训练

卷积神经网络

把卷积、池化、mlp先后连接在一起,组成一个能够高效提取图像重要信息的神经网络。

应用

CNN实现猫狗识别

数据载入可视化

#数据载入
from keras.preprocessing.image import ImageDataGenerator
train_datagen=ImageDataGenerator(rescale=1./255)
training_set=train_datagen.flow_from_directory(r'C:\Users\79353\deeplearning\Ch3\task1_data\training_set',target_size=(50,50),batch_size=32,class_mode='binary')
#可视化第一个批次第一张图片
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.imshow(training_set[0][0][0,:,:,:])

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第14张图片

建立CNN模型训练

#建立CNN模型
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Flatten,Dense
#顺序实例模型
cnn_model=Sequential()
#添加卷积层
cnn_model.add(Conv2D(32,(3,3),input_shape=(50,50,3),activation='relu'))
#添加池化层
cnn_model.add(MaxPool2D(pool_size=(2,2)))
#添加卷积层
cnn_model.add(Conv2D(32,(3,3),activation='relu'))
#添加池化层
cnn_model.add(MaxPool2D(pool_size=(2,2)))
#flatten展开
cnn_model.add(Flatten())
#FC层全连接层
cnn_model.add(Dense(units=128,activation='relu'))
#预测输出层
cnn_model.add(Dense(units=1,activation='sigmoid'))
cnn_model.summary()

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第15张图片

#模型配置
cnn_model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
#模型训练
cnn_model.fit_generator(training_set,epochs=20)
#训练集数据预测准确率
accuracy_train=cnn_model.evaluate_generator(training_set)
print(accuracy_train)

[0.0006155087030492723, 1.0]

模型存储

#模型存储
cnn_model.save('task1_model_1.h5')
#模型加载
from keras.models import load_model
model_new=load_model('task1_model_1.h5')

测试集准确率

#测试数据集预测准确率
test_set=train_datagen.flow_from_directory('./task1_data/test_set',target_size=(50,50),batch_size=32,class_mode='binary')
accuracy_test=cnn_model.evaluate_generator(test_set)
print(accuracy_test)

[2.757805347442627, 0.7484999895095825]

对本地图片进行预测

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第16张图片

#本地四张图片处理
a=[i for i in range(1,7)]
fig3=plt.figure(figsize=(10,10))
for i in a:
    img_name=str(i)+'.jpg'
    pic_1=load_img(img_name,target_size=(50,50))
    pic_1=img_to_array(pic_1)
    pic_1=pic_1/255
    pic_1=pic_1.reshape(1,50,50,3)
    result=cnn_model.predict_classes(pic_1)
    
    plt.subplot(3,3,i)
    plt.imshow(pic_1[0])
    plt.title('predict result:dog' if result==1 else 'predict result:cat')

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第17张图片

VGG16+自定义MLP

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第18张图片

在此案例中,参考经典的CNN结构,剥除其FC层,用于提取图像的重要轮廓信息,,再建立MLP模型。获得效率和结果的巨大提升

....
#数据预处理
from keras.applications.vgg16 import preprocess_input
import numpy as np
x=np.expand_dims(pic1,axis=0)#reshape
x=preprocess_input(x)
print(x.shape)
#图像核心特征提取
from keras.applications.vgg16 import VGG16
model_vgg=VGG16(weights='imagenet',include_top=False)
features=model_vgg.predict(x)
print(features.shape)
...
#建立mlp model
from keras.models import Sequential
from keras.layers import Dense
model=Sequential()
#隐藏层
model.add(Dense(units=10,activation='relu',input_dim=25088))
#输出层
model.add(Dense(units=1,activation='sigmoid'))
model.summary()

Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第19张图片

#模型求解参数配置
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
#模型训练
model.fit(X_train,y_train,epochs=50)

#对模型表现进行评估
from sklearn.metrics import accuracy_score
y_train_predict=model.predict_classes(X_train)
accuracy_train=accuracy_score(y_train,y_train_predict)
print(accuracy_train)
#测试数据预测准确率
y_test_predict=model.predict_classes(X_test)
accuracy_test=accuracy_score(y_test,y_test_predict)
print(accuracy_test)

0.9958333333333333
0.925
可以看到这次不论是在训练集还是测试集上的准确率都是十分的高
Python入门到实战(十五)卷积神经网络CNN、步长、填充、池化、图像滤波、HSV、CNN猫狗识别、VGG、MLP_第20张图片

你可能感兴趣的:(机器学习,python学习,深度学习,机器学习,神经网络)