深度学习使用Python进行卷积神经网络的图像分类教程

好的,这次我将使用python编写如何使用卷积神经网络(CNN)进行图像分类。我希望你事先已经阅读并理解了卷积神经网络(CNN)的基本概念,这里我只讨论步骤,而不讨论卷积神经网络(CNN)中使用的术语...

我们将尝试对汽车和摩托车这两个类别进行分类。我们使用的训练数据数量是470个,用于测试/验证的数据是30个。

在我们开始之前......像这样做一个文件夹安排

Image classification

----data

--------test_image

--------train

--------test

----training.py

----test.py

示例数据集下载地址:http://www.kankanyun.com/data/data.rar

训练

第一步是导入所需的Python包:

import sys import os from keras.preprocessing.image import ImageDataGenerator from keras import optimizers from keras.models import Sequential from keras.layers import Dropout, Flatten, Dense, Activation from keras.layers.convolutional import Convolution2D, MaxPooling2D from keras import callbacks import time

导入包后,下一步是确定我们用于训练的epochs数。接下来设置训练和测试目录,Python代码如下:

DEV = Falseargvs = sys.argvargc = len(argvs)if argc > 1 and (argvs[1] == "--development" or argvs[1] == "-d"): DEV = Trueif DEV: epochs = 2else: epochs = 30train_data_path = 'data/train'validation_data_path = 'data/test'

接下来是设置深度学习模型参数,Python代码如下:

"""Parameters"""img_width, img_height = 150, 150batch_size = 32samples_per_epoch = 1000validation_steps = 300nb_filters1 = 32nb_filters2 = 64conv1_size = 3conv2_size = 2pool_size = 2classes_num = 2lr = 0.0004

接下来的部分决定是卷积神经网络(CNN)的架构,我们将使用的Python代码如下:

model = Sequential()model.add(Convolution2D(nb_filters1, conv1_size, conv1_size, border_mode ="same", input_shape=(img_width, img_height, 3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(pool_size, pool_size)))model.add(Convolution2D(nb_filters2, conv2_size, conv2_size, border_mode ="same"))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(pool_size, pool_size), dim_ordering='th'))model.add(Flatten())model.add(Dense(256))model.add(Activation("relu"))model.add(Dropout(0.5))model.add(Dense(classes_num, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=lr), metrics=['accuracy'])

上面的Python代码显示了CNN模型的体系结构。本文使用卷积神经网络(CNN)模型,具有2个卷积层和2个池化层。确定CNN架构和参数值很重要,这对训练模型的准确性非常有影响。

接下来的部分是查看图表并执行保存深度学习模型,Python代码如下:

train_datagen = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)test_datagen = ImageDataGenerator(rescale=1. / 255)train_generator = train_datagen.flow_from_directory( train_data_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical')validation_generator = test_datagen.flow_from_directory( validation_data_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical')"""Tensorboard log"""log_dir = './tf-log/'tb_cb = callbacks.TensorBoard(log_dir=log_dir, histogram_freq=0)cbks = [tb_cb]model.fit_generator( train_generator, samples_per_epoch=samples_per_epoch, epochs=epochs, validation_data=validation_generator, callbacks=cbks, validation_steps=validation_steps)target_dir = './models/'if not os.path.exists(target_dir): os.mkdir(target_dir)model.save('./models/model.h5')model.save_weights('./models/weights.h5')

将文件保存为Train.py,然后执行如下命令进行训练数据

E:Image-Classification-by-Keras-and-Tensorflow-masterUsing Keras>Training.py

训练数据的结果(30 epochs):

我们可以看到精度值已经非常高,为98%,并且具有非常低的loss值,大约为0.0492。这意味着我们做的模型很好,我们可以用它来预测。

在我们进行数据训练之后,现在我们将测试我们的深度学习模型。在这里,我使用mobil的5张图像和motor的5张图像的数据,将其保存在test_image文件夹中。

测试模型

首先导入Python库

import osimport numpy as npfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_arrayfrom keras.models import Sequential, load_modelimport time

我们首先调用我们创建的模型,Python代码如下:

#Define Pathmodel_path = './models/model.h5'model_weights_path = './models/weights.h5'test_path = 'data/test_image'#Load the pre-trained modelsmodel = load_model(model_path)model.load_weights(model_weights_path)#Define image parametersimg_width, img_height = 150, 150

下面是预测图像处理函数。我们使用了2个标签,第一个标签是mobil预测值为0的结果,第二个标签是预测值为1的motor预测结果。

#Prediction Functiondef predict(file): x = load_img(file, target_size=(img_width,img_height)) x = img_to_array(x) x = np.expand_dims(x, axis=0) array = model.predict(x) result = array[0] #print(result) answer = np.argmax(result) if answer == 0: print("Predicted: mobil") elif answer == 1: print("Predicted: motor") return answer#Walk the directory for every imagefor i, ret in enumerate(os.walk(test_path)): for i, filename in enumerate(ret[2]): if filename.startswith("."): continue print(ret[0] + '/' + filename) result = predict(ret[0] + '/' + filename) print(" ")

之后保存为你Testing.py,只需运行来查看预测结果

E:Image-Classification-by-Keras-and-Tensorflow-masterUsing Keras>Testing.py

这是预测5辆汽车图像和5辆摩托车图像的结果:

图mobil_1,mobil_2,mobil_3,mobil_5成功地预测为汽车和mobil_4错误的预测图像为摩托车。而所有从motor_1到motor_5图像的摩托车类都被正确预测。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181007A05EO100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动