Классификация кошек и собак с использованием сверточной нейронной сети в Python

Опубликовано: 13 Февраля, 2023

Классификация изображений — одно из самых интересных и полезных приложений глубоких нейронных сетей и сверточных нейронных сетей, которое позволяет нам автоматизировать задачу сборки похожих изображений и упорядочивания данных без присмотра реальных людей.

Классификация кошек и собак с использованием сверточной нейронной сети в Python

В этой статье мы узнаем, как создать классификатор, используя простую нейронную сеть свертки, которая может классифицировать изображения собак и кошек.

Чтобы получить больше понимания, выполните соответствующие шаги.

Импорт библиотек

Библиотеки, которые мы будем использовать:

  • Pandas — эта библиотека используется для загрузки формата 2D-массива и фреймов данных.
  • Numpy — используется для выполнения больших вычислений за очень короткое время.
  • Matplotlib — эта библиотека используется для рисования визуализаций.
  • Sklearn — этот модуль содержит несколько библиотек с предварительно реализованными функциями для выполнения задач от предварительной обработки данных до разработки и оценки моделей.
  • OpenCV — это библиотека с открытым исходным кодом, в основном предназначенная для обработки и обработки изображений.
  • Tensorflow — это библиотека с открытым исходным кодом, которая используется для машинного обучения и искусственного интеллекта и предоставляет ряд функций для реализации сложных функций с помощью одной строки кода.

Python3




import matplotlib.pyplot as plt
import tensorflow as tf
import pandas as pd
import numpy as np
  
import warnings
warnings.filterwarnings("ignore")
  
from tensorflow import keras
from keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.utils import image_dataset_from_directory
from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img
from tensorflow.keras.preprocessing import image_dataset_from_directory
  
import os
import 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 datasets
train_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 image
test_image = image.load_img("1.jpg",target_size=(200,200))
  
#For show image
plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)
  
# Result array
result = model.predict(test_image)
  
#Mapping result array with the main name list
i=0
if(result>=0.5):
  print("Dog")
else:
  print("Cat")

Выход :

Python3




test_image = image.load_img("test/2.jpg", target_size=(200, 200))
  
# For show image
plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
  
# Result array
result = model.predict(test_image)
# Mapping result array with the main name list
i = 0
if(result >= 0.5):
    print("Dog")
else:
    print("Cat")

Выход:

Вывод :

Как только вы поймете концепцию классификации изображений, теперь вы можете попробовать другую классификацию, например, обнаружение рака легких с использованием CNN.

Для повышения производительности мы можем использовать трансферное обучение и выполнить настройку гиперпараметров.