Классификация кошек и собак с использованием сверточной нейронной сети в Python
Классификация изображений — одно из самых интересных и полезных приложений глубоких нейронных сетей и сверточных нейронных сетей, которое позволяет нам автоматизировать задачу сборки похожих изображений и упорядочивания данных без присмотра реальных людей.
Классификация кошек и собак с использованием сверточной нейронной сети в 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.
Для повышения производительности мы можем использовать трансферное обучение и выполнить настройку гиперпараметров.