Набор данных изображений землепользования UCMerced состоит из 21 класса землепользования, таких как Лес, Побег, Шоссе, Гавань и другие. В этом руководстве мы хотели бы поделиться тем, как создать программу Simple Convolutional Neural Networks для классификации землепользования. Прежде чем продолжить, пожалуйста, подготовьте программное обеспечение следующим образом:
- Anaconda
- Keras Python Library

Собрав некоторые библиотеки, давайте начнем создавать код с 6 шаг за шагом следующим образом:

  1. Требование к библиотеке импорта, например Numpy, OpenCV, Matplotlib
import numpy as np
import cv2
import os
import re
import glob
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
from keras.optimizers import SGD
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from keras.models import load_model

2. Чтение изображений землепользования

path = os.path.abspath('[YOUR_FILE_NAME]')
path = re.sub('[a-zA-Z\s._]+$', '', path)
dirs = os.listdir(path+'[YOUR_LAND_USE_PATH]')
label = 0
im_arr = []
lb_arr = []
X = []
y = []
for i in dirs:
    count = 0
    for pic in glob.glob(path+'[YOUR_LAND_USE_PATH]'+i+'/*.tif'):
        im = cv2.imread(pic)
        im = cv2.resize(im,(70,70))
        im = np.array(im)
        count = count + 1
        X.append(im)
        y.append(label)
        if(count == 3):
            im_arr.append({str(i):im})
    print("size "+str(i)+" : "+str(count))
    label = label + 1
    lb_arr.append(i)
X = np.array(X)
y = np.array(y);

3. Предварительная обработка изображений

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
X_train = X_train.astype('float32') #set x_train data type as float32
X_test = X_test.astype('float32') #set x_test data type as float32
X_train /= 255 #change x_train value between 0 - 1
X_test /= 255 #change x_test value between 0 - 1
y_train = keras.utils.to_categorical(y_train, 21) #change label to binary / categorical: [1 0 0 0] = 0, [0 1 0 0] = 1, so on
y_test = keras.utils.to_categorical(y_test, 21) #change label to binary / categorical

4. Тренировочные данные

model = Sequential() #model = sequential 
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(70,70,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten()) #make layer flatten
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(21, activation='softmax'))
epochs = 25
lrate = 0.01
decay = lrate/epochs
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=32)
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

После обучения 10 эпохи точность данных достигает 55,8%, что достаточно для классификации 21 класса.