- Wprowadzenie
- Table of Contents
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identyfikacja obrazów z zestawu danych CIFAR-10 przy użyciu CNN
- Oto, co zmieniłem w modelu:
- Categorizing the Images of ImageNet using CNNs
- O zbiorze danych ImageNet
- Tutaj z pomocą przychodzi zbiór danych Imagenette firmy Fast.ai
- Pobierz Imagenette Dataset
- Wczytywanie obrazów za pomocą ImageDataGenerator
- Budujemy podstawowy model CNN do klasyfikacji obrazów
- Użycie uczenia transferowego (VGG16) w celu poprawy dokładności
- Wczytywanie wag VGG16
- Generowanie cech z VGG16
- Where to go from here?
Wprowadzenie
Konwolucyjne sieci neuronowe (CNN) – koncepcja stojąca za ostatnimi przełomami i rozwojem w głębokim uczeniu się.
Sieci neuronowe przełamały formę i wstąpiły na tron, aby stać się najnowocześniejszą techniką widzenia komputerowego. Wśród różnych typów sieci neuronowych (inne obejmują rekurencyjne sieci neuronowe (RNN), długą pamięć krótkotrwałą (LSTM), sztuczne sieci neuronowe (ANN), itp.), CNN są łatwo najbardziej popularne.
Te konwolucjonalne modele sieci neuronowych są wszechobecne w przestrzeni danych obrazu. Działają fenomenalnie dobrze w zadaniach widzenia komputerowego, takich jak klasyfikacja obrazów, wykrywanie obiektów, rozpoznawanie obrazów, itp.
Więc – gdzie możesz ćwiczyć swoje umiejętności CNN? Cóż, trafiłeś we właściwe miejsce!
Istnieją różne zbiory danych, które można wykorzystać do zastosowania konwencjonalnych sieci neuronowych. Oto trzy popularne zbiory danych:
- MNIST
- CIFAR-10
- ImageNet
W tym artykule będziemy budować modele klasyfikacji obrazów przy użyciu CNN na każdym z tych zbiorów danych. Właśnie tak! Będziemy badać MNSIT, CIFAR-10, i ImageNet, aby zrozumieć, w sposób praktyczny, jak CNN działa dla zadania klasyfikacji obrazu.
Możesz dowiedzieć się wszystkiego o Convolutional Neural Networks (CNN) w tym darmowym kursie: Convolutional Neural Networks (CNN) from Scratch
Moją inspiracją do napisania tego artykułu jest pomoc społeczności w zastosowaniu wiedzy teoretycznej w sposób praktyczny. Jest to bardzo ważne ćwiczenie, ponieważ nie tylko pomaga zbudować głębsze zrozumienie podstawowej koncepcji, ale także nauczy cię praktycznych szczegółów, które można poznać tylko poprzez wdrożenie koncepcji.
Jeśli jesteś nowy w świecie sieci neuronowych, CNN, klasyfikacji obrazów, polecam przejście przez te doskonałe, dogłębne tutoriale:
- Introduction to Neural Networks (Free Course!)
- Demystifying the Mathematics behind Convolutional Neural Networks (CNNs)
- Build your First Image Classification Model in just 10 Minutes
And if you’re looking to learn computer vision and deep learning in-depth, you should check out our popular courses:
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
Table of Contents
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identifying Images from CIFAR-10 Dataset using CNNs
- Categorizing Images of ImageNet Dataset using CNNs
- Where to go from here?
Uwaga: W tym artykule będę używał Keras do demonstracji klasyfikacji obrazów przy użyciu CNNs. Keras jest doskonałym frameworkiem do nauki, gdy zaczynasz swoją przygodę z głębokim uczeniem.
Using CNNs to Classify Hand-written Digits on MNIST Dataset
MNIST (Modified National Institute of Standards and Technology) jest dobrze znanym zbiorem danych używanym w Computer Vision, który został zbudowany przez Yann Le Cun et. al. Składa się z obrazów, które są odręcznie pisane cyframi (0-9), podzielonych na zestaw treningowy 50 000 obrazów i zestaw testowy 10 000, gdzie każdy obraz ma 28 x 28 pikseli szerokości i wysokości.
Ten zestaw danych jest często używany do ćwiczenia dowolnego algorytmu wykonanego do klasyfikacji obrazu, ponieważ zestaw danych jest dość łatwy do zdobycia. Stąd zalecam, aby był to twój pierwszy zbiór danych, jeśli dopiero zaczynasz swoją przygodę z tą dziedziną.
MNIST jest domyślnie dostarczany z Keras i możesz po prostu załadować pliki treningowe i testowe za pomocą kilku linii kodu:
Tutaj kształt X (cechy) i y (cel) dla danych treningowych i walidacyjnych:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Zanim wytrenujemy model CNN, zbudujmy podstawową w pełni połączoną sieć neuronową dla tego zbioru danych. Podstawowe kroki do zbudowania modelu klasyfikacji obrazu za pomocą sieci neuronowej to:
- Spłaszcz wymiary obrazu wejściowego do 1D (szerokość pikseli x wysokość pikseli)
- Normalizuj wartości pikseli obrazu (podziel przez 255)
- Jednorazowo.Hot Encode the categorical column
- Build a model architecture (Sequential) with Dense layers
- Train the model and make predictions
Here’s how you can build a neural network model for MNIST. Skomentowałem odpowiednie części kodu dla lepszego zrozumienia:
Po uruchomieniu powyższego kodu, zdałbyś sobie sprawę, że uzyskujemy dobrą dokładność walidacji około 97% z łatwością.
Zmodyfikujmy powyższy kod, aby zbudować model CNN.
Jedną z głównych zalet używania CNN nad NN jest to, że nie trzeba spłaszczać obrazów wejściowych do 1D, ponieważ są one zdolne do pracy z danymi obrazu w 2D. Pomaga to w zachowaniu „przestrzennych” właściwości obrazów.
Tutaj znajduje się pełny kod modelu CNN:
Nawet jeśli nasza maksymalna dokładność walidacji przy użyciu prostego modelu sieci neuronowej wynosiła około 97%, model CNN jest w stanie uzyskać 98%+ przy użyciu tylko jednej warstwy konwolucji!
Możesz pójść dalej i dodać więcej warstw Conv2D, a także pobawić się hiperparametrami modelu CNN.
Identyfikacja obrazów z zestawu danych CIFAR-10 przy użyciu CNN
MNIST jest przyjaznym dla początkujących zestawem danych w wizji komputerowej. Łatwo jest uzyskać wynik 90%+ w walidacji używając modelu CNN. Ale co jeśli nie jesteś już początkujący i potrzebujesz czegoś ambitnego, aby wykorzystać swoje koncepcje?
Tam właśnie pojawia się zbiór danych CIFAR-10!
Oto jak programiści stojący za CIFAR (Canadian Institute For Advanced Research) opisują zbiór danych:
Zbiór danych CIFAR-10 składa się z 60 000 kolorowych obrazów 32 x 32 w 10 klasach, z 6 000 obrazów na klasę. Istnieje 50 000 obrazów treningowych i 10 000 obrazów testowych.
Ważne punkty, które odróżniają ten zbiór danych od MNIST to:
- Obrazy są kolorowe w CIFAR-10 w porównaniu do czarno-białej tekstury MNIST
- Każdy obraz ma rozmiar 32 x 32 piksele
- 50 000 obrazów szkoleniowych i 10 000 obrazów testowych
Teraz, te obrazy są zrobione w różnych warunkach oświetleniowych i pod różnymi kątami, a ponieważ są to kolorowe obrazy, zobaczysz, że istnieje wiele różnic w samym kolorze podobnych obiektów (na przykład, kolor wody w oceanie). Jeśli użyjesz prostej architektury CNN, którą widzieliśmy w przykładzie MNIST powyżej, otrzymasz niską dokładność walidacji około 60%.
To jest kluczowy powód, dla którego polecam CIFAR-10 jako dobry zestaw danych do ćwiczenia umiejętności dostrajania hiperparametrów dla CNN. Dobrą rzeczą jest to, że tak jak MNIST, CIFAR-10 jest również łatwo dostępny w Keras.
Możesz po prostu załadować zbiór danych używając następującego kodu:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Oto jak możesz zbudować przyzwoity (około 78-80% na walidacji) model CNN dla CIFAR-10. Zauważ, jak wartości kształtu zostały zaktualizowane z (28, 28, 1) do (32, 32, 3) zgodnie z rozmiarem obrazów:
Oto, co zmieniłem w modelu:
- Zwiększyłem liczbę warstw Conv2D, aby zbudować głębszy model
- Zwiększyłem liczbę filtrów, aby nauczyć się więcej cech
- Dodałem Dropout dla regularizacji
- Dodałem więcej gęstych warstw
Dokładność szkolenia i walidacji w epokach:
Możesz łatwo przyćmić tę wydajność, dostrajając powyższy model. Kiedy już opanujesz CIFAR-10, w Keras dostępny jest również CIFAR-100, który możesz wykorzystać do dalszej praktyki. Ponieważ ma on 100 klas, nie będzie to łatwe zadanie do osiągnięcia!
Categorizing the Images of ImageNet using CNNs
Teraz, gdy już opanowałeś MNIST i CIFAR-10, weźmy ten problem o oczko wyżej. Tutaj przyjrzymy się słynnemu zbiorowi danych ImageNet.
ImageNet jest główną bazą danych stojącą za ImageNet Large Scale Recognition Challenge (ILSVRC). Jest to coś w rodzaju Olimpiady Widzenia Komputerowego. To właśnie ten konkurs sprawił, że sieci CNN stały się popularne po raz pierwszy i co roku najlepsze zespoły badawcze z różnych branż i środowisk akademickich konkurują ze swoimi najlepszymi algorytmami w zadaniach związanych z widzeniem komputerowym.
O zbiorze danych ImageNet
Zbiór danych ImageNet zawiera ponad 14 milionów obrazów, ręcznie oznakowanych w 20 000 kategorii.
Wada – to może być za dużo dla zwykłego laptopa. Jakie jest więc alternatywne rozwiązanie? Jak entuzjasta może pracować ze zbiorem danych ImageNet?
Tutaj z pomocą przychodzi zbiór danych Imagenette firmy Fast.ai
Imagenette to zbiór danych wyodrębniony z dużej kolekcji obrazów ImageNet. Powodem wypuszczenia Imagenette jest to, że naukowcy i studenci mogą ćwiczyć na obrazach z poziomu ImageNet bez potrzeby posiadania tak dużych zasobów obliczeniowych.
Słowa samego Jeremy’ego Howarda:
„Ja (czyli Jeremy Howard) stworzyłem Imagenette głównie dlatego, że chciałem mieć mały zbiór danych wizyjnych, który mógłbym wykorzystać do szybkiego sprawdzenia, czy moje pomysły na algorytmy mają szansę zadziałać. Zwykle nie działają, ale testowanie ich na Imagenet zajmuje mi naprawdę dużo czasu, aby się o tym przekonać, zwłaszcza że interesują mnie algorytmy, które działają szczególnie dobrze pod koniec szkolenia.
Ale myślę, że może to być przydatny zestaw danych również dla innych.”
I właśnie tego będziemy używać do ćwiczeń!
Pobierz Imagenette Dataset
Oto jak możesz pobrać zbiór danych (polecenia dla terminala):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgzPo pobraniu zbioru danych zauważysz, że ma on dwa foldery – „train” i „val”. Zawierają one odpowiednio zestaw treningowy i walidacyjny. Wewnątrz każdego folderu, znajdują się osobne foldery dla każdej klasy. Oto mapowanie klas:
Klasy te mają to samo ID w oryginalnym zbiorze danych ImageNet. Każda z klas ma około 1000 obrazów, więc ogólnie jest to zrównoważony zbiór danych.
Wczytywanie obrazów za pomocą ImageDataGenerator
Keras ma przydatną funkcjonalność do ładowania dużych obrazów (jak my tutaj) bez maksymalnego wykorzystania pamięci RAM, poprzez robienie tego w małych partiach. ImageDataGenerator w połączeniu z fit_generator zapewnia taką funkcjonalność:
Sam ImageDataGenerator wnioskuje o etykietach klas i liczbie klas z nazw folderów.
Budujemy podstawowy model CNN do klasyfikacji obrazów
Zbudujmy podstawowy model CNN dla naszego zbioru danych Imagenette (do celów klasyfikacji obrazów):
Kiedy porównamy dokładność walidacji powyższego modelu, zdasz sobie sprawę, że mimo iż jest to bardziej głęboka architektura niż to, co wykorzystywaliśmy do tej pory, jesteśmy w stanie uzyskać dokładność walidacji jedynie na poziomie około 40-50%.
Powodów może być wiele, np. nasz model nie jest wystarczająco złożony, aby nauczyć się podstawowych wzorców obrazów, a może dane treningowe są zbyt małe, aby dokładnie uogólnić je na różne klasy.
Krok wyżej – uczenie transferowe.
Użycie uczenia transferowego (VGG16) w celu poprawy dokładności
VGG16 to architektura CNN, która zajęła pierwsze miejsce w 2014 ImageNet Challenge. Została zaprojektowana przez Visual Graphics Group na Oxfordzie i ma w sumie 16 warstw, z czego 13 samych warstw konwolucyjnych. Załadujemy wstępnie wytrenowane wagi tego modelu, abyśmy mogli wykorzystać użyteczne cechy, których model ten nauczył się dla naszego zadania.
Wczytywanie wag VGG16
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()Oto architektura modelu:Generowanie cech z VGG16
Wyodrębnijmy użyteczne cechy, które VGG16 już zna z obrazów naszego zbioru danych:
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)Gdy powyższe cechy są już gotowe, możemy po prostu użyć ich do wytrenowania podstawowej sieci neuronowej Fully Connected Neural Network w Keras:Zauważ, jak szybko Twój model zaczyna się zbiegać. W ciągu zaledwie 10 epok masz dokładność walidacji na poziomie 94%+. Czy to nie jest niesamowite?
Na wypadek, gdybyś opanował zestaw danych Imagenette, fastai opublikował również dwa warianty, które zawierają klasy, które trudno będzie Ci sklasyfikować:
- Imagewoof: 10 klas ras psów, trudniejszy problem do sklasyfikowania
- Image网 („wang”): Połączenie Imagenette i Imagewoof oraz kilka sztuczek, które sprawiają, że jest to trudniejszy problem
Where to go from here?
Oprócz zbiorów danych, które mamy powyżej, możesz również użyć poniższych zbiorów danych do budowania algorytmów widzenia komputerowego. W rzeczywistości, rozważ to jako wyzwanie. Czy możesz zastosować swoją wiedzę o CNN, aby pobić wynik benchmarku na tych zestawach danych?
- Fashion MNIST – MNIST-like dataset ubrań i odzieży. Zamiast cyfr, obrazy pokazują typ odzieży (koszulka, spodnie, torba, itp.)
- Caltech 101 – Kolejny trudny zestaw danych, który znalazłem do klasyfikacji obrazów
Sugeruję również, że zanim przejdziesz do uczenia transferowego, spróbuj poprawić swoje bazowe modele CNN. Możesz uczyć się z architektur VGG16, ZFNet, itp., aby uzyskać wskazówki dotyczące dostrajania hiperparametrów i możesz użyć tego samego ImageDataGenerator do rozszerzenia obrazów i zwiększenia rozmiaru zbioru danych.
Możesz również przeczytać ten artykuł w naszej aplikacji mobilnej .