Классификация кошек и собак с использованием сверточной нейронной сети в Python
Классификация изображений — одно из самых интересных и полезных приложений глубоких нейронных сетей и сверточных нейронных сетей, которое позволяет нам автоматизировать задачу сборки похожих изображений и упорядочивания данных без присмотра реальных людей.
Классификация кошек и собак с использованием сверточной нейронной сети в Python
В этой статье мы узнаем, как создать классификатор, используя простую нейронную сеть свертки, которая может классифицировать изображения собак и кошек.
Чтобы получить больше понимания, выполните соответствующие шаги.
Импорт библиотек
Библиотеки, которые мы будем использовать:
- Pandas — эта библиотека используется для загрузки формата 2D-массива и фреймов данных.
- Numpy — используется для выполнения больших вычислений за очень короткое время.
- Matplotlib — эта библиотека используется для рисования визуализаций.
- Sklearn — этот модуль содержит несколько библиотек с предварительно реализованными функциями для выполнения задач от предварительной обработки данных до разработки и оценки моделей.
- OpenCV — это библиотека с открытым исходным кодом, в основном предназначенная для обработки и обработки изображений.
- Tensorflow — это библиотека с открытым исходным кодом, которая используется для машинного обучения и искусственного интеллекта и предоставляет ряд функций для реализации сложных функций с помощью одной строки кода.
Python3
import matplotlib.pyplot as pltimport tensorflow as tfimport pandas as pdimport numpy as np import warningswarnings.filterwarnings("ignore") from tensorflow import kerasfrom keras import layersfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Activation, Dropout, Flatten, Densefrom tensorflow.keras.layers import Conv2D, MaxPooling2Dfrom tensorflow.keras.utils import image_dataset_from_directoryfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_imgfrom tensorflow.keras.preprocessing import image_dataset_from_directory import osimport matplotlib.image as mpimg |
Импорт набора данных
Набор данных находится в формате zip-файла, содержащего 2 папки: «Кошки» и «Собаки». Далее каждая папка содержит 12500 изображений соответствующих животных.
Итак, чтобы импортировать, а затем распаковать его, вы можете запустить приведенный ниже код.
Python3
from zipfile import ZipFile data_path = "dog-vs-cat-classification.zip" with ZipFile(data_path, "r") as zip: zip.extractall() print("The data set has been extracted.") |
Визуализация данных
В этом разделе мы попытаемся понять визуализацию некоторых изображений, которые были предоставлены нам для создания классификатора для каждого класса.
Python3
path = "dog-vs-cat-classification"classes = os.listdir(path)classes |
["cats", "dogs"]
Это показывает, что у нас есть два класса, т.е. Кошка и Собака.
Python3
fig = plt.gcf()fig.set_size_inches(16, 16) cat_dir = os.path.join("dog-vs-cat-classification/cats")dog_dir = os.path.join("dog-vs-cat-classification/dogs")cat_names = os.listdir(cat_dir)dog_names = os.listdir(dog_dir) pic_index = 210 cat_images = [os.path.join(cat_dir, fname) for fname in cat_names[pic_index-8:pic_index]]dog_images = [os.path.join(dog_dir, fname) for fname in dog_names[pic_index-8:pic_index]] for i, img_path in enumerate(cat_images + dog_images): sp = plt.subplot(4, 4, i+1) sp.axis("Off") img = mpimg.imread(img_path) plt.imshow(img) plt.show() |
Выход :
Подготовка данных для обучения
В этом разделе мы классифицируем набор данных по формату обучения и проверки.
Python3
base_dir = "dog-vs-cat-classification" # Create datasetstrain_datagen = image_dataset_from_directory(base_dir, image_size=(200,200), subset="training", seed = 1, validation_split=0.1, batch_size= 32)test_datagen = image_dataset_from_directory(base_dir, image_size=(200,200), subset="validation", seed = 1, validation_split=0.1, batch_size= 32) |
Выход :
Found 25000 files belonging to 2 classes. Using 22500 files for training. Found 25000 files belonging to 2 classes. Using 2500 files for validation.
Архитектура модели
Модель будет содержать следующие слои:
- Четыре сверточных слоя, за которыми следуют слои MaxPooling.
- Слой Flatten для выравнивания выходных данных сверточного слоя.
- Тогда у нас будет три полносвязных слоя, за которыми следует вывод сглаженного слоя.
- Мы включили несколько слоев BatchNormalization, чтобы обеспечить стабильное и быстрое обучение, и слой Dropout перед последним слоем, чтобы избежать любой возможности переобучения.
- Последний слой — это выходной слой, который имеет сигмовидную функцию активации для классификации результатов на два класса.
Python3
model = tf.keras.models.Sequential([ layers.Conv2D(32, (3, 3), activation="relu", input_shape=(200, 200, 3)), layers.MaxPooling2D(2, 2), layers.Conv2D(64, (3, 3), activation="relu"), layers.MaxPooling2D(2, 2), layers.Conv2D(64, (3, 3), activation="relu"), layers.MaxPooling2D(2, 2), layers.Conv2D(64, (3, 3), activation="relu"), layers.MaxPooling2D(2, 2), layers.Flatten(), layers.Dense(512, activation="relu"), layers.BatchNormalization(), layers.Dense(512, activation="relu"), layers.Dropout(0.1), layers.BatchNormalization(), layers.Dense(512, activation="relu"), layers.Dropout(0.2), layers.BatchNormalization(), layers.Dense(1, activation="sigmoid")]) |
Напечатаем сводку по архитектуре модели:
Python3
model.summary() |
Выход :
Входное изображение, которое мы взяли, первоначально было изменено на 200 X 200, а затем преобразовано в значение двоичной классификации. Чтобы понять огромное количество параметров и сложность модели, которая помогает нам достичь высокой производительности, давайте посмотрим на plot_model.
Python3
keras.utils.plot_model( model, show_shapes=True, show_dtype=True, show_layer_activations=True) |
Выход :
Python3
model.compile( loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) |
Обучение модели
Теперь мы будем обучать нашу модель, модель отлично работает на эпохах = 10, но вы можете выполнить настройку гиперпараметров для лучших результатов.
Python3
history = model.fit(train_datagen, epochs=10, validation_data=test_datagen) |
Выход :
Оценка модели
Давайте визуализируем точность обучения и проверки для каждой эпохи.
Python3
history_df = pd.DataFrame(history.history)history_df.loc[:, ["loss", "val_loss"]].plot()history_df.loc[:, ["accuracy", "val_accuracy"]].plot()plt.show() |
Выход :
Тестирование моделей и прогнозирование
Проверим модель на случайные изображения.
Python3
from keras.preprocessing import image #Input imagetest_image = image.load_img("1.jpg",target_size=(200,200)) #For show imageplt.imshow(test_image)test_image = image.img_to_array(test_image)test_image = np.expand_dims(test_image,axis=0) # Result arrayresult = model.predict(test_image) #Mapping result array with the main name listi=0if(result>=0.5): print("Dog")else: print("Cat") |
Выход :
Python3
test_image = image.load_img("test/2.jpg", target_size=(200, 200)) # For show imageplt.imshow(test_image)test_image = image.img_to_array(test_image)test_image = np.expand_dims(test_image, axis=0) # Result arrayresult = model.predict(test_image)# Mapping result array with the main name listi = 0if(result >= 0.5): print("Dog")else: print("Cat") |
Выход:
Вывод :
Как только вы поймете концепцию классификации изображений, теперь вы можете попробовать другую классификацию, например, обнаружение рака легких с использованием CNN.
Для повышения производительности мы можем использовать трансферное обучение и выполнить настройку гиперпараметров.