กรณีศึกษา

วิธีที่ SmileID ปรับขนาดการยืนยันตัวตนให้รองรับอุปกรณ์ Android กว่า 18,000 ประเภทด้วย CameraX

ใช้เวลาอ่าน 4 นาที
ดูโปรไฟล์ของ Donovan McMurray
Donovan McMurray วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์

แอปยืนยันตัวตนสำหรับการธนาคารและการลงทะเบียนซิมต้องใช้การจับภาพใบหน้าที่ชัดเจนและมีความละเอียดสูงเพื่อตรวจจับการปลอมแปลงและการใช้ดีปเฟก การจับภาพเฟรมที่คมชัดเพียงพอสำหรับการตรวจสอบความมีชีวิตและการป้องกันการปลอมแปลงโดยไม่ทำให้อุปกรณ์ที่มีหน่วยความจำต่ำขัดข้องเป็นความท้าทายที่พบได้ทั่วไปสำหรับนักพัฒนาแอปกล้อง Android

สำหรับ SmileID ซึ่งเป็น SDK การยืนยันตัวตนชั้นนำในแอฟริกา ความท้าทายนี้เพิ่มขึ้นเป็น 2 เท่าเนื่องจากระบบนิเวศฮาร์ดแวร์ที่หลากหลาย Android คิดเป็น 85% ของส่วนแบ่งการตลาดของอุปกรณ์เป้าหมายของ SmileID ซึ่งรวมถึงสมาร์ทโฟนระดับเริ่มต้นที่มีโปรเซสเซอร์ที่จำกัดอย่างมาก รุ่นที่คลุมเครือในระดับภูมิภาค และเทอร์มินัลจุดขาย (POS) ที่กำหนดเองซึ่งมีความทนทานสูง

harun_quote_card_green.png

ก่อนที่จะนำ CameraX มาใช้ SmileID ต้องเผชิญกับอุปสรรคด้านวิศวกรรมกล้องที่พบได้ทั่วไปแต่ก็ยากที่จะรับมือ ไม่ว่าจะเป็นฟีดตัวอย่างที่ยืดออก การวางแนวเซ็นเซอร์ที่หมุนไป ข้อขัดข้องเกี่ยวกับหน่วยความจำไม่เพียงพอ (OOM) และข้อบกพร่องของผู้ผลิตอุปกรณ์ดั้งเดิม (OEM) ที่กำหนดเอง SmileID เปลี่ยนความท้าทายเหล่านี้ให้กลายเป็นข้อได้เปรียบทางธุรกิจที่สำคัญด้วยการย้ายข้อมูล Android SDK หลักไปยัง CameraX

SmileID ระบุว่าการย้ายข้อมูล Android SDK ไปยัง CameraX ให้ผลลัพธ์ดังต่อไปนี้

เมตริกผลกระทบของการย้ายข้อมูล CameraX
การเติบโตของการรับ SDK ไปใช้งาน20 เท่าในปีที่ 2 (เพิ่มขึ้นจาก 2-3 เท่าก่อนใช้ CameraX)
อัตราการผ่านการยืนยันแอปที่ใช้ SDK ของ SmileID มีรายได้เพิ่มขึ้น 20%
ความละเอียดในการจับภาพพิกเซลของเซลฟี/การพิสูจน์การมีชีวิตเพิ่มขึ้น 4 เท่าโดยไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับเครือข่าย
ความเข้ากันได้ของรุ่นอุปกรณ์รองรับอุปกรณ์ Android มากกว่า 18,000 ประเภท
การยืนยันทั้งหมดที่ปรับขนาดดำเนินการยืนยันตัวตนมากกว่า 160 ล้านครั้ง

ความท้าทาย: ฮาร์ดแวร์ที่กระจัดกระจายและปัญหาเกี่ยวกับ API เดิม

SDK ของ SmileID ต้องจับภาพเฟรมเซลฟีความละเอียดสูงเพื่อตรวจสอบการมีชีวิตในอุปกรณ์และการตรวจจับดีปเฟกในระบบคลาวด์ เพื่อยืนยันว่าผู้ใช้เป็นบุคคลที่อ้างสิทธิ์จริง

ในส่วนการใช้งาน Camera1 เดิมและ Camera2 API ระดับต่ำ การดำเนินการนี้อย่างสม่ำเสมอเป็นเรื่องยากเนื่องจากสาเหตุหลายประการ ดังนี้ 

  • การปรับแต่งและลักษณะเฉพาะของ OEM: อุปกรณ์จากผู้ผลิตที่แตกต่างกันรายงานการวางแนวเซ็นเซอร์กล้องทางกายภาพแตกต่างกัน ส่งผลให้ตัวอย่างหมุนหรือการจับภาพใบหน้ามีการวางแนวไม่ถูกต้อง
  • การบิดเบี้ยวของสัดส่วนภาพ: การขอขนาดเฟรมที่เฉพาะเจาะจงในอุปกรณ์ราคาประหยัดมักทำให้ตัวอย่างภาพจากกล้องยืดออกในแนวตั้งหรือแนวนอน ซึ่งทำให้ใบหน้าของผู้ใช้บิดเบี้ยวและทำให้การยืนยันตัวตนด้วยไบโอเมตริกไม่มีประโยชน์
  • การขัดข้องเนื่องจากหน่วยความจำไม่เพียงพอ (OOM): การประมวลผลรูปภาพความละเอียดสูงแบบข้อมูลดิบในอุปกรณ์ที่มี RAM ต่ำ (มักจะอยู่ที่ 1 GB หรือน้อยกว่า) มักทำให้เกิดการขัดข้องเนื่องจากการจัดสรรหน่วยความจำที่ร้ายแรง

เนื่องจากอุปสรรคเหล่านี้ การเติบโตของการใช้ SDK ของ SmileID แบบปีต่อปีจึงจำกัดอยู่ที่ 2-3 เท่า และการยืนยันจำนวนมากต้องเปลี่ยนไปใช้การอัปโหลดรูปภาพนิ่งผ่าน REST API ที่มีเวลาในการตอบสนองสูง แทนที่จะทำการตรวจสอบการมีชีวิตอยู่บนอุปกรณ์แบบเรียลไทม์

โซลูชัน: ไปป์ไลน์ที่สอดคล้องกันด้วย CameraX 

SmileID ได้ปรับโครงสร้าง SDK บนอุปกรณ์เคลื่อนที่ใหม่ทั้งหมดโดยใช้ CameraX ซึ่งสร้างขึ้นมาโดยเฉพาะเพื่อลดความซับซ้อนของระบบนิเวศอุปกรณ์ที่สำคัญ และมอบอินเทอร์เฟซสำหรับนักพัฒนาแอปที่สอดคล้องกันและรับรู้ถึงวงจรของแอปในตัว

SmileID ใช้กรณีการใช้งานหลักของ CameraX (โดยเฉพาะ Preview และ ImageAnalysis) เพื่อสร้างไปป์ไลน์กล้องอเนกประสงค์ที่มีประสิทธิภาพ ดังนี้

  • ตัวอย่าง: แสดงตัวอย่างฟีดกล้องแบบเรียลไทม์ที่มีสัดส่วนสมบูรณ์แบบเพื่อแนะนำผู้ใช้
  • ImageAnalysis: ประมวลผลเฟรมในเครื่องอย่างต่อเนื่องแบบเรียลไทม์เพื่อตรวจจับภาพใบหน้าจริงและใบหน้าในเฟรมโดยอัตโนมัติ รวมถึงแยกเฟรมเซลฟีที่ยืนยันแล้ว

SmileID ได้เพิ่ม API ResolutionSelector ที่ทันสมัยของ CameraX ลงในการกำหนดค่า ImageAnalysis โดยตรง เพื่อจับภาพรายละเอียดที่คมชัดเป็นพิเศษสำหรับการตรวจจับดีปเฟกโดยไม่ทำให้เกิดข้อขัดข้อง OOM ซึ่งช่วยให้นักพัฒนาแอปขอความละเอียดเป้าหมายและเลือกกฎสำรองได้เมื่ออุปกรณ์ไม่รองรับขนาดที่แน่นอนนั้น ตัวอย่างเช่น แผนภาพและตัวอย่างการกำหนดค่าต่อไปนี้แสดงวิธีที่ 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 ยังบีบอัดบริเวณใบหน้าที่ครอบตัดในอุปกรณ์เพื่อให้ขนาดที่อัปโหลดเครือข่ายยังคงเหมือนกับระบบก่อนหน้า สถาปัตยกรรมนี้ช่วยให้โมเดลแมชชีนเลิร์นนิงมีข้อมูลที่ชัดเจนยิ่งขึ้นโดยไม่เพิ่มค่าใช้จ่ายอินเทอร์เน็ตมือถือสำหรับผู้ใช้

วิธีที่ CameraX แก้ปัญหาความแตกต่างของฮาร์ดแวร์

การกำหนดมาตรฐานใน CameraX หมายความว่า SmileID สามารถพึ่งพาวิศวกรรมความเข้ากันได้ 2 ชั้นเพื่อรักษา SDK ให้เสถียรในอุปกรณ์ต่างๆ ดังนี้

1. ห้องปฏิบัติการทดสอบกล้องและสื่อของ Google

ความเข้ากันได้ของ CameraX ได้รับการสนับสนุนโดยการตรวจสอบฮาร์ดแวร์จริงอย่างต่อเนื่อง ในห้องปฏิบัติการทดสอบกล้องและสื่อโดยเฉพาะของ Google ชุดโปรแกรมทดสอบอัตโนมัติจะทำงานทุกวันในเมทริกซ์ขนาดใหญ่ที่หมุนเวียนอุปกรณ์ Android จริงมากกว่า 190 รุ่น ซึ่งรวมถึงอุปกรณ์ที่ใช้ชิปเซ็ต เวอร์ชันระบบปฏิบัติการ และความสามารถของฮาร์ดแวร์ที่แตกต่างกัน 

Camera and Media Test Lab ของ Google จะตรวจจับการถดถอยของไลบรารีโดยอัตโนมัติก่อนที่จะส่งผลต่อโค้ดเวอร์ชันที่ใช้งานจริง เพื่อให้ทำงานได้อย่างสอดคล้องกันมากขึ้นในอุปกรณ์ยอดนิยม

2. วิธีแก้ปัญหาเฉพาะหน้าโดยอัตโนมัติสำหรับลักษณะเฉพาะของอุปกรณ์

อุปกรณ์ Android แต่ละเครื่องมีข้อจำกัดทางกายภาพที่แตกต่างกัน บางแอปอาจตั้งค่าการเปิดรับแสงที่กำหนดเองไม่ได้ ขณะที่บางแอปอาจรายงานข้อมูลรูปภาพกลับหัวเมื่อใช้สัดส่วนภาพบางสัดส่วน เพื่อป้องกันไม่ให้นักพัฒนาแอปทำให้ฐานของโค้ดซับซ้อนด้วยบล็อกเงื่อนไขที่ซับซ้อนตามผู้ผลิตและรุ่นของอุปกรณ์ CameraX จะรักษาคลาสความผิดปกติของอุปกรณ์ภายใน เช่น DeviceQuirks และ CameraQuirks ใน camera-camera2 (DeviceQuirksLoader.kt) เมื่อ CameraX ตรวจพบอุปกรณ์ที่มีปัญหาที่ทราบแล้ว ระบบจะแทรกวิธีแก้ปัญหาที่ปรับแต่งโดยอัตโนมัติ สำหรับ SmileID แล้ว การเปลี่ยนแปลงนี้หมายความว่า SDK ของบริษัทจะทำงานได้อย่างเสถียรในอุปกรณ์ Android กว่า 18,000 ประเภทโดยไม่ต้องใช้แพตช์เฉพาะอุปกรณ์ในฐานของโค้ด

การปรับขนาดเพื่อรองรับการยืนยันมากกว่า 160 ล้านครั้ง

การย้ายข้อมูลไปยัง CameraX ช่วยให้ SmileID ผสานรวม SDK สำหรับนักพัฒนาแอปภายนอกได้ง่ายขึ้น 

การกำจัดความบิดเบี้ยวของสัดส่วนภาพ ตัวอย่างที่ล่าช้า และข้อขัดข้อง OOM ที่เกิดขึ้นอย่างกะทันหันช่วยเพิ่มอัตราการผ่านการยืนยัน 20% สำหรับบริการที่ใช้ SDK ของตน สำหรับสถาบันการเงินและแอปเงินบนมือถือทั่วแอฟริกา อัตราการผ่านที่เพิ่มขึ้น 20% หมายความว่าผู้ใช้ที่ถูกต้องตามกฎหมายหลายแสนรายสามารถเริ่มต้นใช้งานได้สำเร็จแทนที่จะเลิกใช้งาน

juma_quote_card_blue.png

นักพัฒนาแอปก็สังเกตเห็นเรื่องนี้ ความง่ายในการผสานรวม SDK ที่ใช้ CameraX ทำให้การใช้งานเพิ่มขึ้น 15 เท่าในปีแรก และเพิ่มขึ้นเป็น 20 เท่าในปีที่ 2 จนถึงปัจจุบัน SmileID ได้ประมวลผลการยืนยันตัวตนกว่า 160 ล้านครั้งโดยใช้ CameraX ได้สำเร็จ

สร้างเรื่องราวความเข้ากันได้ด้วยทักษะ CameraX

การพัฒนาสำหรับกล้องไม่จำเป็นต้องเป็นเรื่องยาก Android ได้เปิดตัวทักษะ CameraX สำหรับเอเจนต์การเขียนโค้ด AI เพื่อช่วยให้ทีมของคุณใช้รูปแบบ CameraX เดียวกันกับที่ SmileID ใช้ 

เมื่อคุณใช้ทักษะ CameraX ในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ เอเจนต์การเขียนโค้ด AI เช่น Gemini จะใช้รูปแบบ CameraX ปัจจุบันสำหรับการย้ายข้อมูล, การเชื่อมโยงวงจร, ConcurrentCamera และ MlKitAnalyzer ไม่ว่าคุณจะตั้งค่าฟีดกล้องคู่ กำหนดค่าตัวอย่างด้วย PreviewView หรือ CameraXViewfinder หรือจัดการการวิเคราะห์แมชชีนเลิร์นนิง (ML) แบบเรียลไทม์ ทักษะ CameraX จะแนะนำ Agent ของคุณให้สร้างโค้ดที่แม่นยำและพร้อมใช้งานจริง

เขียนโดย
อ่านต่อ