形变、缩放、旋转、亮度变化等处理、通过python均可实现
图像的卷积(convolution)运算,即通过对图像矩阵与滤波器矩阵进行对应相乘再求和运算,可实现图像中特定轮廓特征的快速搜索。
表示为A*B或者convolution(A,B)
上图我们可以观察到中间X22参与了4次运算,而四个角落上X11,X13,X31,X33次数都较少
这会导致一部分特征丢失的问题,同时还可以保证前后尺寸一致、所以引出了padding在3*3矩阵之外再添加层数,如下图
stride=1时候步长为一,比如第一次是以X00为起点,第二次就是以X01为起点
考虑到图像的存储、读取和现实、
是通过数字矩阵格式实现、即RGB三通道、如下图所示
对于多通道图像的卷积
只需要对R\G\B三个通道分别求卷积再相加即可
计算机根据训练图片和类别,应当寻找合适的轮廓过滤器
简单的过滤器有横向过滤器:
竖向过滤器:
了解简单的滤波器后,有常用的高斯滤波、边缘滤波等
此外,对图像的操作也可称为算子,有用于边缘检测的如Prewitt算子
Sobel算子
Canny算子等等。
在图像处理中使用较多的是 HSV 颜色空间,HSV 分别代表:
H–Hue(色调、色相):色彩的基本属性、
S–Saturation(饱和度、色彩纯净度):越低就逐渐 变灰,取0-100%数值
V–Value(明度):亮度,同上
它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,具有较强的感知度。
现实图片中的很多信息一定是冗余,不重要的,如果把所有特征提取进行训练一定会造成过拟合现象、对模型容错率大大降低、同时计算量过大也是无法承受的。
这个时候就需要一种方式来简化信息,提取关键特征
池化也称为欠采样或下采样,指按照一定的规则对图像矩阵进行处理,实现信息压缩与数据降维
有如AveragePooling,MaxPooling等
当pooling_size=(2,2),stride= (2,2)、来看举例:
MaxPooling
AveragePooling:
最终在卷积之后,池化之前加入激活函数,就可以保留重要特征
最终再加入全连接层进入模型进行训练
把卷积、池化、mlp先后连接在一起,组成一个能够高效提取图像重要信息的神经网络。
#数据载入
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,:,:,:])
#建立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()
#模型配置
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]
#本地四张图片处理
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')
在此案例中,参考经典的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()
#模型求解参数配置
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)