Casos de éxito

Cómo SmileID escaló la verificación de identidad a más de 18,000 tipos de dispositivos Android con CameraX

Lectura de 4 min
Ver el perfil de Donovan McMurray
Donovan McMurray Ingeniero de relaciones con desarrolladores

Las apps de verificación de identidad para la banca y el registro de tarjetas SIM requieren capturas de rostros nítidas y de alta resolución para detectar suplantaciones de identidad y deepfakes. Capturar fotogramas lo suficientemente nítidos para las verificaciones de detección de vida y de suplantación de identidad, sin que se produzcan fallas en los dispositivos con poca memoria, es un desafío común para los desarrolladores de cámaras de Android.

Para SmileID, un SDK de verificación de identidad líder en África, este desafío se duplica debido a un ecosistema de hardware diverso. Android representa el 85% de la participación de mercado de dispositivos de destino de SmileID, incluidos los smartphones de nivel básico con procesadores muy limitados, los modelos regionales poco conocidos y las terminales de punto de venta (PdV) personalizadas y resistentes.

harun_quote_card_green.png

Antes de adoptar CameraX, SmileID enfrentó obstáculos de ingeniería de cámara estándar, pero abrumadores: feeds de vista previa estirados, orientaciones de sensores rotadas, fallas por falta de memoria (OOM) y errores personalizados del fabricante de equipos originales (OEM). Con la migración de sus SDKs de Android principales a CameraX, SmileID transformó estos desafíos en una gran ventaja empresarial.

Según SmileID, la migración de sus SDKs de Android a CameraX generó los siguientes resultados:

MétricaImpacto de la migración a CameraX
Crecimiento de la adopción del SDK20 veces más para el año 2 (en comparación con las 2 o 3 veces más antes de CameraX)
Tasas de aprobación de la verificaciónAumento del 20% para las apps que usan los SDK de SmileID
Resolución de capturaAumento de 4 veces en los píxeles de selfies y pruebas de vida sin sobrecarga de red
Compatibilidad con modelos de dispositivosMás de 18,000 tipos de dispositivos Android compatibles
Total de verificaciones escaladasSe procesaron más de 160 millones de verificaciones de identidad

El desafío: Hardware fragmentado y problemas con las APIs heredadas

Para confirmar que un usuario es quien dice ser, el SDK de SmileID debe capturar fotogramas de selfies de alta resolución para realizar verificaciones de actividad integradas en el dispositivo y detectar deepfakes basados en la nube. 

En las implementaciones de las APIs de Camera1 heredada y Camera2 de bajo nivel, lograr esto de manera coherente era difícil por varios motivos: 

  • Personalizaciones y peculiaridades de los OEM: Los dispositivos de diferentes fabricantes informaban las orientaciones físicas del sensor de la cámara de manera diferente, lo que generaba vistas previas rotadas o capturas de rostros con una orientación incorrecta.
  • Distorsiones de la relación de aspecto: Solicitar un tamaño de fotograma específico en dispositivos económicos suele provocar que la vista previa de la cámara se estire vertical u horizontalmente, lo que distorsiona el rostro del usuario y hace que la verificación biométrica sea inútil.
  • Fallas por falta de memoria (OOM): El procesamiento de imágenes sin procesar de alta resolución en dispositivos con poca RAM (a menudo, 1 GB o menos) generaba fallas fatales de asignación de memoria.

Debido a estos puntos de fricción, el crecimiento interanual de la adopción del SDK de SmileID se limitó a 2 o 3 veces, y muchas verificaciones tuvieron que recurrir a la carga de fotos estáticas a través de una API de REST de alta latencia en lugar de ejecutar verificaciones de actividad integrado en el dispositivo en tiempo real.

La solución: Canalizaciones coherentes con CameraX 

SmileID rediseñó sus SDK para dispositivos móviles desde cero con CameraX, que se creó específicamente para abstraer la complejidad del ecosistema de dispositivos subyacente y proporcionar una interfaz de desarrollador coherente y compatible con el ciclo de vida nativo.

Con los casos de uso principales de CameraX (específicamente, Preview y ImageAnalysis), SmileID creó una canalización de cámara sólida y de doble propósito:

  • Vista previa: Renderiza una vista previa en tiempo real y con proporciones perfectas del feed de la cámara para guiar al usuario.
  • ImageAnalysis: Procesa de forma continua los fotogramas de manera local y en tiempo real para ejecutar la detección automatizada de la prueba de vida y del rostro en el fotograma, y extraer el fotograma de la selfie verificada.

Para capturar detalles ultra nítidos para la detección de deepfakes sin causar fallas de OOM, SmileID agregó la moderna API ResolutionSelector de CameraX directamente a su configuración de ImageAnalysis. Permite que los desarrolladores soliciten una resolución de destino y elijan una regla de resguardo cuando un dispositivo no admita ese tamaño exacto. Por ejemplo, el siguiente diagrama y la configuración de ejemplo ilustran cómo ResolutionSelector evalúa los tamaños candidatos en torno a un objetivo de 1200 x 900:

resolution_selector_diagram_vertical.png

Aquí tienes el código de muestra correspondiente que indica cómo vincular ResolutionSelector con STRATEGY_KEEP_ONLY_LATEST en tu propia app (usa FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER para priorizar la nitidez o FALLBACK_RULE_CLOSEST_LOWER_THEN_HIGHER para limitar el uso de memoria):

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
    }
}

Solicitando fotogramas de píxeles de alta densidad y procesándolos de forma local, SmileID logró un aumento de 4 veces en la resolución de las selfies capturadas. SmileID también comprimió la región recortada del rostro en el dispositivo para que el tamaño de carga de la red fuera idéntico al de su sistema anterior. Esta arquitectura garantizó datos más precisos para sus modelos de aprendizaje automático sin aumentar los costos de datos móviles para sus usuarios.

Cómo CameraX resuelve las diferencias de hardware

La estandarización en CameraX significó que SmileID podía confiar en dos capas de ingeniería de compatibilidad para mantener su SDK estable en todos los dispositivos:

1. Laboratorio de pruebas de cámara y contenido multimedia de Google

La compatibilidad de CameraX está respaldada por una verificación continua del hardware físico. En el Laboratorio de pruebas de contenido multimedia y cámara exclusivo de Google, se ejecuta un paquete de pruebas automatizado todos los días en una matriz rotativa masiva de más de 190 modelos de dispositivos Android físicos. Esto incluye dispositivos que representan diferentes chipsets, versiones de SO y capacidades de hardware. 

Para avanzar hacia un comportamiento más coherente en los dispositivos populares, el Lab de pruebas de cámara y contenido multimedia de Google detecta automáticamente las regresiones de la biblioteca antes de que puedan afectar tu código de producción.

2. Soluciones automáticas para peculiaridades de los dispositivos

Los diferentes dispositivos Android tienen distintas limitaciones físicas. Es posible que algunos no puedan establecer parámetros de configuración de exposición personalizados, mientras que otros podrían informar datos de imágenes invertidos cuando se usan ciertas relaciones de aspecto. Para evitar que los desarrolladores contaminen sus bases de código con bloques condicionales complejos basados en el fabricante y el modelo del dispositivo, CameraX mantiene clases internas de peculiaridades de dispositivos, como DeviceQuirks y CameraQuirks, en camera-camera2 (DeviceQuirksLoader.kt). Cuando CameraX detecta un dispositivo con un problema conocido, inserta automáticamente una solución alternativa personalizada. Para SmileID, esto significó que su SDK pudiera funcionar de manera confiable en más de 18,000 tipos de dispositivos Android sin necesidad de parches específicos para cada dispositivo en su base de código.

Escalamiento de hasta más de 160 millones de verificaciones

Con la migración a CameraX, SmileID simplificó la integración del SDK para los desarrolladores de apps externos. 

La eliminación de las distorsiones de la relación de aspecto, las vistas previas lentas y las fallas repentinas por falta de memoria generó un aumento del 20% en las tasas de aprobación de la verificación para los servicios que usan sus SDK. Para las instituciones financieras y las apps de dinero móvil de África, un aumento del 20% en las tasas de aprobación significa que cientos de miles de usuarios legítimos se incorporan correctamente en lugar de abandonar el servicio.

juma_quote_card_blue.png

Los desarrolladores tomaron nota. La facilidad de integrar el SDK basado en CameraX generó un aumento de 15 veces en la adopción durante el primer año, que ascendió a 20 veces en el segundo año. Hasta la fecha, SmileID procesó correctamente más de 160 millones de verificaciones de identidad con CameraX.

Crea tu historia de compatibilidad con la habilidad de CameraX

El desarrollo para cámaras no tiene por qué ser difícil. Para ayudar a tu equipo a adoptar los mismos patrones de CameraX que usó SmileID, Android lanzó la habilidad de CameraX para agentes de programación de IA. 

Cuando usas la habilidad de CameraX en tu entorno de desarrollo, los agentes de programación de IA, como Gemini, aplican los patrones actuales de CameraX para la migración, la vinculación del ciclo de vida, ConcurrentCamera y MlKitAnalyzer. Ya sea que configures feeds de cámara dual, una vista previa con PreviewView o CameraXViewfinder, o que administres análisis de aprendizaje automático (AA) en tiempo real, la habilidad de CameraX guía a tu agente para que genere código preciso y listo para producción.

Escrito por:
Seguir leyendo