1. Прежде чем начать
В первом практическом занятии этой серии вы создали очень простое приложение, которое использовало маркировку изображений для анализа содержимого изображения. Вы передали ему фотографию ромашки, и оно выдало вам ответ, что видит, например, лепесток или небо. Затем, во втором практическом занятии, вы перешли к Python для обучения новой, пользовательской модели, которая распознает пять различных типов цветов.
В этом практическом задании вы обновите приложение из первого задания, используя модель из второго!
Полный исходный код для этого практического занятия можно получить, клонировав этот репозиторий. Вы увидите подкаталоги для Android и iOS. Код предыдущего практического занятия доступен под названием ImageClassifierStep1, если вы хотите следовать инструкциям. Готовый код для этого практического занятия доступен под названием ImageClassifierStep2.
Предварительные требования
- Вы должны были завершить первые два практических занятия в рамках этого учебного курса.
Что вы будете создавать и чему научитесь
- Интегрируйте пользовательскую модель, обученную в предыдущей лабораторной работе, в приложение для Android или iOS.
Что вам понадобится
- Android Studio, доступная по адресу developer.android.com/studio для части лаборатории, посвященной Android.
- Для iOS-части лабораторной работы используется Xcode, доступный в Apple App Store.
2. Скачайте стартовое приложение.
Сначала вам понадобится приложение из мастер-класса «Создайте своё первое приложение для компьютерного зрения на Android или iOS». Если вы уже прошли этот мастер-класс, оно будет называться ImageClassifierStep1. Если вы не хотите проходить мастер-класс, вы можете клонировать готовую версию из репозитория.
Откройте его в Android Studio, внесите необходимые изменения, и когда всё будет готово, запустите приложение, чтобы убедиться в его работоспособности. Вы должны увидеть что-то подобное:

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

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

4. Добавьте модель TFLite.
В предыдущем практическом занятии вы создали свою собственную модель и загрузили её как файл model.tflite.
В вашем проекте найдите папку assets , в которой в данный момент находится файл flower1.jpg . Скопируйте модель в эту папку следующим образом:
- Щелкните правой кнопкой мыши папку Assets в Android Studio. В открывшемся меню выберите «Показать в Finder » («Показать в проводнике» в Windows и «Показать в файлах» в Linux).

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

В Android Studio будут отображаться оба файла в папке assets:

Теперь вы готовы обновить свой код.
5. Обновите свой код для пользовательской модели.
Первым шагом будет добавление кода для загрузки пользовательской модели.
- В файле
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)
Вам потребуется заменить это, чтобы использовать пользовательскую модель.
- Настройте пользовательский объект параметров:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
Это заменяет параметры по умолчанию на пользовательский набор. Порог достоверности устанавливает планку для качества возвращаемых прогнозов. Если вы посмотрите на пример в начале этого руководства, где изображение представляло собой ромашку, вы увидите 4 прогноза, каждый со значением рядом, например, для «Неба» значение составляло 0,7632.
Вы можете эффективно отфильтровать результаты низкого качества, используя высокий порог достоверности. Например, установив его значение равным 0,9, вы не получите ни одной метки с приоритетом ниже этого значения. Функция setMaxResultCount() полезна в моделях с большим количеством классов, но поскольку в этой модели их всего 5, вы просто оставите значение равным 5.
Теперь, когда у вас есть параметры для элемента управления метками, вы можете изменить способ его создания следующим образом:
val labeler = ImageLabeling.getClient(options)
Остальная часть вашего кода будет работать без изменений. Попробуйте!

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

Это означает, что это роза.
Вы можете задаться вопросом, почему написано «розы», а не просто «роза». Дело в том, что в наборе данных метки задаются названиями папок, и, к сожалению, эти названия папок немного непоследовательны, иногда используя единственное число (например, «ромашка»), а иногда множественное (например, «розы»). Не путайте это с попыткой модели подсчитать количество предметов на изображении — она гораздо примитивнее и может определять только типы цветов!
6. Загрузите стартовое приложение iOS.
- Сначала вам понадобится приложение из первого Codelab. Если вы уже прошли этот курс, оно будет называться ImageClassifierStep1. Если вы не хотите проходить курс, вы можете клонировать готовую версию из репозитория . Обратите внимание, что файлы pods и .xcworkspace отсутствуют в репозитории, поэтому перед переходом к следующему шагу обязательно выполните команду 'pod install' из той же директории, что и файл .xcproject.
- Откройте
ImageClassifierStep1.xcworkspaceв Xcode. Обратите внимание, что следует использовать файл .xcworkspace, а не .xcproject, поскольку вы интегрировали ML Kit с помощью Pods, и рабочая область загрузит их.
В оставшейся части этой лабораторной работы я буду запускать приложение в симуляторе iPhone, который должен поддерживать цели сборки из CodeLaub. Если вы хотите использовать своё собственное устройство, вам может потребоваться изменить цель сборки в настройках проекта в соответствии с вашей версией iOS.
Запустите программу, и вы увидите примерно следующее:

Обратите внимание на очень общие классификации – лепесток, цветок, небо. Модель, которую вы создали в предыдущем практическом задании, была обучена распознавать 5 разновидностей цветов, включая эту – ромашку.
В оставшейся части этого практического занятия вы рассмотрите, что потребуется для обновления вашего приложения с использованием пользовательской модели.
7. Используйте пользовательские модули для нанесения изображений в ML Kit.
В первом приложении использовался файл pod для получения базовых библиотек и модели ML Kit Image Labeler. Вам потребуется обновить его, чтобы использовать пользовательские библиотеки для разметки изображений.
- Найдите в каталоге вашего проекта файл с именем
podfile. Откройте его, и вы увидите что-то подобное:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- Измените объявление пода с
ImageLabelingнаImageLabelingCustomследующим образом:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- После завершения перейдите в терминале в каталог, содержащий podfile (а также .xcworkspace), и выполните команду
pod install.`.

Через несколько мгновений библиотеки MLKitImageLabeling будут удалены, а добавлены пользовательские. Теперь вы можете открыть свой файл .xcworkspace для редактирования кода.
8. Добавьте модель TFLite в Xcode.
В предыдущем практическом занятии вы создали собственную модель и загрузили её как model.tflite. Если у вас её нет под рукой, вернитесь к предыдущему практическому занятию или пройдите код Colab здесь . Если у вас нет доступа к Google Colab, блокнот доступен по этой ссылке.
- Откройте рабочую область в Xcode и перетащите файл model.tflite в свой проект. Он должен находиться в той же папке, что и остальные файлы, такие как
ViewController.swiftилиMain.storyboard. - Появится диалоговое окно с параметрами добавления файла. Убедитесь, что выбран параметр «Добавить в целевые объекты» , иначе модель не будет включена в состав приложения при его развертывании на устройстве.
Обратите внимание, что в поле «Добавить в целевые объекты» будет указано ImageClassifierStep1, если вы начали с этого шага и продолжаете выполнение этого лабораторного задания пошагово, или ImageClassifierStep2 (как показано), если вы перешли к завершенному коду.

Это позволит загрузить модель. Как это сделать, вы узнаете на следующем шаге.
9. Обновите код для пользовательской модели.
- Откройте файл
ViewController.swift. Возможно, вы увидите ошибку в строке 'import MLKitImageLabeling' в начале файла. Это связано с тем, что вы удалили универсальные библиотеки для разметки изображений при обновлении файла pod. Можете удалить эту строку и заменить её следующим содержимым:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
На первый взгляд, при беглом прочтении может показаться, что это просто повторение одного и того же кода! Но в конце есть обозначения «Common» и «Custom»!
- Далее загрузите пользовательскую модель, которую вы добавили на предыдущем шаге. Найдите функцию
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!)
- Найдите код для указания параметров для универсального класса ImageLabeler. Вероятно, он выдает ошибку, поскольку эти библиотеки были удалены:
let options = ImageLabelerOptions()
Замените этот код следующим, чтобы использовать CustomImageLabelerOptions , который указывает локальную модель:
let options = CustomImageLabelerOptions(localModel: localModel)
...и это всё! Попробуйте запустить приложение прямо сейчас! Когда вы попытаетесь классифицировать изображение, оно должно быть более точным и с высокой вероятностью покажет, что перед вами ромашка!

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

Приложение успешно определило, что это изображение соответствует метке «розы»!
10. Поздравляем!
Теперь вы перешли от создания приложения, использующего универсальную модель для распознавания содержимого изображения, к созданию собственной модели машинного обучения для распознавания конкретных объектов, таких как цветы, а затем к обновлению приложения для использования вашей пользовательской модели.
В результате получилось, конечно, очень ограниченное приложение, поскольку оно использует встроенные графические ресурсы. Однако часть, отвечающая за машинное обучение, работает хорошо. Например, вы могли бы использовать AndroidX Camera для захвата кадров из прямой трансляции и их классификации, чтобы увидеть, какие цветы распознает ваш телефон!
Отсюда открываются безграничные возможности – и если у вас есть собственные данные не только о цветах, у вас есть основа для создания приложения, которое распознает их с помощью компьютерного зрения. Это всего лишь первые шаги в гораздо более широкий мир, и я надеюсь, вам понравилось их изучать!