Tworzenie modelu niestandardowego dla klasyfikatora obrazów

1. Zanim zaczniesz

W poprzednim ćwiczeniu w Codelabs utworzyliśmy aplikację na Androida i iOS, która korzystała z podstawowego modelu etykietowania obrazów rozpoznającego kilkaset klas obrazów. Rozpoznał zdjęcie kwiatu w bardzo ogólny sposób – zobaczył płatki, kwiat, roślinę i niebo.

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

Wymagania wstępne

  • Poprzednie ćwiczenie w tej ścieżce szkoleniowej.

Co utworzysz i czego się nauczysz

  • Jak wytrenować niestandardowy model klasyfikacji obrazów za pomocą narzędzia TensorFlow Lite Model Maker.

Czego potrzebujesz

  • Nie jest potrzebny żaden konkretny sprzęt – wszystko można zrobić w Google Colab w przeglądarce.

2. Rozpocznij

Cały kod, który będzie Ci potrzebny, został przygotowany i jest dostępny do uruchomienia w Google Colab – tutaj. Jeśli nie masz dostępu do Google Colab, możesz sklonować repozytorium i użyć notatnika o nazwie CustomImageClassifierModel.ipynb, który znajdziesz w katalogu ImageClassificationMobile->colab.

Jeśli masz wiele przykładów konkretnych kwiatów, możesz stosunkowo łatwo wytrenować model za pomocą narzędzia TensorFlow Lite Model Maker, aby je rozpoznawać.

Najprostszym sposobem jest utworzenie pliku ZIP lub TGZ zawierającego obrazy posortowane w katalogach. Jeśli na przykład używasz zdjęć stokrotek, mniszków lekarskich, róż, słoneczników i tulipanów, możesz je uporządkować w katalogach w ten sposób:

4ee12554e75b103f.png

Spakuj go i umieść na serwerze, a będziesz mieć możliwość trenowania modeli. W pozostałej części tego modułu użyjesz przygotowanego dla Ciebie projektu.

W tym module założymy, że do trenowania modelu używasz Google Colab. Colab znajdziesz na stronie colab.research.google.com. Jeśli korzystasz z innego środowiska, być może musisz zainstalować wiele zależności, w tym TensorFlow.

3. Instalowanie i importowanie zależności

  1. Zainstaluj TensorFlow Lite Model Maker. Możesz to zrobić za pomocą polecenia pip install. Znak &> /dev/null na końcu po prostu tłumi dane wyjściowe. Model Maker generuje wiele informacji, które nie są od razu istotne. Zostało ono wyłączone, 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 chcesz używać, i upewnić się, że korzystasz z 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')

Środowisko jest już gotowe, więc możesz zacząć tworzyć model.

4. Pobieranie i przygotowywanie danych

Jeśli obrazy są uporządkowane w folderach, a foldery są spakowane, po pobraniu i rozpakowaniu pliku ZIP obrazy zostaną automatycznie oznaczone etykietami na podstawie folderu, w którym się znajdują. Ten katalog będzie oznaczany 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)

Ścieżkę danych można następnie wczytać do modelu sieci neuronowej w celu trenowania za pomocą klasy ImageClassifierDataLoader narzędzia TensorFlow Lite Model Maker. Wystarczy, że wskażesz folder.

Ważnym elementem trenowania modeli za pomocą uczenia maszynowego jest nieużywanie do tego celu wszystkich danych. Zostaw trochę danych, aby przetestować model na danych, których wcześniej nie widział. Możesz to łatwo zrobić za pomocą metody podziału zbioru danych, która jest zwracana przez ImageClassifierDataLoader. Jeśli przekażesz wartość 0,9, 90% danych zostanie wykorzystanych jako dane treningowe, a 10% jako dane testowe:

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

Po przygotowaniu danych możesz utworzyć na ich podstawie model.

5. Tworzenie modelu klasyfikatora obrazów

Model Maker abstrahuje wiele szczegółów projektowania sieci neuronowej, dzięki czemu nie musisz zajmować się projektowaniem sieci ani takimi kwestiami jak konwolucje, gęstość, relu, spłaszczanie, funkcje strat i optymalizatory. W przypadku modelu domyślnego możesz utworzyć model za pomocą jednego wiersza kodu, trenując sieć neuronową na podstawie podanych danych:

model = image_classifier.create(train_data)

Po uruchomieniu tego polecenia zobaczysz dane wyjściowe podobne do tych:

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

Pierwsza część pokazuje architekturę modelu. Model Maker wykorzystuje w tle naukę transferu, która polega na użyciu istniejącego, wstępnie wytrenowanego modelu jako punktu wyjścia i wykorzystaniu zdobytej przez niego wiedzy o tym, jak są zbudowane obrazy, do rozpoznawania tych 5 rodzajów kwiatów. Możesz to sprawdzić w pierwszym wierszu:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

Kluczowe jest słowo „Hub”, które informuje, że model pochodzi z TensorFlow Hub. Domyślnie narzędzie TensorFlow Lite Model Maker używa modelu o nazwie „MobileNet”, który jest przeznaczony do rozpoznawania 1000 rodzajów obrazów. Logika jest taka, że metodologię, która uczy się „cech” rozróżniających 1000 klas, można wykorzystać ponownie. Te same „cechy” można przypisać do 5 klas kwiatów, więc nie trzeba ich uczyć od zera.

Model przeszedł 5 epok, czyli pełnych cykli trenowania, w których sieć neuronowa próbowała dopasować obrazy do etykiet. Po 5 epokach, czyli po około minucie, dokładność na danych treningowych wynosiła 93,85%. Biorąc pod uwagę, że mamy 5 klas, losowe zgadywanie dałoby 20% trafności, więc to już jakiś postęp. (Raport zawiera też liczbę „utraconych” połączeń, ale na razie możesz ją zignorować).

Wcześniej podzieliliśmy dane na dane do trenowania i dane testowe, aby sprawdzić, jak sieć radzi sobie z danymi, których wcześniej nie widziała. Aby uzyskać lepszy wskaźnik tego, jak może działać w rzeczywistości, użyj model.evaluate na danych testowych:

loss, accuracy = model.evaluate(test_data)

Spowoduje to wyświetlenie danych wyjściowych podobnych do tych:

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

Zwróć uwagę na dokładność. Wynosi ona 88,01%, więc w rzeczywistych warunkach można oczekiwać, że model domyślny będzie miał taką dokładność. To całkiem niezły wynik jak na model domyślny, który został wytrenowany w około minutę. Oczywiście możesz wprowadzić wiele zmian, aby ulepszyć model, ale to już osobna dziedzina nauki.

6. Eksportowanie modelu

Po wytrenowaniu modelu następnym krokiem jest wyeksportowanie go w formacie .tflite, którego może używać aplikacja mobilna. Narzędzie do tworzenia modeli udostępnia prostą metodę eksportowania, z której możesz skorzystać – wystarczy, że określisz katalog, do którego mają być zapisywane dane wyjściowe.

Oto kod:

model.export(export_dir='/mm_flowers')

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

cc5b9988775633b4.png

Zobaczysz listę bieżącego katalogu. Aby przenieść katalog „w górę”, użyj wskazanego przycisku:

51e6ac47c992142a.png

W kodzie określono eksportowanie do katalogu mm_flowers. Otwórz go, a zobaczysz plik o nazwie „model.tflite”. To Twój wytrenowany model.

57bad87f294fd189.png

Wybierz plik, a po prawej stronie pojawią się 3 kropki. Kliknij je, aby otworzyć menu kontekstowe, z którego możesz pobrać model.

aee14ad10c4a8a1a.png

Po chwili model zostanie pobrany do folderu pobranych plików.

7. Gratulacje

Możesz teraz zintegrować go z aplikacją mobilną. Zrobisz to w następnym module.