Как компания SmileID масштабировала подтверждение личности на более чем 18 000 типов устройств Android с помощью CameraX
Время на чтение: 4 минуты
Приложениям для подтверждения личности, которые используются в банковской сфере и при регистрации SIM-карт, требуются четкие снимки лица в высоком разрешении, чтобы обнаруживать спуфинг и дипфейки. Разработчики приложений для камер Android часто сталкиваются с проблемой: как сделать кадры достаточно четкими для проверки на присутствие и защиты от спуфинга, не вызывая сбоев на устройствах с малым объемом памяти.
Для SmileID, ведущего SDK для подтверждения личности в Африке, эта проблема усугубляется разнообразием аппаратных экосистем. На долю Android приходится 85 % целевых устройств SmileID, включая смартфоны начального уровня с процессорами низкой производительности, малоизвестные региональные модели и защищенные POS-терминалы.
До перехода на CameraX разработчики SmileID сталкивались со стандартными, но сложными проблемами: растянутым изображением в окне предпросмотра, неправильной ориентацией датчиков, сбоями из-за нехватки памяти и ошибками, связанными с производителями оригинального оборудования. Переход на CameraX позволил SmileID превратить эти проблемы в конкурентное преимущество.
По данным SmileID, переход на CameraX в Android SDK привел к следующим результатам:
| Показатель | Влияние перехода на CameraX |
|---|---|
| Рост внедрения SDK | В 20 раз за два года (до CameraX – в 2–3 раза) |
| Доля успешных проверок | На 20 % увеличилось количество приложений, использующих SDK от SmileID |
| Разрешение записи | В четыре раза больше пикселей в селфи и видео без дополнительной нагрузки на сеть. |
| Совместимость моделей устройств | Поддерживается более 18 000 типов устройств Android |
| Общее количество взвешенных проверок | Более 160 миллионов подтверждений личности |
Проблема: фрагментация оборудования и устаревший API
Чтобы подтвердить личность пользователя, SDK SmileID должен сделать селфи в высоком разрешении для проверки на устройстве и облачного обнаружения дипфейков.
При использовании устаревшего API Camera1 и низкоуровневого API Camera2 добиться этого было сложно по нескольким причинам:
- Особенности устройств разных производителей. Устройства разных производителей по-разному сообщали о физической ориентации датчика камеры, что приводило к повороту изображений в предварительном просмотре или неправильной ориентации снимков лица.
- Искажение соотношения сторон. Запрос определенного размера кадра на бюджетных устройствах часто приводил к растягиванию изображения с камеры по вертикали или горизонтали, искажая лицо пользователя и делая биометрическую проверку бесполезной.
- Сбои из-за нехватки памяти. Обработка необработанных изображений с высоким разрешением на устройствах с небольшим объемом ОЗУ (часто 1 ГБ или меньше) часто приводила к критическим сбоям распределения памяти.
Из-за этих проблем годовой рост внедрения SDK SmileID был ограничен в 2–3 раза, и во многих случаях вместо проверки в реальном времени на устройстве приходилось загружать статические фотографии через REST API с высокой задержкой.
Решение: согласованные конвейеры с CameraX
Разработчики SmileID полностью переписали свои мобильные SDK, используя CameraX. Эта библиотека была создана специально для того, чтобы абстрагироваться от сложности экосистемы устройств и предоставить разработчикам согласованный интерфейс, учитывающий жизненный цикл.
Используя основные сценарии CameraX (в частности, Preview и ImageAnalysis), разработчики SmileID создали надежный конвейер камеры двойного назначения:
- Предпросмотр. Показывает пользователю видеопоток с камеры в реальном времени с правильными пропорциями.
- ImageAnalysis. Непрерывно обрабатывает кадры локально в реальном времени, чтобы автоматически определять, что перед камерой живой человек и его лицо находится в кадре, а также извлекать кадр для подтверждения личности.
Чтобы получать сверхчеткие изображения для обнаружения дипфейков и не вызывать сбои из-за нехватки памяти, разработчики SmileID добавили современный API ResolutionSelector из CameraX прямо в конфигурацию ImageAnalysis. Разработчики могут запрашивать целевое разрешение и выбирать резервное правило на случай, если устройство не поддерживает нужный размер. Например, на следующей диаграмме и в примере конфигурации показано, как ResolutionSelector оценивает размеры-кандидаты вокруг целевого размера 1200x900:
Ниже приведен образец кода, показывающий, как можно использовать ResolutionSelector с STRATEGY_KEEP_ONLY_LATEST в вашем приложении (используйте FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER, чтобы повысить резкость, или FALLBACK_RULE_CLOSEST_LOWER_THEN_HIGHER, чтобы ограничить использование памяти):
import android.util.Size import androidx.camera.core.CameraSelector import androidx.camera.core.ImageAnalysis import androidx.camera.core.Preview import androidx.camera.core.resolutionselector.AspectRatioStrategy import androidx.camera.core.resolutionselector.ResolutionSelector import androidx.camera.core.resolutionselector.ResolutionStrategy import androidx.camera.lifecycle.ProcessCameraProvider import androidx.lifecycle.LifecycleOwner fun configureCameraX(cameraProvider: ProcessCameraProvider, lifecycleOwner: LifecycleOwner, surfaceProvider: Preview.SurfaceProvider, executor: java.util.concurrent.Executor, analyzer: ImageAnalysis.Analyzer) { // 1. Define a resolution strategy requesting high quality (for example, 1200x900px) // and selecting the closest higher (or, if unavailable, lower) resolution. val resolutionSelector = ResolutionSelector.Builder() .setResolutionStrategy( ResolutionStrategy( Size(1200, 900), ResolutionStrategy.FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER ) ) .setAspectRatioStrategy(AspectRatioStrategy.RATIO_4_3_FALLBACK_AUTO_STRATEGY) .build() // 2. Configure the ImageAnalysis use case with the resolution selector // and a backpressure strategy that keeps the UI responsive on slow processors. val imageAnalysis = ImageAnalysis.Builder() .setResolutionSelector(resolutionSelector) // Drops older frames if the device's CPU is still busy analyzing the previous one .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() // 3. Set up the preview stream and attach the Analyzer and SurfaceProvider imageAnalysis.setAnalyzer(executor, analyzer) val preview = Preview.Builder().build().also { it.surfaceProvider = surfaceProvider } // 4. Bind both use cases concurrently to the lifecycle provider try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle( lifecycleOwner, CameraSelector.DEFAULT_FRONT_CAMERA, preview, imageAnalysis ) } catch (exc: Exception) { // Handle binding failure safely } }
Запрашивая кадры с высокой плотностью пикселей и обрабатывая их локально, SmileID удалось в четыре раза повысить разрешение селфи. SmileID также сжимает обрезанное изображение лица на устройстве, поэтому размер загружаемого файла остался таким же, как и в предыдущей системе. Такая архитектура позволила получать более точные данные для моделей машинного обучения без увеличения расходов пользователей на мобильный интернет.
Как CameraX решает проблему различий в аппаратном обеспечении
Переход на CameraX позволил SmileID использовать два уровня совместимости, чтобы обеспечить стабильную работу SDK на разных устройствах:
1. Google's Camera and Media Test Lab
Совместимость CameraX подтверждается непрерывной физической проверкой оборудования. В специальной лаборатории Google по тестированию камер и медиа ежедневно запускается автоматизированный набор тестов на огромной, постоянно меняющейся матрице, состоящей из более чем 190 физических моделей устройств Android. с разными наборами микросхем, версиями ОС и аппаратными возможностями.
Чтобы обеспечить более стабильную работу на популярных устройствах, лаборатория тестирования камер и медиа Google автоматически выявляет регрессии библиотек до того, как они могут повлиять на ваш рабочий код.
2. Автоматические обходные решения для проблем с устройствами
У разных устройств Android разные физические ограничения. Например, в некоторых случаях не удается задать пользовательские настройки экспозиции, а в других – при использовании определенных соотношений сторон могут быть инвертированы данные изображения. Чтобы разработчикам не приходилось добавлять в код сложные условные блоки, зависящие от производителя и модели устройства, в CameraX есть внутренние классы для устранения неполадок, например DeviceQuirks и CameraQuirks в camera-camera2 (DeviceQuirksLoader.kt). Когда CameraX обнаруживает устройство с известной проблемой, она автоматически применяет специальное решение. Для SmileID это означало, что их SDK мог надежно работать на более чем 18 000 типах устройств Android без необходимости вносить исправления для конкретных устройств в базу кода.
Масштабирование до 160 миллионов проверок
Переход на CameraX упростил интеграцию SDK для сторонних разработчиков приложений.
Устранение искажений соотношения сторон, задержек в предварительном просмотре и внезапных сбоев из-за нехватки памяти привело к увеличению на 20 % показателей прохождения проверки для сервисов, использующих SDK. Для финансовых учреждений и мобильных платежных приложений в Африке увеличение доли успешных проверок на 20 % означает, что сотни тысяч добросовестных пользователей успешно проходят регистрацию, а не уходят.
Разработчики обратили на это внимание. Простота интеграции SDK на основе CameraX привела к 15-кратному росту внедрения в первый год и 20-кратному росту во второй год. На сегодняшний день SmileID успешно обработал более 160 миллионов подтверждений личности с помощью CameraX.
Как создать историю совместимости с помощью навыка CameraX
Разрабатывать приложения для камер не так сложно, как кажется. Чтобы помочь вашей команде внедрить те же шаблоны CameraX, которые использовала SmileID, Android запустила навык CameraX для ИИ-агентов программирования.
Когда вы используете навык CameraX в среде разработки, ИИ-агенты, такие как Gemini, применяют текущие шаблоны CameraX для переноса, привязки жизненного цикла, ConcurrentCamera и MlKitAnalyzer. Независимо от того, настраиваете ли вы видеопотоки с двух камер, предварительный просмотр с помощью PreviewView или CameraXViewfinder или анализ машинного обучения в реальном времени, навык CameraX поможет вашему агенту сгенерировать точный и готовый к использованию код.
- Изучите навык CameraX. Перейдите в каталог навыков для разработчиков Android или выполните команду
android skills add cameraxв Android CLI, чтобы добавить навык в свой ИИ-инструмент для программирования. - Начните работу с CameraX. Ознакомьтесь с официальной документацией по CameraX и сделайте так, чтобы камера работала на любом устройстве.
-
Истории успехаGrab – ведущее суперприложение в Юго-Восточной Азии, которое предлагает услуги доставки, мобильности и финансовые услуги миллионам пользователей в восьми странах.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • Время на чтение: 5 минут -
Истории успехаКоманда создала базу кода для ИИ-интерфейса, которая на 50 % меньше исходной. При этом время выполнения ИИ-агента сократилось на 35 %, количество обменов между инженером и агентом – на 32 %, а стоимость токенов – на 33 %.
Pavlo Stavytskyi, Rebecca Franks • Время на чтение: 11 минут -
Истории успехаWhatsApp – крупнейшая в мире платформа для обмена сообщениями, которой пользуются миллиарды людей по всему миру. Это стандартный инструмент для общения, который позволяет пользователям из разных регионов обмениваться сообщениями в конфиденциальной, надежной и безопасной среде.
Niharika Arora, Tracy Agyemang, Mayank Jain • Чтение займет 8 минут
Получайте еженедельную рассылку с последними новостями о разработке для Android.