Tworzenie modelu niestandardowego dla klasyfikatora obrazów

1. Zanim zaczniesz

W ramach poprzedniego ćwiczenia w Codelabs utworzyliśmy aplikację na Androida i iOS, w której wykorzystano podstawowy model etykietowania obrazów, który rozpoznaje kilkaset klas obrazów. Urządzenie rozpoznało zdjęcie kwiatu bardzo ogólnie – widziało płatki, kwiat, roślinę i niebo.

Aby zaktualizować aplikację tak, aby rozpoznawała na przykład konkretne kwiaty, stokrotki lub róże, potrzebujesz niestandardowego modelu, który został wytrenowany na wielu przykładach każdego rodzaju kwiatów, które chcesz rozpoznawać.

Wymagania wstępne

  • Poprzednie ćwiczenia z programowania w tej ścieżce szkoleniowej.

Czego się nauczysz i czego się nauczysz

  • Jak wytrenować model niestandardowy klasyfikatora obrazów za pomocą Kreatora modeli TensorFlow Lite.

Czego potrzebujesz

  • Nie potrzebujesz żadnego konkretnego sprzętu – wszystkie zadania możesz wykonać w Google Colab w przeglądarce.

2. Rozpocznij

Cały kod do wykonania został już przygotowany i możesz go wykonać za pomocą Google Colab tutaj. Jeśli nie masz dostępu do Google Colab, możesz skopiować repozytorium i użyć notatnika o nazwie CustomImageClassifierModel.ipynb, który znajduje się w katalogu ImageClassificationMobile->colab.

Jeśli masz wiele przykładów konkretnych kwiatów, możesz stosunkowo łatwo wytrenować model za pomocą Kreatora modeli TensorFlow Lite, aby je rozpoznać.

Najprostszym sposobem jest utworzenie pliku .zip lub .tgz zawierającego obrazy i uporządkowanego w katalogach. Jeśli na przykład wykorzystujesz zdjęcia stokrotek, mniszka lekarskiego, róż, słoneczników i tulipanów, możesz uporządkować je w następujący sposób:

4ee12554e75b103f.png

Spakuj ją i hostuj na serwerze, aby móc trenować na niej modele. Będziesz używać wersji przygotowanej dla Ciebie w pozostałej części tego modułu.

W tym module zakładamy, że do trenowania modelu używasz Google Colab. Znajdziesz ją na stronie colab.research.google.com. Jeśli używasz innego środowiska, konieczne może być zainstalowanie wielu zależności – zwłaszcza TensorFlow.

3. Instalowanie i importowanie zależności

  1. Zainstaluj Kreator modeli TensorFlow Lite. Możesz to zrobić przez instalację pipa. Przycisk &> /dev/null at the end just suppresses the output. Kreator modeli generuje wiele elementów, które nie są od razu istotne. Została wstrzymana, aby umożliwić Ci skupienie się na wykonywanym zadaniu.
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. Następnie musisz zaimportować biblioteki, których potrzebujesz, i upewnić się, że używasz TensorFlow 2.x:
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Gdy środowisko jest gotowe, możesz zacząć tworzyć model.

4. Pobieranie i przygotowywanie danych

Jeśli obrazy znajdują się w folderach, które są skompresowane, to po pobraniu i zdekompresowaniu obrazów automatycznie oznaczysz obrazy etykietami na podstawie folderu, w którym się znajdują. Ten katalog będzie przywoływany jako data_path.

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

Tę ścieżkę danych można następnie wczytać do modelu sieci neuronowej na potrzeby trenowania za pomocą klasy ImageClassifierDataLoader Kreatora modeli TensorFlow Lite. Wystarczy, że skierujesz go na folder.

Ważnym elementem w modelach trenowania z systemami uczącymi się jest niewykorzystywanie wszystkich danych do trenowania. Zaczekaj chwilę, aby przetestować model z użyciem danych, których wcześniej nie widział. Możesz to łatwo zrobić dzięki metodzie podziału zbioru danych, który pochodzi z ImageClassifierDataLoader. Jeśli wprowadzisz do niego wartość 0, 9, otrzymasz 90% z tych danych jako dane treningowe i 10% jako dane testowe:

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

Po przygotowaniu danych możesz utworzyć przy ich użyciu model.

5. Tworzenie modelu klasyfikatora obrazów

Kreator modeli abstrakcyjnie wiele szczegółów projektowania sieci neuronowej, dzięki czemu nie musisz zajmować się projektowaniem sieci i takimi zagadnieniami jak sploty, gęste, relu, spłaszczone, funkcje utraty czy optymalizatory. W przypadku modelu domyślnego możesz użyć pojedynczego wiersza kodu, aby utworzyć model, trenując sieć neuronowa z użyciem udostępnionych danych:

model = image_classifier.create(train_data)

Po uruchomieniu tego polecenia dane wyjściowe będą wyglądać mniej więcej tak:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

W pierwszej części przedstawiona jest architektura modelu. To, co robi za kulisy Kreatora modeli, to funkcja Transfer Learning, która wykorzystuje istniejący już wytrenowany model jako punkt wyjścia i wykorzystuje informacje o tym, jak skonstruowany jest obraz, i wykorzystuje je do zrozumienia tych 5 kwiatów. Można ją odczytać w pierwszym wierszu o treści:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

Kluczem jest słowo „Hub”, które informuje nas, że ten model pochodzi z TensorFlow Hub. Domyślnie Kreator modeli TensorFlow Lite używa modelu o nazwie „MobileNet” który rozpoznaje 1000 typów obrazów. Logika stwierdza, że stosowana przez nią metodologia, uczenie się „funkcji” do rozróżnienia 1000 klas, można używać wielokrotnie. Te same „funkcje” można przypisać do 5 klas kwiatów, więc nie trzeba uczyć się ich od zera.

Model przeszedł 5 epok, gdzie epoka to pełny cykl trenowania, podczas którego sieć neuronowa stara się dopasować obrazy do etykiet. W 5 epokach, w około 1 minutę, dokładność danych treningowych wyniosła 93,85%. Biorąc pod uwagę, że jest 5 klas, przypadkowe odgadnięcie będzie miało 20% dokładności, więc to jest postęp. (Raport rejestruje też „stratę”, ale na razie możesz to bezpiecznie zignorować).

Wcześniej podzieliłeś dane na dane treningowe i testowe, by uzyskać wskaźnik wydajności sieci na podstawie danych, z których wcześniej nie korzystała. To lepszy wskaźnik tego, jak sieć może działać w świecie rzeczywistym – w tym celu użyj funkcji model.evaluate w danych testowych:

loss, accuracy = model.evaluate(test_data)

Zwrócony wynik będzie podobny do tego:

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

Zwróć uwagę na dokładność. Wynosi on 88,01%, więc używając modelu domyślnego w świecie rzeczywistym, można spodziewać się takiego poziomu dokładności. Nie jest to źle w przypadku modelu domyślnego, którego wytrenowano mniej więcej minutę. Oczywiście można będzie wiele zrobić, aby ulepszyć model, i to jest sama nauka!

6. Eksportowanie modelu

Po wytrenowaniu modelu możesz wyeksportować go do formatu .tflite, którego może używać aplikacja mobilna. Kreator modeli zapewnia łatwą metodę eksportowania, której możesz użyć – wystarczy podać katalog, do którego mają zostać wyeksportowane dane.

Oto kod:

model.export(export_dir='/mm_flowers')

Jeśli uruchamiasz ten kod w Google Colab, możesz zobaczyć model, klikając ikonę folderu po lewej stronie ekranu:

cc5b9988775633b4.png

Zobaczysz listę bieżącego katalogu. Użyj wskazanego przycisku, aby przesunąć widok w górę. katalog:

51e6ac47c992142a.png

W kodzie podanym przez Ciebie do wyeksportowania do katalogu mm_flowers. Otwórz go. Zobaczysz plik o nazwie „model.tflite”. To jest wytrenowany model.

57bad87f294fd189.png

Wybierz plik. Po prawej stronie pojawią się 3 kropki. Kliknij je, aby wyświetlić menu kontekstowe, z którego możesz pobrać model.

aee14ad10c4a8a1a.png

Po kilku chwilach model zostanie pobrany do folderu z pobranymi plikami.

7. Gratulacje

Możesz teraz zintegrować ją ze swoją aplikacją mobilną. Zrobisz to w następnym module.