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

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

Для разработчиков Android это всегда было серьезной проблемой, так как официальная библиотека камеры немного запуталась. Он включает в себя много шаблонного кода только для добавления основных функций камеры, что не только подавляет, но и добавляет много запаха кода, что затрудняет его обслуживание. Хотя доступно множество достойных сторонних библиотек (например, CameraView), официального пакета от Google нет.

К счастью, команда Android Jetpack Components недавно анонсировала CameraX, который, пока еще находится в альфа-версии, не только должен исправить все проблемы, с которыми сталкивается Camera2 API. , но он также добавляет функции, специально предназначенные для разработчиков, использующих его с такими библиотеками, как Firebase ML Kit, которые помогают разработчикам внедрять функции машинного обучения в свои приложения.

Давайте посмотрим на внутреннее устройство этой библиотеки и узнаем, как мы можем воссоздать приложение Google Lens с помощью CameraX.

Шаг 1: Создание нового проекта и добавление зависимости CameraX

После того, как вы создали новый проект, следующим шагом будет добавление следующих зависимостей в build.gradle файл вашего приложения:

Примечание. CameraX поддерживает только приложения с minSdk 21 и выше, поэтому убедитесь, что ваш minSdk не меньше 21, чтобы CameraX работала!

Шаг 2. Добавление камеры в XML-макет и просмотр превью

Добавьте этот блок кода в действие, в котором вы хотите, чтобы был показан предварительный просмотр камеры. CameraX использует TextureView для предварительного просмотра камеры.

Шаг 3. Запросите разрешения для камеры

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



Для нашего варианта использования нам необходимо запросить у пользователя следующие разрешения:

<uses-permission android:name="android.permission.CAMERA" />

Шаг 4. Напишите код для отображения предварительного просмотра

Затем нам нужно написать логику в нашем файле активности, которая фактически заполняет предварительный просмотр в TextureView, который мы добавили ранее:

Приведенный выше код изолирует всю логику камеры в метод startCamera(), который по существу добавляет слушателя к TextureView, и каждый раз, когда он вызывается, он выполняет следующие действия:

  1. Удаляет существующий предварительный просмотр, прикрепленный к TextureView
  2. Захватывает новый предварительный просмотр
  3. Добавляет новый предварительный просмотр в TextureView

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

Шаг 5. Добавьте логику обработки изображений в свое приложение.

CameraX содержит интерфейс под названием ImageAnalysis.Analyzer, который мы можем реализовать для создания нового собственного класса, который обрабатывает всю логику, которую вам необходимо выполнить с захваченным изображением.
В этой статье мы используем Firebase MLKit для извлечения меток из захваченное изображение.

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

Предполагая, что мы пытаемся воссоздать приложение Google Lens, мы создадим собственный класс под названием GoogleLensAlayzer, который будет реализовывать интерфейс ImageAnalysis.Analyzer.

Здесь мы получаем доступ к облачному этикетировщику и обнаруживаем ярлыки на предоставленном изображении.

Шаг 6: Связываем все вместе

Наконец, нам нужно сообщить нашему TextureView, что мы собираемся использовать класс GoogleLensAnalyzer для обработки изображения.

Для этого мы изменим нашу startCamera() функцию следующим образом:

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

Чтобы закончить, нам нужно обновить метод CameraX.bindToLifecycle() следующим образом:

CameraX.bindToLifecycle(this, preview, googleLensAnalyzer)

После этого CameraX должен начать анализ изображения по мере его наведения на различные объекты.

Вот как должно выглядеть приложение после того, как вы выполните все описанные выше действия:

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

Уменьшение частоты анализа изображения (необязательно)

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

Чтобы исправить это и увеличить это время до одного раза в секунду, мы обновим метод analyze() в классе GoogleLensAnalyzer следующим образом:

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

Вот и все!

Обратите внимание, что эта библиотека все еще находится в альфа-версии, и по мере перехода библиотеки к стабильной версии будут добавлены дополнительные функции.

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



Заключительные примечания

Несмотря на то, что библиотека не так удобна или проста в реализации, как некоторые сторонние альтернативы CameraView, это долгожданное дополнение, особенно по сравнению со старым Camera2 API.

Команда CameraX приветствует предложения разработчиков по системе отслеживания проблем AOSP, которые помогут им улучшить библиотеку.

Спасибо за внимание! Если вам понравилась эта история, пожалуйста, нажмите 👏 кнопку и поделитесь, чтобы помочь другим найти ее! Не стесняйтесь оставлять комментарии 💬 ниже.

Есть отзывы? Давайте подключимся в Твиттере.

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

Являясь независимой редакцией, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.