事例紹介

SmileID が CameraX を使用して 18,000 種類以上の Android デバイスに本人確認を拡張した方法

所要時間: 4 分
Donovan McMurray さんのプロフィールを表示
Donovan McMurray デベロッパー リレーションズ エンジニア

銀行や SIM 登録用の本人確認アプリでは、なりすましやディープフェイクを検出するために、鮮明で高解像度の顔画像が必要です。ライブネス チェックやなりすまし防止チェックに十分な鮮明さのフレームを、メモリの少ないデバイスをクラッシュさせることなくキャプチャすることは、Android カメラ デベロッパーにとって共通の課題です。

アフリカを代表する本人確認 SDK である SmileID にとって、この課題は多様なハードウェア エコシステムによってさらに複雑になっています。Android は、SmileID の対象デバイスのマーケット シェアの 85% を占めています。これには、プロセッサが非常に制限されたエントリーレベルのスマートフォン、あまり知られていない地域モデル、堅牢なカスタム POS 端末が含まれます。

harun_quote_card_green.png

CameraX を導入する前、SmileID は、プレビュー フィードの引き伸ばし、センサーの向きの回転、メモリ不足(OOM)によるクラッシュ、相手先ブランド製品製造企業(OEM)のカスタムバグなど、カメラ エンジニアリングにおける標準的でありながら困難なハードルに直面していました。SmileID は、コア Android SDK を CameraX に移行することで、これらの課題を大きなビジネス上のメリットに変えました。

SmileID によると、Android SDK を CameraX に移行したことで、次のような結果が得られました。

指標CameraX 移行の影響
SDK 導入数の増加2 年目までに 20 倍(CameraX 導入前は 2 ~ 3 倍)
確認の合格率SmileID の SDK を使用しているアプリで 20% 増加
キャプチャ解像度ネットワーク オーバーヘッドなしで、自撮り写真 / ライブネスのピクセル数が 4 倍に増加
デバイスモデルの互換性18,000 種類以上の Android デバイスをサポート
拡大された確認の総数1 億 6,000 万件以上の本人確認を処理

課題: ハードウェアの断片化とレガシー API の問題

ユーザーが本人であることを確認するために、SmileID の SDK は、デバイス上のライブネス チェックとクラウドベースのディープフェイク検出のために、高解像度の自撮りフレームをキャプチャする必要があります。

従来の Camera1 と低レベルの Camera2 API の実装では、いくつかの理由から、これを一貫して実現することは困難でした。

  • OEM のカスタマイズと不具合: メーカーによって、デバイスが報告する物理的なカメラセンサーの向きが異なり、プレビューが回転したり、顔のキャプチャの向きが間違ったりしていました。
  • アスペクト比の歪み: 低価格帯のデバイスで特定のフレームサイズをリクエストすると、カメラのプレビューが縦または横に引き伸ばされ、ユーザーの顔が歪んで生体認証が機能しなくなることがよくありました。
  • メモリ不足(OOM)によるクラッシュ: RAM が少ない(多くの場合 1 GB 以下)デバイスで高解像度の RAW 画像を処理すると、メモリ割り当ての致命的なクラッシュが頻繁に発生していました。

これらの摩擦点により、SmileID の SDK 導入の前年比成長率は 2 ~ 3 倍にとどまり、多くの検証では、リアルタイムのオンデバイス ライブネス チェックを実行する代わりに、高レイテンシの REST API を介して静止写真をアップロードする必要がありました。

解決策: CameraX による一貫したパイプライン

SmileID は、CameraX を使用してモバイル SDK をゼロから再設計しました。CameraX は、基盤となるデバイス エコシステムの複雑さを抽象化し、一貫性のあるネイティブなライフサイクル認識デベロッパー インターフェースを提供するように特別に構築されています。

SmileID は、CameraX のコア ユースケース(具体的には Preview と ImageAnalysis)を使用して、堅牢なデュアルパーパス カメラ パイプラインを構築しました。

  • プレビュー: カメラフィードのリアルタイム プレビューを適切な比率でレンダリングし、ユーザーをガイドします。
  • ImageAnalysis: ローカルでフレームをリアルタイムで継続的に処理し、自動化されたライブネス検出とフレーム内顔検出を実行して、検証済みの自撮りフレームを抽出します。

SmileID は、OOM クラッシュを引き起こすことなく、ディープフェイク検出のために非常に鮮明な詳細をキャプチャできるよう、CameraX の最新の ResolutionSelector API を 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 は撮影した自撮り写真の解像度を 4 倍に高めることに成功しました。SmileID は、切り抜いた顔領域をデバイス上で圧縮することで、ネットワーク アップロード サイズを以前のシステムと同じに保ちました。このアーキテクチャにより、ユーザーのモバイルデータ通信コストを増やすことなく、ML モデルのデータをより鮮明にすることができました。

CameraX がハードウェアの違いを解決する方法

CameraX を標準として採用したことで、SmileID は 2 つのレイヤの互換性エンジニアリングを利用して、デバイス間で SDK の安定性を維持できるようになりました。

1. Google のカメラおよびメディアテストラボ

CameraX の互換性は、継続的な物理ハードウェア検証によって裏付けられています。Google の専用のカメラとメディアのテストラボでは、190 以上の Android デバイスモデルの膨大なローテーション マトリックス全体で、自動テストスイートが毎日実行されています。これには、さまざまなチップセット、OS バージョン、ハードウェア機能を備えたデバイスが含まれます。

一般的なデバイス間で動作の一貫性を高めるため、Google の Camera and Media Test Lab は、ライブラリの回帰が本番環境のコードに影響する前に自動的に検出します。

2. デバイスの不具合に対する自動回避策

Android デバイスによって物理的な制限は異なります。カスタム露出設定を設定できない場合や、特定のアスペクト比を使用すると画像データが反転して表示される場合があります。デベロッパーがデバイスのメーカーやモデルに基づいて複雑な条件ブロックをコードベースに追加するのを防ぐため、CameraX は、camera-camera2(DeviceQuirksLoader.kt)で DeviceQuirks や CameraQuirks などの内部デバイス クアーク クラスを維持しています。CameraX は、既知の問題があるデバイスを検出すると、カスタマイズされた回避策を自動的に挿入します。SmileID の場合、SDK が 18,000 種類以上の Android デバイスで確実に動作し、コードベースにデバイス固有のパッチを適用する必要がなくなりました。

1 億 6,000 万件以上の検証にスケールアップ

CameraX に移行することで、SmileID は外部アプリ デベロッパー向けの SDK 統合を簡素化しました。

アスペクト比の歪み、プレビューの遅延、突然の OOM クラッシュを排除したことで、SDK を使用するサービスの検証合格率が 20% 向上しました。アフリカ全土の金融機関やモバイルマネー アプリにとって、合格率が 20% 向上するということは、何十万人もの正規ユーザーが離脱することなく、オンボーディングに成功することを意味します。

juma_quote_card_blue.png

デベロッパーはこれに注目しました。CameraX ベースの SDK は統合が容易なため、最初の 1 年で導入数が 15 倍に急増し、2 年目には 20 倍に達しました。SmileID はこれまでに、CameraX を使用して 1 億 6, 000 万件以上の本人確認を処理しています。

CameraX スキルで互換性ストーリーを構築する

カメラ向けの開発は、必ずしも難しいものではありません。SmileID が使用したのと同じ CameraX パターンをチームが採用できるように、Android は AI コーディング エージェント向けの CameraX Skill をリリースしました。

開発環境で CameraX Skill を使用すると、Gemini などの AI コーディング エージェントが、移行、ライフサイクル バインディング、ConcurrentCamera、MlKitAnalyzer に現在の CameraX パターンを適用します。デュアルカメラ フィードの設定、PreviewView または CameraXViewfinder を使用したプレビューの設定、リアルタイムの ML 分析の管理など、CameraX スキルはエージェントをガイドして、正確でプロダクション レディなコードを生成します。

作成者:
続きを読む