1. 首页
  2. Python

机器学习中构建第一个图像分类器的所有步骤(带代码)

“u003Cdivu003Eu003Cpu003E如果您想创建一个图像分类器但不知道从哪里开始,请按照此快速指南了解这些概念,并能够训练卷积神经网络以识别您想要的任何图像!u003Cu002Fpu003Eu003Cpu003E为了实现这一点,我们提供的代码是用Python(3.x)编写的,我们将主要使用Keras库。u003Cu002Fpu003Eu003Cpu003E现在,我们将重点介绍卷积神经网络,它对列和神经元,输入和输出保持相同的想法,同时简单地添加一种方法来提取图像中的信息。u003Cu002Fpu003Eu003Cpu003E什么是卷积神经网络?u003Cu002Fpu003Eu003Cpu003E这种类型的神经网络由一些深度神经网络组成,在此基础上进行一些运算。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E总的来说,请记住,图像只是一个数字矩阵,如果图像只是灰度级,则维度为2;如果包含颜色,则维度为3(第三维度用于所有RGB级别)。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E首先,当一个图像被赋予算法时,它首先在初始图像上应用一个小的过滤器并将其带到它的任何地方。此步骤称为卷积。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Fb78670f26c834faaaa58d1b9df69c585″ img_width=”526″ img_height=”384″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003E图1 – 5×5图像与3×3过滤器的卷积u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在图1中,初始图像为绿色,过滤器为黄色,并将每个初始图像的数乘以相应的过滤器得出另一个数。u003Cu002Fpu003Eu003Cpu003E在该操作之后,获得新的矩阵(红色)。通过将红色矩阵的像素与模型进行比较,程序可以确定是否存在与第一图像上的模型相对应的对象。u003Cu002Fpu003Eu003Cpu003E例如,仅在一行像素上获得较大的数字意味着初始图像在那里包含一行。u003Cu002Fpu003Eu003Cpu003E下一步称为Pooling。它是关于获取每个区域的最高值并仅使用这些值形成新矩阵。它减少了矩阵的空间维度,因此有助于神经网络更快地运行。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fb454b36c0a1a424ca9baf53d7d09e310″ img_width=”750″ img_height=”313″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003E图2 – pooling操作示例u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在图2中,您可以看到图像的维度分为4个部分,每个部分都表示其最高值。新形成的图像更小。u003Cu002Fpu003Eu003Cpu003E此外,在此过程中使用激活函数来标准化所有获得的值。在下面的示例中,我们将使用ReLU。u003Cu002Fpu003Eu003Cpu003E最后,最后一步可用于提高精度,称为Dropout。它迫使神经网络在学习阶段随机禁用某些神经元。我们也将在我们的示例中实现此函数。u003Cu002Fpu003Eu003Cpu003E既然您已经了解了卷积的基础知识,我们就可以开始构建一个卷积!u003Cu002Fpu003Eu003Cpu003E准备数据u003Cu002Fpu003Eu003Cpu003E只有当您想要使用自己的数据或无法在网上轻松找到的数据时,此部分才有用,构建一个卷积神经网络也许更适合你的需要。否则,直接使用Keras数据集的代码:u003Cu002Fpu003Eu003Cpreu003Efrom keras.datasets import mnist #replace mnist with any datasetu003Cbru003E(x_train, y_train), (x_test, y_test) = mnist.load_data()u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F2ff53e42e1584a85afb4f9699fc123ef” img_width=”571″ img_height=”52″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在这里,我们只需调用函数load_data来设置训练和测试阶段的数据集。您可以将任何要使用的数据集替换为“mnist”(在两行中都更改它)。u003Cu002Fpu003Eu003Cpu003E如果要创建自己的数据集,请执行以下步骤:u003Cu002Fpu003Eu003Cpu003E首先,您需要收集大量图像。越多越好。请记住为每个类保留大致相同数量的图像。例如,对于我的二维国际象棋分类器,我为每个可能的块(和空案例)准备了160个图像,所以总共约u003Cstrongu003E2,000个图像u003Cu002Fstrongu003E,但是数据集的大小取决于项目。u003Cu002Fpu003Eu003Cpu003E还有一个强大的工具可以帮助您创建更多数据,称为u003Cstrongu003E数据扩充u003Cu002Fstrongu003E。它只是修改一个图像并通过翻转,旋转或裁剪来回放大量新的和唯一的图像,所有这些都基于第一个图像。u003Cu002Fpu003Eu003Cpu003E最后确保所有数据都归入一个专门用于此目的的文件夹中,其中每个类都有自己的子文件夹。现在在主文件夹中,我们将创建一个python程序来设置所有数据。u003Cu002Fpu003Eu003Cpreu003Eimport numpy as npu003Cbru003Eimport osu003Cbru003Efrom matplotlib import pyplot as pltu003Cbru003Eimport cv2u003Cbru003Eimport randomu003Cbru003Eimport pickleu003Cbru003Efile_list = []u003Cbru003Eclass_list = []u003Cbru003EDATADIR = “data”u003Cbru003E# All the categories you want your neural network to detectu003Cbru003ECATEGORIES = [“bishopB”, “bishopW”, “empty”, “kingB”, “kingW”,u003Cbru003Et “knightB”, “knightW”, “pawnB”, “pawnW”, “queenB”,u003Cbru003Et “queenW”, “rookB”, “rookW”]u003Cbru003E# The size of the images that your neural network will useu003Cbru003EIMG_SIZE = 50u003Cbru003E# Checking or all images in the data folderu003Cbru003Efor category in CATEGORIES :u003Cbru003Etpath = os.path.join(DATADIR, category)u003Cbru003Etfor img in os.listdir(path):u003Cbru003Ettimg_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)u003Cbru003Etraining_data = []u003Cbru003Edef create_training_data():u003Cbru003Etfor category in CATEGORIES :u003Cbru003Ettpath = os.path.join(DATADIR, category)u003Cbru003Ettclass_num = CATEGORIES.index(category)u003Cbru003Ettfor img in os.listdir(path):u003Cbru003Ettttry :u003Cbru003Ettttimg_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)u003Cbru003Ettttnew_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))u003Cbru003Etttttraining_data.append([new_array, class_num])u003Cbru003Etttexcept Exception as e:u003Cbru003Ettttpassu003Cbru003Ecreate_training_data()u003Cbru003Erandom.shuffle(training_data)u003Cbru003EX = [] #featuresu003Cbru003Ey = [] #labelsu003Cbru003Efor features, label in training_data:u003Cbru003EtX.append(features)u003Cbru003Ety.append(label)u003Cbru003EX = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)u003Cbru003E# Creating the files containing all the information about your modelu003Cbru003Epickle_out = open(“X.pickle”, “wb”)u003Cbru003Epickle.dump(X, pickle_out)u003Cbru003Epickle_out.close()u003Cbru003Epickle_out = open(“y.pickle”, “wb”)u003Cbru003Epickle.dump(y, pickle_out)u003Cbru003Epickle_out.close()u003Cbru003Epickle_in = open(“X.pickle”, “rb”)u003Cbru003EX = pickle.load(pickle_in)u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Ff5881a619d004a71b15c33bf3b2df0ee” img_width=”934″ img_height=”1354″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在第14行中,您可以将列表更改为您需要的任何类,但保留与之前用于子文件夹的名称相同的名称。u003Cu002Fpu003Eu003Cpu003E最后,在运行程序之后,数据将在文件中设置并准备好使用。u003Cu002Fpu003Eu003Cpu003E构建卷积神经网络u003Cu002Fpu003Eu003Cpreu003Eimport tensorflow as tf u003Cbru003Efrom tensorflow.keras.models import Sequentialu003Cbru003Efrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2Du003Cbru003Eimport pickleu003Cbru003Efrom keras.models import model_from_jsonu003Cbru003Efrom keras.models import load_modelu003Cbru003Eimport matplotlib.pyplot as pltu003Cbru003E# Opening the files about datau003Cbru003EX = pickle.load(open(“X.pickle”, “rb”))u003Cbru003Ey = pickle.load(open(“y.pickle”, “rb”))u003Cbru003E# normalizing data (a pixel goes from 0 to 255)u003Cbru003EX = Xu002F255.0u003Cbru003E# Building the modelu003Cbru003Emodel = Sequential()u003Cbru003E# 3 convolutional layersu003Cbru003Emodel.add(Conv2D(32, (3, 3), input_shape = X.shape[1:]))u003Cbru003Emodel.add(Activation(“relu”))u003Cbru003Emodel.add(MaxPooling2D(pool_size=(2,2)))u003Cbru003Emodel.add(Conv2D(64, (3, 3)))u003Cbru003Emodel.add(Activation(“relu”))u003Cbru003Emodel.add(MaxPooling2D(pool_size=(2,2)))u003Cbru003Emodel.add(Conv2D(64, (3, 3)))u003Cbru003Emodel.add(Activation(“relu”))u003Cbru003Emodel.add(MaxPooling2D(pool_size=(2,2)))u003Cbru003Emodel.add(Dropout(0.25))u003Cbru003E# 2 hidden layersu003Cbru003Emodel.add(Flatten())u003Cbru003Emodel.add(Dense(128))u003Cbru003Emodel.add(Activation(“relu”))u003Cbru003Emodel.add(Dense(128))u003Cbru003Emodel.add(Activation(“relu”))u003Cbru003E# The output layer with 13 neurons, for 13 classesu003Cbru003Emodel.add(Dense(13))u003Cbru003Emodel.add(Activation(“softmax”))u003Cbru003E# Compiling the model using some basic parametersu003Cbru003Emodel.compile(loss=”sparse_categorical_crossentropy”,u003Cbru003Ettttoptimizer=”adam”,u003Cbru003Ettttmetrics=[“accuracy”])u003Cbru003E# Training the model, with 40 iterationsu003Cbru003E# validation_split corresponds to the percentage of images used for the validation phase compared to all the imagesu003Cbru003Ehistory = model.fit(X, y, batch_size=32, epochs=40, validation_split=0.1)u003Cbru003E# Saving the modelu003Cbru003Emodel_json = model.to_json()u003Cbru003Ewith open(“model.json”, “w”) as json_file :u003Cbru003Etjson_file.write(model_json)u003Cbru003Emodel.save_weights(“model.h5”)u003Cbru003Eprint(“Saved model to disk”)u003Cbru003Emodel.save(‘CNN.model’)u003Cbru003E# Printing a graph showing the accuracy changes during the training phaseu003Cbru003Eprint(history.history.keys())u003Cbru003Eplt.figure(1)u003Cbru003Eplt.plot(history.history[‘acc’])u003Cbru003Eplt.plot(history.history[‘val_acc’])u003Cbru003Eplt.title(‘model accuracy’)u003Cbru003Eplt.ylabel(‘accuracy’)u003Cbru003Eplt.xlabel(‘epoch’)u003Cbru003Eplt.legend([‘train’, ‘validation’], loc=’upper left’)u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F4cbd29b69e5b4ec99dce3ccd8333293c” img_width=”883″ img_height=”1486″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E如果您决定使用导入的数据集,请按照我们之前看到的行替换第9行和第10行,将第44行替换为:u003Cu002Fpu003Eu003Cpreu003Emodel.fit(x_train, y_train, batch_size=32, epochs=40, verbose=1, validation_data=(x_test, y_test))u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fc36824562d25406c9ec60ead6f4aa484″ img_width=”849″ img_height=”27″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E在第37行中u003Cu002Fstrongu003E,将u003Cstrongu003EDense()u003Cu002Fstrongu003E的参数修改为您拥有的类的数量。这是神经网络可能输出的数量。u003Cu002Fpu003Eu003Cpu003E对于每个卷积层,您可以看到我们总是首先添加它的神经元数量和过滤器大小。然后,我们涉及到激活函数,最后使用Pooling方法。我们还在第30行添加了Dropout以了解如何执行此操作。u003Cu002Fpu003Eu003Cpu003E此外,在第一个“普通”隐藏层之前,我们添加了函数u003Cstrongu003EFlatten()u003Cu002Fstrongu003E,它将以前卷积中的所有信息转换为神经元的输入。在这一点上,剩下的仅仅包含来自基本神经网络的层和神经元。u003Cu002Fpu003Eu003Cpu003E在这里,你构建了自己的分类器!u003Cu002Fpu003Eu003Cpu003E预测图像类u003Cu002Fpu003Eu003Cpu003E现在,您可以使用神经网络预测您想要的任何图像。只需制作一个涉及以下几行的小脚本:u003Cu002Fpu003Eu003Cpreu003Eimport cv2u003Cbru003Eimport tensorflow as tfu003Cbru003ECATEGORIES = [“bishopB”, “bishopW”, “empty”, “kingB”, “kingW”,u003Cbru003Ettt”knightB”, “knightW”, “pawnB”, “pawnW”,u003Cbru003Ettt”queenB”, “queenW”, “rookB”, “rookW”]u003Cbru003Edef prepare(file):u003Cbru003E IMG_SIZE = 50u003Cbru003E img_array = cv2.imread(file, cv2.IMREAD_GRAYSCALE)u003Cbru003E new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))u003Cbru003E return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1)u003Cbru003Emodel = tf.keras.models.load_model(“CNN.model”)u003Cbru003Eimage = “test.jpg” #your image pathu003Cbru003Eprediction = model.predict([image])u003Cbru003Eprediction = list(prediction[0])u003Cbru003Eprint(CATEGORIES[prediction.index(max(prediction))])u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fe65baf56244848bc88f8753a202bdc37″ img_width=”720″ img_height=”326″ alt=”机器学习中构建第一个图像分类器的所有步骤(带代码)” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E函数prepare(file)允许我们使用任意大小的图像,因为它会自动将其调整为我们在第一个程序中定义的图像大小。u003Cu002Fpu003Eu003Cpu003E如果您在数据程序中修改了图像大小,也可以在此处进行修改。u003Cu002Fpu003Eu003Cpu003E您刚刚构建了适合自己图像的图像分类器。当然,请不要犹豫修改您看到的任何代码行,因为根据这些参数,您的神经网络精度可能会有很大差异。以下是关于这些问题的简要说明:u003Cu002Fpu003Eu003Culu003Eu003Cliu003E模型:您可以轻松添加或删除神经网络中的某些层,更改神经元的数量,甚至激活函数。u003Cu002Fliu003Eu003Cliu003E数据:获得的准确度不符合您的预期?也许您可以添加更多数据,并主要验证您的所有图像都存储在其文件夹中。u003Cu002Fliu003Eu003Cliu003EIMG_SIZE:在数据集的程序中定义,它表示网络将处理的图像的大小。不要尝试太大的数字,因为高质量的图像会导致更长的训练周期。此外,即使是众所周知的数据库(如MNIST)也只包含非常少的图像(MNIST为28×28)。不要忘记在最后一个程序中修改整形函数的IMG_SIZE。u003Cu002Fliu003Eu003Cliu003E使用Keras的新参数。名为“EarlyStopping”的可以帮助您改善训练周期的长度,主要是避免过度拟合。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cu002Fdivu003E”

原文始发于:机器学习中构建第一个图像分类器的所有步骤(带代码)

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/9364.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code