1. Zanim zaczniesz
W pierwszym ćwiczeniu z tej serii utworzyliśmy bardzo prostą aplikację, która za pomocą etykietowania obrazów analizowała zawartość obrazu. Przekazujesz mu zdjęcie stokrotki, a on odpowiada, że widzi płatek lub niebo. W drugim module przeszliśmy na Pythona, aby wytrenować nowy, niestandardowy model rozpoznający 5 różnych rodzajów kwiatów.
W tym module zaktualizujesz aplikację z pierwszego modułu za pomocą modelu z drugiego modułu.
Pełny kod źródłowy tego modułu możesz pobrać, klonując to repozytorium. Zobaczysz podkatalogi Androida i iOS. Kod z poprzedniego laboratorium jest dostępny jako ImageClassifierStep1, jeśli chcesz go użyć. Gotowy kod tego ćwiczenia jest dostępny jako ImageClassifierStep2.
Wymagania wstępne
- Powinieneś(-aś) ukończyć pierwsze 2 ćwiczenia z tej ścieżki szkoleniowej.
Co utworzysz i czego się nauczysz
- Zintegruj model niestandardowy wytrenowany w poprzednim module z aplikacją na Androida lub iOS.
Czego potrzebujesz
- Android Studio, dostępne na stronie developer.android.com/studio w sekcji dotyczącej Androida.
- Xcode, dostępny w Apple App Store, na potrzeby części laboratorium dotyczącej iOS.
2. Pobieranie aplikacji wyjściowej
Najpierw musisz pobrać aplikację z ćwiczenia Tworzenie pierwszej aplikacji do rozpoznawania obrazów na Androida lub iOS. Jeśli moduł został ukończony, będzie się nazywać ImageClassifierStep1. Jeśli nie chcesz przechodzić przez moduł, możesz sklonować gotową wersję z repozytorium.
Otwórz go w Android Studio, wprowadź potrzebne zmiany i gdy wszystko będzie gotowe, uruchom aplikację, aby sprawdzić, czy działa. Powinien pojawić się ekran podobny do tego:

To dość prosta aplikacja, ale pokazuje bardzo zaawansowane funkcje przy użyciu niewielkiej ilości kodu. Jeśli jednak chcesz, aby ten kwiat był rozpoznawany jako stokrotka, a nie tylko jako kwiat, musisz zaktualizować aplikację, aby używała modelu niestandardowego z ćwiczenia Tworzenie modelu niestandardowego dla klasyfikatora obrazów.
3. Aktualizowanie pliku build.gradle w celu używania niestandardowych modeli ML Kit
- W Android Studio znajdź plik
build.gradlena poziomie aplikacji. Najłatwiej to zrobić w eksploratorze projektu. U góry sprawdź, czy zaznaczona jest opcja Android. U dołu zobaczysz folder Gradle Scripts (Skrypty Gradle). - Otwórz ten, który jest przeznaczony dla modułu, z nazwą aplikacji, a po niej „.app”, jak pokazano tutaj: (Module: ImageClassifierStep1.app):

- U dołu pliku znajdź ustawienie dependencies. Powinien się tam znajdować ten wiersz:
implementation 'com.google.mlkit:image-labeling:17.0.1'
Numer wersji może być inny. Najnowszą wersję znajdziesz na stronie ML Kit: https://developers.google.com/ml-kit/vision/image-labeling/android
- Zastąp ten tekst odwołaniem do biblioteki niestandardowego oznaczania obrazów. Numer wersji znajdziesz na stronie: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- Dodasz też model .tflite utworzony w poprzednim module. Nie chcesz, aby ten model był kompresowany podczas kompilowania aplikacji przez Androida Studio, więc w sekcji Android tego samego pliku
build.gradleużyj tego ustawienia:
aaptOptions{
noCompress "tflite"
}
Upewnij się, że nie znajduje się w żadnym innym ustawieniu. Powinien być umieszczony bezpośrednio pod tagiem android. Oto przykład:

4. Dodawanie modelu TFLite
W poprzednim laboratorium kodowania utworzyliśmy model niestandardowy i pobraliśmy go jako model.tflite.
W projekcie znajdź folder assets, który obecnie zawiera flower1.jpg. Skopiuj model do tego folderu w ten sposób:
- W Android Studio kliknij prawym przyciskiem myszy folder Assets. W menu, które się otworzy, kliknij Pokaż w Finderze. („Pokaż w Eksploratorze” w systemie Windows i „Pokaż w Plikach” w systemie Linux).

- Otworzy się katalog w systemie plików. Skopiuj plik
model.tflitedo tego katalogu obok plikuflower1.jpg..

Android Studio zaktualizuje się, aby wyświetlać oba pliki w folderze zasobów:

Możesz teraz zaktualizować kod.
5. Aktualizowanie kodu pod kątem modelu niestandardowego
Pierwszym krokiem będzie dodanie kodu wczytującego model niestandardowy.
- W pliku
MainActivitydodaj do sekcjionCreatete informacje bezpośrednio pod wierszemsetContentView(R.layout.activity_main).
Do utworzenia modelu zostanie użyty obiekt LocalModel na podstawie zasobu model.tflite. Jeśli Android Studio zgłosi problem, zmieniając kolor „LocalModel” na czerwony, naciśnij ALT + Enter, aby zaimportować bibliotekę. Powinien dodać import do com.google.mlkit.common.model.LocalModel.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
Wcześniej w obsłudze btn.setOnClickListener używałeś modelu domyślnego. Został skonfigurowany za pomocą tego kodu:
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
Zastąpisz go, aby używać modelu niestandardowego.
- Skonfiguruj obiekt opcji niestandardowych:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
Spowoduje to zastąpienie opcji domyślnych dostosowanym zestawem. Próg ufności określa poziom jakości prognoz, które mają być zwracane. Jeśli wrócisz do przykładu na początku tego ćwiczenia, w którym obraz przedstawiał stokrotkę, zobaczysz 4 prognozy, a obok każdej z nich wartość, np. „Niebo” – 0,7632.
Możesz skutecznie odfiltrować wyniki o niższej jakości, stosując wysoki próg ufności. Jeśli ustawisz tę wartość na 0,9, nie zostaną zwrócone żadne etykiety o niższym priorytecie. Wartość setMaxResultCount() jest przydatna w modelach z wieloma klasami, ale ponieważ ten model ma tylko 5 klas, pozostawimy tę wartość na poziomie 5.
Teraz, gdy masz już opcje dotyczące etykietowania, możesz zmienić instancję etykietowania na:
val labeler = ImageLabeling.getClient(options)
Pozostała część kodu będzie działać bez zmian. Wypróbuj tę funkcję!

Widzimy, że ten kwiat został teraz zidentyfikowany jako stokrotka z prawdopodobieństwem 0,959.
Załóżmy, że dodasz drugi obraz kwiatów i ponownie uruchomisz model:

Rozpoznaje go jako różę.
Możesz się zastanawiać, dlaczego jest tam napisane róże, a nie „róża”. Dzieje się tak, ponieważ w zbiorze danych etykiety są podawane przez nazwy folderów, a te nazwy są niestety nieco niespójne – czasami używana jest liczba pojedyncza (np. „daisy”), a czasami mnoga (np. „roses”). Nie myl tego z próbą policzenia elementów na obrazie – to znacznie prostsze działanie, które pozwala tylko rozpoznać typy kwiatów.
6. Pobieranie aplikacji Start na iOS
- Najpierw musisz mieć aplikację z pierwszego Codelabu. Jeśli moduł został ukończony, będzie się nazywać ImageClassifierStep1. Jeśli nie chcesz przechodzić przez moduł, możesz sklonować gotową wersję z repozytorium. Pamiętaj, że w repozytorium nie ma plików pod i .xcworkspace, więc zanim przejdziesz do następnego kroku, uruchom polecenie „pod install” w tym samym katalogu co plik .xcproject.
- Otwórz plik
ImageClassifierStep1.xcworkspacew Xcode. Pamiętaj, że musisz użyć pliku .xcworkspace, a nie .xcproject, ponieważ ML Kit został dołączony za pomocą podów, a obszar roboczy je wczyta.
W dalszej części tego laboratorium będę uruchamiać aplikację w symulatorze iPhone’a, który powinien obsługiwać cele kompilacji z tego ćwiczenia w Codelabs. Jeśli chcesz użyć własnego urządzenia, może być konieczne zmiana docelowej wersji kompilacji w ustawieniach projektu, aby była zgodna z wersją iOS.
Uruchom go, a zobaczysz coś takiego:

Zwróć uwagę na bardzo ogólne klasyfikacje: płatek, kwiat, niebo. Model utworzony w poprzednim ćwiczeniu został wytrenowany do wykrywania 5 odmian kwiatów, w tym stokrotki.
W dalszej części tego ćwiczenia dowiesz się, co musisz zrobić, aby ulepszyć aplikację za pomocą modelu niestandardowego.
7. Używanie niestandardowych zasobników ML Kit Image Labeler
Pierwsza aplikacja używała pliku pod do pobierania podstawowych bibliotek i modelu ML Kit Image Labeler. Musisz to zaktualizować, aby używać bibliotek etykietowania obrazów niestandardowych.
- W katalogu projektu znajdź plik o nazwie
podfile. Otwórz go, a zobaczysz coś takiego:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- Zmień deklarację dotyczącą zasobnika z
ImageLabelingnaImageLabelingCustom, jak w tym przykładzie:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- Gdy skończysz, użyj terminala, aby przejść do katalogu zawierającego plik podfile (a także plik .xcworkspace), i uruchom polecenie
pod install.

Po chwili biblioteki MLKitImageLabeling zostaną usunięte, a zostaną dodane biblioteki niestandardowe. Teraz możesz otworzyć plik .xcworkspace, aby edytować kod.
8. Dodawanie modelu TFLite do Xcode
W poprzednim ćwiczeniu utworzyliśmy model niestandardowy i pobraliśmy go jako model.tflite. Jeśli nie masz go pod ręką, wróć i wykonaj to ćwiczenie lub zapoznaj się z kodem Colab tutaj. Jeśli nie masz dostępu do Google Colab, notatnik jest dostępny pod tym linkiem.
- Gdy obszar roboczy będzie otwarty w Xcode, przeciągnij plik model.tflite do projektu. Powinien znajdować się w tym samym folderze co pozostałe pliki, np.
ViewController.swiftlubMain.storyboard. - Pojawi się okno z opcjami dodawania pliku. Sprawdź, czy zaznaczona jest opcja Dodaj do miejsc docelowych. W przeciwnym razie model nie zostanie dołączony do aplikacji podczas wdrażania na urządzeniu.
Pamiętaj, że pozycja „Add to Targets” (Dodaj do celów) będzie miała wartość ImageClassifierStep1, jeśli zaczniesz od tego i będziesz kontynuować ten moduł krok po kroku, lub ImageClassifierStep2 (jak pokazano), jeśli przejdziesz od razu do gotowego kodu.

Dzięki temu będziesz mieć pewność, że możesz wczytać model. W następnym kroku dowiesz się, jak to zrobić.
9. Aktualizowanie kodu modelu niestandardowego
- Otwórz plik
ViewController.swift. U góry pliku może pojawić się błąd w wierszu „import MLKitImageLabeling”. Dzieje się tak, ponieważ podczas aktualizowania pliku pod usunięto biblioteki ogólnego oznaczania obrazów. Możesz usunąć ten wiersz i zastąpić go tym:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
Możesz szybko przeczytać te fragmenty i uznać, że powtarzają ten sam kod. Ale na końcu są opcje „Powszechne” i „Niestandardowe”.
- Następnie wczytaj model niestandardowy dodany w poprzednim kroku. Znajdź funkcję
getLabels(). Pod wierszemvisionImage.orientation = image.imageOrientationdodaj te wiersze:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
- Znajdź kod określający opcje ogólnego narzędzia ImageLabeler. Prawdopodobnie wyświetla błąd, ponieważ te biblioteki zostały usunięte:
let options = ImageLabelerOptions()
Zastąp go tym kodem, aby użyć CustomImageLabelerOptions i określić model lokalny:
let options = CustomImageLabelerOptions(localModel: localModel)
To wszystko. Spróbuj teraz uruchomić aplikację. Gdy spróbujesz sklasyfikować obraz, powinien on być dokładniejszy i z dużym prawdopodobieństwem stwierdzić, że patrzysz na stokrotkę.

Załóżmy, że dodasz drugi obraz kwiatów i ponownie uruchomisz model:

Aplikacja wykryła, że ten obraz pasuje do etykiety „róże”.
10. Gratulacje!
Zaczęliśmy od stworzenia aplikacji, która używała ogólnego modelu do rozpoznawania zawartości obrazu, a potem utworzyliśmy własny model ML do rozpoznawania konkretnych rzeczy, takich jak kwiaty. Następnie zaktualizowaliśmy aplikację, aby korzystała z tego modelu niestandardowego.
Oczywiście wynikowa aplikacja jest bardzo ograniczona, ponieważ korzysta z dołączonych zasobów obrazów. Jednak część związana z uczeniem maszynowym działa dobrze. Możesz na przykład użyć AndroidX Camera, aby pobierać klatki z aktywnego kanału i klasyfikować je, aby sprawdzić, jakie kwiaty rozpoznaje Twój telefon.
Możliwości są nieograniczone. Jeśli masz własne dane dotyczące czegoś innego niż kwiaty, masz podstawy do stworzenia aplikacji, która rozpoznaje je za pomocą funkcji Computer Vision. To tylko pierwsze kroki w znacznie szerszym świecie. Mamy nadzieję, że Ci się podobało.