Интегрируйте пользовательскую модель в свое приложение

1. Прежде чем начать

В первой Codelab из этой серии вы создали очень простое приложение, которое использовало маркировку изображений для анализа содержимого изображения. Вы передавали ему изображение ромашки, и он отвечал вам, что видел такие вещи, как лепесток или небо. Затем во второй Codelab вы переключились на Python, чтобы обучить новую, специальную модель, которая распознает пять различных типов цветов.

В этой лаборатории кода вы обновите приложение из первой лаборатории моделью из второй!

Вы можете получить полный исходный код для этой лаборатории кода, клонировав этот репозиторий. Вы увидите подкаталоги для Android и iOS. Код предыдущей кодовой лаборатории доступен как ImageClassifierStep1, если вы хотите продолжить. Готовый код этой лаборатории доступен как ImageClassifierStep2.

Предварительные условия

  • Вам необходимо выполнить первые два лабораторных задания на этом пути обучения.

Что вы построите и чему научитесь

  • Интегрируйте пользовательскую модель, обученную в предыдущей лабораторной работе, в приложение для Android или iOS.

Что вам понадобится

  • Android Studio, доступная по адресу Developer.android.com/studio для Android-части лаборатории.
  • Xcode, доступный в Apple App Store, для iOS-части лаборатории.

2. Загрузите стартовое приложение.

Сначала вам понадобится приложение из раздела «Создайте свое первое приложение компьютерного зрения на Android или iOS Codelab». Если вы прошли лабораторную работу, она будет называться ImageClassifierStep1. Если не хотите проходить лабораторию, можете клонировать готовую версию из репозитория.

Откройте его в Android Studio, выполните необходимые обновления, а когда оно будет готово, запустите приложение, чтобы убедиться, что оно работает. Вы должны увидеть что-то вроде этого:

f3703d45d1332d1d.png

Это довольно примитивное приложение, но оно демонстрирует очень мощные функциональные возможности с помощью всего лишь небольшого количества кода. Однако если вы хотите, чтобы этот цветок распознавался как ромашка, а не просто цветок, вам придется обновить приложение, чтобы оно использовало вашу пользовательскую модель из лаборатории кода «Создание пользовательской модели для классификатора изображений».

3. Обновите build.gradle для использования пользовательских моделей комплектов ML.

  1. С помощью Android Studio найдите файл build.gradle уровня приложения. Самый простой способ сделать это — в проводнике проекта. Убедитесь, что Android выбран вверху, а внизу вы увидите папку для сценариев Gradle .
  2. Откройте тот, который предназначен для модуля , указав имя вашего приложения, за которым следует «.app», как показано здесь — (Модуль: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. В нижней части файла найдите настройку зависимостей . Там вы должны увидеть эту строку:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Номер версии может быть другим. Всегда находите номер последней версии на сайте ML Kit по адресу: https://developers.google.com/ml-kit/vision/image-labeling/android .

  1. Замените это ссылкой на собственную библиотеку маркировки изображений. Номер версии можно найти по адресу: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android .
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Кроме того, вы добавите модель .tflite, созданную на предыдущем лабораторном занятии. Вы не хотите, чтобы эта модель сжималась при компиляции приложения Android Studio, поэтому обязательно используйте этот параметр в разделе Android того же файла build.gradle :
aaptOptions{
    noCompress "tflite"
}

Убедитесь, что он не находится в какой-либо другой настройке. Он должен быть вложен непосредственно под тегом android . Вот пример:

62d546bff11d2a50.png

4. Добавьте модель TFLite.

В предыдущей кодовой лаборатории вы создали свою собственную модель и загрузили ее как model.tflite.

В своем проекте найдите папку с ресурсами , которая в настоящее время содержит flower1.jpg . Скопируйте модель в эту папку следующим образом:

  1. Щелкните правой кнопкой мыши папку «Ресурсы» в Android Studio. В открывшемся меню выберите «Показать в Finder» . («Показать в проводнике» в Windows и «Показать в файлах» в Linux.)

db30b47e419a326b.png

  1. Вы попадете в каталог файловой системы. Скопируйте файл model.tflite в этот каталог вместе flower1.jpg.

36de0c51bec1c19e.png

Android Studio обновится и отобразит оба файла в папке с ресурсами:

e9f4e9f394d9b357.png

Теперь вы готовы обновить свой код.

5. Обновите свой код для пользовательской модели.

Первым шагом будет добавление кода для загрузки пользовательской модели.

  1. В файле MainActivity добавьте следующее в onCreate сразу под строкой setContentView(R.layout.activity_main) .

При этом будет использоваться LocalModel для сборки из ресурса model.tflite. Если Android Studio жалуется, окрашивая «LocalModel» в красный цвет, нажмите ALT + Enter, чтобы импортировать библиотеку. Он должен добавить для вас импорт в com.google.mlkit.common.model.LocalModel.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

Раньше в обработчике btn.setOnClickListener вы использовали модель по умолчанию. Он был настроен с помощью этого кода:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Вы замените его, чтобы использовать пользовательскую модель.

  1. Настройте объект пользовательских параметров:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

При этом параметры по умолчанию заменяются настроенным набором. Порог доверия устанавливает планку качества возвращаемых прогнозов. Если вы вернетесь к примеру в верхней части этой кодовой лаборатории, где изображением была ромашка, у вас было 4 прогноза, каждый из которых имел значение рядом с ним, например, «Небо» равно 0,7632.

Вы можете эффективно отфильтровать результаты более низкого качества, используя высокий порог достоверности. Например, установка значения 0,9 не вернет ни одной метки с приоритетом ниже этого. Метод setMaxResultCount() полезен в моделях с большим количеством классов, но поскольку в этой модели их всего 5, вы просто оставите его равным 5.

Теперь, когда у вас есть параметры для средства создания меток, вы можете изменить его создание следующим образом:

val labeler = ImageLabeling.getClient(options)

Остальная часть вашего кода будет работать без изменений. Попробуйте!

dd40c36c4edbb33.png

Здесь вы можете видеть, что этот цветок теперь был идентифицирован как маргаритка с вероятностью 0,959!

Допустим, вы добавили второе изображение цветка и повторили его:

8556a5fbea487842.png

Он идентифицирует его как розу.

Вы можете задаться вопросом, почему здесь написано « розы» , а не просто «роза». Это связано с тем, что в наборе данных метки задаются именами папок, и, к сожалению, эти имена папок немного противоречивы: иногда они используются в единственном числе (например, «ромашка»), а иногда во множественном числе (например, «розы»). Не путайте это с тем, что модель пытается подсчитать предметы на изображении – это гораздо более примитивно и может идентифицировать только типы цветов!

6. Загрузите приложение iOS Start.

  1. Сначала вам понадобится приложение из первой Codelab. Если вы прошли лабораторную работу, она будет называться ImageClassifierStep1. Если вы не хотите проходить лабораторную работу, вы можете клонировать готовую версию из репозитория . Обратите внимание, что модули pod и .xcworkspace отсутствуют в репозитории, поэтому, прежде чем перейти к следующему шагу, обязательно запустите «pod install» из того же каталога, что и .xcproject.
  2. Откройте ImageClassifierStep1.xcworkspace в Xcode. Обратите внимание, что вам следует использовать .xcworkspace, а не .xcproject, поскольку вы связали ML Kit с помощью модулей, и рабочая область будет их загружать.

В оставшейся части лабораторной работы я буду запускать приложение в симуляторе iPhone, которое должно поддерживать цели сборки из лаборатории кода. Если вы хотите использовать собственное устройство, вам может потребоваться изменить цель сборки в настройках проекта, чтобы она соответствовала вашей версии iOS.

Запустите его, и вы увидите что-то вроде этого:

9e151ed18f99fb98.png

Обратите внимание на очень общие классификации – лепесток, цветок, небо. Модель, которую вы создали в предыдущей лаборатории, была обучена обнаруживать 5 разновидностей цветов, включая этот — ромашку.

В оставшейся части этой лаборатории вы увидите, что потребуется для обновления вашего приложения с помощью пользовательской модели.

7. Используйте специальные модули маркировки изображений в наборе ML

Первое приложение использовало файл pod для получения базовых библиотек и модели ML Kit Image Labeler. Вам потребуется обновить его, чтобы использовать пользовательские библиотеки маркировки изображений.

  1. Найдите файл с именем podfile в каталоге вашего проекта. Откройте его, и вы увидите что-то вроде этого:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Измените объявление модуля с ImageLabeling на ImageLabelingCustom , например:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. Когда вы закончите, используйте терминал, чтобы перейти к каталогу, содержащему подфайл (а также .xcworkspace), и запустите pod install .

bb5d78eb7c7ab975.png

Через несколько секунд библиотеки MLKitImageLabeling будут удалены и добавлены пользовательские. Теперь вы можете открыть свое .xcworkspace и отредактировать свой код.

8. Добавьте модель TFLite в Xcode.

В предыдущей лаборатории вы создали собственную модель и загрузили ее как model.tflite. Если у вас его нет под рукой, вернитесь и запустите эту кодовую лабораторию или просмотрите код совместной работы здесь . Если у вас нет доступа к Google Colab, блокнот доступен по этой ссылке.

  1. Открыв рабочую область в Xcode, перетащите model.tflite в свой проект. Он должен находиться в той же папке, что и остальные ваши файлы, такие как ViewController.swift или Main.storyboard .
  2. Появится диалоговое окно с опциями добавления файла. Убедитесь, что выбран параметр «Добавить к целям» , иначе модель не будет связана с приложением при его развертывании на устройстве.

Обратите внимание, что запись «Добавить к целям» будет иметь ImageClassifierStep1, если вы начали с него и продолжаете выполнять эту лабораторную работу шаг за шагом, или ImageClassifierStep2 (как показано), если вы перешли к готовому коду.

5b6a7f40c73f0f1f.png

Это гарантирует, что вы сможете загрузить модель. Вы увидите, как это сделать, на следующем шаге.

9. Обновите свой код для пользовательской модели.

  1. Откройте файл ViewController.swift . Вы можете увидеть ошибку в импорте MLKitImageLabeling в верхней части файла. Это связано с тем, что вы удалили общие библиотеки маркировки изображений при обновлении файла модуля. Не стесняйтесь удалить эту строку и обновить, добавив следующее:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Может быть, легко прочитать их быстро и подумать, что они повторяют один и тот же код! Но в конце концов это «Обычный» и «Пользовательский»!

  1. Далее вы загрузите пользовательскую модель, добавленную на предыдущем шаге. Найдите функцию getLabels() . Под строкой visionImage.orientation = image.imageOrientation добавьте следующие строки:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Найдите код для указания параметров универсального ImageLabeler. Вероятно, это выдает ошибку, поскольку эти библиотеки были удалены:
let options = ImageLabelerOptions()

Замените его этим кодом, чтобы использовать CustomImageLabelerOptions и который определяет локальную модель:

let options = CustomImageLabelerOptions(localModel: localModel)

... и все! Попробуйте запустить приложение прямо сейчас! Когда вы попытаетесь классифицировать изображение, оно должно быть более точным и с высокой вероятностью сообщать вам, что вы смотрите на ромашку!

238cd21748a97cf4.png

Допустим, вы добавили второе изображение цветка и повторили его:

75f3970a6b509bfe.png

Приложение успешно обнаружило, что это изображение соответствует ярлыку «розы»!

10. Поздравляем!

Теперь вы прошли путь от создания приложения, использующего общую модель для распознавания содержимого изображения, до создания собственной модели машинного обучения для распознавания конкретных объектов, например цветов, а затем обновили свое приложение для использования собственной модели.

Полученное в результате приложение, конечно же, очень ограничено, поскольку оно опирается на встроенные графические ресурсы. Однако часть ML работает хорошо. Например, вы можете использовать AndroidX Camera, чтобы снимать кадры из прямой трансляции и классифицировать их, чтобы увидеть, какие цветы распознает ваш телефон!

Отсюда возможности безграничны — и если у вас есть собственные данные о чем-то другом, кроме цветов, у вас есть основа того, что вам нужно для создания приложения, которое распознает их с помощью компьютерного зрения. Это всего лишь первые несколько шагов в гораздо более широкий мир, и, надеюсь, вам понравилось их делать!