Przegląd

Ten blog dotyczy klasyfikatora obrazów, który zbudowałem przy użyciu keras i tensera. Celem tego projektu było zbudowanie klasyfikatora obrazu, który potrafiłby rozróżnić trzy różne rodzaje pojazdów — samoloty, motocykle i szkunery (żaglówki). Zbiór danych, którego użyłem w tym projekcie, jest dostępny na kaggle i składa się z około 800 zdjęć pierwszych samolotów i motocykli oraz około 60 zdjęć szkunerów. Przeprowadziłem różne testy na tym modelu, aby osiągnąć wysoką dokładność.

Użyłem Tensorflow w wersji 2.9.2 Keras w wersji 2.9.0

Model

W tym projekcie wykorzystałem model CNN (Convolutional Neural Network). Model ten opiera się na sieciach neuronowych i jest jednym z najpopularniejszych modeli wykorzystywanych do przetwarzania obrazu. Więcej informacji na temat CNN można znaleźć tutaj.

Przebieg projektu

Najpierw zaimportowałem niezbędne biblioteki niezbędne do tego projektu. Następnie zamontowałem dysk Google w tym notatniku, aby uzyskać dostęp do zbioru danych. Następnie wstępnie przetworzyłem dane i zapisałem dane szkoleniowe i testowe w zmiennych. Po pomyślnym wstępnym przetworzeniu danych kolejnym krokiem było zbudowanie modelu. To najważniejszy etap tego projektu, ponieważ metodą prób i błędów zdefiniowałem na nowo hiperparametry i udało mi się to osiągnąć po wielu nieudanych próbach poprawy dokładności modelu. Następnie przeprowadziłem analizę dokładności, uzyskując średnią dokładność modelu w teście, a także zbiór danych pociągu, który okazał się dobry. Na koniec wstępnie przetwarzam niewidziany obraz z katalogu przewidywań danych w celu wypróbowania i sprawdzenia, czy model jest w stanie wygenerować dokładne dane wyjściowe i, co nie jest zaskoczeniem, model był w stanie prawidłowo rozpoznać obraz.

Importowanie bibliotek

import numpy as np
import keras
import tensorflow as tf
from keras.preprocessing.image import ImageDataGeneratorfrom keras.utils import load_img, img_to_array

Montaż napędu

from google.colab import drive
drive.mount('/content/drive', force_remount=True)

Wstępne przetwarzanie danych

Szkolenie z wstępnego przetwarzania obrazu

train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) training_set = train_datagen.flow_from_directory( '/content/drive/MyDrive/data/training_set', target_size=(64, 64), batch_size=32, class_mode='categorical')

Przetestuj wstępne przetwarzanie obrazu

test_datagen = ImageDataGenerator(rescale=1./255)
test_set = test_datagen.flow_from_directory(
'/content/drive/MyDrive/data/testing_set',
target_size=(64, 64),
batch_size=32,
class_mode='categorical')

Budowa modelu

cnn = tf.keras.models.Sequential()

Budowa warstwy splotu

cnn.add(tf.keras.layers.Conv2D(filters=128 , kernel_size=3 , activation='relu' , input_shape=[64,64,3])) #increased the filters from 64 to 128
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))
cnn.add(tf.keras.layers.Conv2D(filters=128 , kernel_size=3 , activation='relu' )) #increased the filters from 64 to 128
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2 , strides=2))
cnn.add(tf.keras.layers.Dropout(0.5))
cnn.add(tf.keras.layers.Flatten())
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=3 , activation='softmax')) #changed the value of class from 5 to 3
cnn.compile(optimizer = 'rmsprop' , loss = 'categorical_crossentropy' , metrics = ['accuracy'])
model = cnn.fit(x = training_set , validation_data = test_set , epochs = 30)

Uzyskanie średniej dokładności modelu na testowym zbiorze danych.

import statistics #doing the analysis on the mean accuracy of the test split
mean_accuracy = statistics.mean(model.history["val_accuracy"])
mean_accuracy #calculated the accuracy of train split

Przetwórz wstępnie niewidziany obraz do wersji próbnej.

from keras.preprocessing import image
test_image = keras.utils.load_img('/content/drive/MyDrive/data/predictions/image_0021 6.09.42 PM.jpg',target_size=(64,64))
test_image = keras.utils.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)
result = cnn.predict(test_image)
training_set.class_indices

Sprawdzanie wyników modelu

#made changes according to the projects requirements of 3 classes instead of 5 in original project. 
if result[0][0]==1:
    print('Motorbikes')
elif result[0][1]==1:
    print('airplanes')
elif result[0][2]==1:
    print('schooner')

wydrukowanie macierzy wyników

print(result)

Mój wkład

Wspominałem o moim wkładzie w kod wszędzie tam, gdzie dokonałem jakichkolwiek zmian w istniejącym kodzie w celu optymalizacji wyników.

Analiza dokładności

Przeprowadziłem analizę dokładności tego modelu, wykreślając wykres Epoka vs dokładność. Jak widać na tym wykresie, dokładność nieznacznie wzrasta poprzez zmianę liczby epok uczenia modelu.

Dokładność w oryginalnym projekcie[1] wynosi tylko około 70%, natomiast w tym projekcie dokładność wynosi około 90%. Aby to osiągnąć, zwiększyłem liczbę filtrów w modelu z 64 do 128.

W pierwotnym projekcie[1] było 5 klas, jednak w tym projekcie, zgodnie z wymaganiami, klasy zostały zmienione na 3.

Wyzwania

Ponieważ nie mam doświadczenia w uczeniu maszynowym i eksploracji danych, miałem problemy w wielu miejscach, od zamontowania dysku Google i załadowania zestawu danych do składni Pythona. Zrozumienie, jak różne są funkcje dwóch bibliotek, z których korzystałem, było dla mnie wyzwaniem. Jednak największym wyzwaniem była poprawa dokładności już dopracowanego modelu. Po wielu próbach i błędach dostrajania hiperparametrów modelu udało mi się zwiększyć dokładność tego modelu.

Referencje

Użyłem projektu rozpoznawania obrazu | Budowanie systemu rozpoznawania kwiatów przy użyciu języka Python Tensorflow i Keras wideo [1] oraz kodu z repozytorium GitHub [2], aby poznać ten projekt i wykonać ten projekt. Dowolna linia kodu, która nie zawiera komentarza dotyczącego mojego wkładu, jest kopiowana z przywoływanego repozytorium GitHub [2]. Chciałbym również wspomnieć o poście na blogu [5], który zainspirował mnie do napisania tego bloga.

[1] https://www.youtube.com/watch?app=desktop&v=2gMZC-4WAQ4&ab_channel=SPOTLESSTECH

[2]https://github.com/animesh1012/machineLearning/blob/main/flower_recognition.ipynb

[3] Zbiór danych — https://www.kaggle.com/datasets/maricinnamon/caltech101-airplanes-motorbikes-schooners

[4] Artykuł w CNN https://medium.com/r/ url=https%3A%2F%2Ftowardsdatascience.com%2Fconvolutional-neural-networks-explained-9cc5188c4939%23%3A~%3Atext%3DA%2520Convolutional% 2520Neural%2520Sieć%252C%2520również%2Cbinarny%2520reprezentacja%2520z%2520wizualne%2520dane.

[5] https://aunsharekar.wixsite.com/my-site/post/flower-image-classifier