Истории успеха

Как компания SmileID масштабировала подтверждение личности на более чем 18 000 типов устройств Android с помощью CameraX

Время на чтение: 4 минуты
Посмотреть профиль пользователя Donovan McMurray
Donovan McMurray Developer Relations Engineer

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

Для SmileID, ведущего SDK для подтверждения личности в Африке, эта проблема усугубляется разнообразием аппаратных экосистем. На долю Android приходится 85 % целевых устройств SmileID, включая смартфоны начального уровня с процессорами низкой производительности, малоизвестные региональные модели и защищенные POS-терминалы.

harun_quote_card_green.png

До перехода на 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:

resolution_selector_diagram_vertical.png

Ниже приведен образец кода, показывающий, как можно использовать 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 % означает, что сотни тысяч добросовестных пользователей успешно проходят регистрацию, а не уходят.

juma_quote_card_blue.png

Разработчики обратили на это внимание. Простота интеграции SDK на основе CameraX привела к 15-кратному росту внедрения в первый год и 20-кратному росту во второй год. На сегодняшний день SmileID успешно обработал более 160 миллионов подтверждений личности с помощью CameraX.

Как создать историю совместимости с помощью навыка CameraX

Разрабатывать приложения для камер не так сложно, как кажется. Чтобы помочь вашей команде внедрить те же шаблоны CameraX, которые использовала SmileID, Android запустила навык CameraX для ИИ-агентов программирования. 

Когда вы используете навык CameraX в среде разработки, ИИ-агенты, такие как Gemini, применяют текущие шаблоны CameraX для переноса, привязки жизненного цикла, ConcurrentCamera и MlKitAnalyzer. Независимо от того, настраиваете ли вы видеопотоки с двух камер, предварительный просмотр с помощью PreviewView или CameraXViewfinder или анализ машинного обучения в реальном времени, навык CameraX поможет вашему агенту сгенерировать точный и готовый к использованию код.

Автор:
Продолжить чтение