ข่าวสารผลิตภัณฑ์

เพิ่มความสว่างให้ฟีดกล้องแบบเรียลไทม์ด้วยการเพิ่มประสิทธิภาพในที่แสงน้อย

ใช้เวลาอ่าน 7 นาที
Donovan McMurray
วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์

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

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

การอัปเดตล่าสุดทำให้ LLB ช่วยให้ผู้ใช้ Instagram จัดองค์ประกอบภาพได้อย่างสมบูรณ์แบบ และการใช้โหมดกลางคืนที่มีอยู่จะทำให้ได้ภาพถ่ายในสภาวะแสงน้อยที่มีคุณภาพสูงเช่นเดียวกับที่ผู้ใช้ได้รับมานานกว่า 1 ปี

เหตุผลที่ความสว่างแบบเรียลไทม์มีความสำคัญ

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

  • การจัดเฟรมและการจับภาพที่ดีขึ้น: ในฉากที่มีแสงน้อย ตัวอย่างกล้องมาตรฐานอาจมืดสนิท LLB จะเพิ่มความสว่างให้กับช่องมองภาพ ทำให้ผู้ใช้เห็นสิ่งที่กำลังจัดเฟรมก่อนที่จะกดปุ่มชัตเตอร์ สำหรับประสบการณ์การใช้งานนี้ คุณสามารถใช้โหมดกลางคืนเพื่อให้ได้ผลลัพธ์ภาพถ่ายในสภาวะแสงน้อยที่มีคุณภาพดีที่สุด หรือจะปล่อยให้ LLB แสดงผลลัพธ์ภาพถ่าย "สิ่งที่คุณเห็นคือสิ่งที่คุณได้รับ" แก่ผู้ใช้ก็ได้
  • การสแกนที่เชื่อถือได้: คิวอาร์โค้ดมีอยู่ทุกหนทุกแห่ง แต่การสแกนในร้านอาหารที่มืดหรือโรงจอดรถมักจะน่าหงุดหงิด ฟีดกล้องที่สว่างขึ้นอย่างมากจะช่วยให้อัลกอริทึมการสแกนตรวจหาและถอดรหัสคิวอาร์โค้ดได้อย่างน่าเชื่อถือแม้ในสภาพแวดล้อมที่มืดมาก
  • การโต้ตอบที่ดียิ่งขึ้น: สำหรับแอปที่เกี่ยวข้องกับการโต้ตอบผ่านวิดีโอสด (เช่น ผู้ช่วย AI หรือวิดีโอคอล) LLB จะเพิ่มปริมาณข้อมูลที่รับรู้ได้ เพื่อให้มั่นใจว่าโมเดลคอมพิวเตอร์วิทัศน์มีข้อมูลเพียงพอที่จะทำงานด้วย

ความแตกต่างใน Instagram

LLB_IG_demo_white_background.gif

ทีมวิศวกรที่อยู่เบื้องหลังแอป Instagram บน Android ทำงานอย่างหนักอยู่เสมอเพื่อมอบประสบการณ์การใช้งานกล้องที่ล้ำสมัยให้แก่ผู้ใช้ คุณจะเห็นความแตกต่างที่ LLB สร้างขึ้นใน Pixel 10 Pro ได้ในตัวอย่างด้านบน 

lowlight.png

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

lowlight1.png

เลือกการติดตั้งใช้งาน

การใช้การเพิ่มแสงในสภาวะแสงน้อยเพื่อมอบประสบการณ์การใช้งานที่ดีที่สุดในอุปกรณ์ที่หลากหลายที่สุดทำได้ 2 วิธี ดังนี้

  1. โหมด AE เพิ่มแสงในสภาวะแสงน้อย: โหมดนี้เป็นโหมดการรับแสงอัตโนมัติที่เลเยอร์ฮาร์ดแวร์ โดยให้คุณภาพและประสิทธิภาพสูงสุดเนื่องจากปรับแต่งไปป์ไลน์ของหน่วยประมวลผลสัญญาณภาพ (ISP) โดยตรง โปรดตรวจสอบสิ่งนี้ก่อนเสมอ
  2. การเพิ่มประสิทธิภาพในที่แสงน้อยของ Google: หากอุปกรณ์ไม่รองรับโหมด AE คุณสามารถกลับไปใช้โซลูชันที่ใช้ซอฟต์แวร์นี้ซึ่งให้บริการโดยบริการ Google Play ได้ โดยจะใช้การประมวลผลภายหลังกับสตรีมจากกล้องเพื่อเพิ่มความสว่าง เนื่องจากเป็นโซลูชันแบบซอฟต์แวร์ทั้งหมด จึงพร้อมใช้งานในอุปกรณ์ต่างๆ มากขึ้น การติดตั้งใช้งานนี้จึงช่วยให้คุณเข้าถึงอุปกรณ์ต่างๆ ด้วย LLB ได้มากขึ้น

โหมด AE การเพิ่มแสงในสภาวะแสงน้อย (ฮาร์ดแวร์)

กลไก:
โหมดนี้รองรับในอุปกรณ์ที่ใช้ Android 15 ขึ้นไป และต้องให้ OEM ได้ติดตั้งการรองรับใน HAL (ปัจจุบันพร้อมใช้งานในอุปกรณ์ Pixel 10) โดยจะผสานรวมกับหน่วยประมวลผลสัญญาณภาพ (ISP) ของกล้องโดยตรง หากตั้งค่า CaptureRequest.CONTROL_AE_MODE เป็น CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY ระบบกล้องจะเข้าควบคุม

ลักษณะการทำงาน:
HAL/ISP จะวิเคราะห์ฉากและปรับพารามิเตอร์ของเซ็นเซอร์และการประมวลผล ซึ่งมักรวมถึงการเพิ่มเวลาเปิดรับแสง เพื่อให้ภาพสว่างขึ้นซึ่งจะทำให้ได้เฟรมที่มีอัตราส่วนสัญญาณต่อสัญญาณรบกวน (SNR) ที่ดีขึ้นอย่างมาก เนื่องจากเวลาเปิดรับแสงที่นานขึ้นช่วยให้เซ็นเซอร์จับข้อมูลแสงได้มากขึ้น แทนที่จะเพิ่มเกนเซ็นเซอร์ดิจิทัล (ISO)

ข้อดี:
คุณภาพของรูปภาพและประสิทธิภาพการใช้พลังงานอาจดีขึ้นเนื่องจากใช้เส้นทางฮาร์ดแวร์เฉพาะ

ข้อเสีย:
อาจส่งผลให้อัตราเฟรมต่ำลงในสภาพแวดล้อมที่มืดมาก เนื่องจากเซ็นเซอร์ต้องใช้เวลามากขึ้นในการจับภาพแสง อัตราเฟรมอาจลดลงเหลือเพียง 10 FPS ในสภาพแสงน้อยมาก

การเพิ่มแสงในสภาวะแสงน้อยของ Google (ซอฟต์แวร์ผ่านบริการ Google Play)

กลไก:
โซลูชันนี้ซึ่งเผยแพร่เป็นโมดูลที่ไม่บังคับผ่านบริการ Google Play จะใช้การประมวลผลภายหลังกับสตรีมจากกล้อง โดยใช้เทคโนโลยีการปรับปรุงรูปภาพแบบเรียลไทม์ที่ซับซ้อนที่เรียกว่า HDRNet

Google HDRNet:
โมเดลการเรียนรู้เชิงลึกนี้จะวิเคราะห์รูปภาพที่ความละเอียดต่ำกว่าเพื่อคาดการณ์ชุดพารามิเตอร์ขนาดกะทัดรัด (กริดแบบทวิภาค) จากนั้นตารางกริดนี้จะช่วยให้การปรับปรุงรูปภาพแบบเต็มความละเอียดบน GPU มีประสิทธิภาพและแตกต่างกันตามพื้นที่ โมเดลได้รับการฝึกให้เพิ่มความสว่างและปรับปรุงคุณภาพของรูปภาพในสภาพแสงน้อย โดยเน้นที่การมองเห็นใบหน้า

การจัดระเบียบกระบวนการ:
โมเดล HDRNet และตรรกะที่มาพร้อมกันจะได้รับการจัดระเบียบโดยโปรเซสเซอร์การเพิ่มแสงในสภาวะแสงน้อย ซึ่งรวมถึงข้อมูลต่อไปนี้

  1. การวิเคราะห์ฉาก:
    เครื่องคำนวณที่กำหนดเองซึ่งประมาณความสว่างจริงของฉากโดยใช้ข้อมูลเมตาของกล้อง (ความไวของเซ็นเซอร์ เวลาเปิดรับแสง ฯลฯ) และเนื้อหาของรูปภาพ การวิเคราะห์นี้จะกำหนดระดับการเพิ่ม
  2. การประมวลผล HDRNet:
    ใช้โมเดล HDRNet เพื่อเพิ่มความสว่างให้กับเฟรม โมเดลที่ใช้ได้รับการปรับแต่งสำหรับฉากที่มีแสงน้อยและเพิ่มประสิทธิภาพเพื่อประสิทธิภาพแบบเรียลไทม์
  3. การผสม:
    ระบบจะผสมเฟรมต้นฉบับและเฟรมที่ประมวลผลด้วย HDRNet เครื่องคำนวณความสว่างของฉากจะควบคุมปริมาณการผสมผสานแบบไดนามิก เพื่อให้มั่นใจว่าการเปลี่ยนผ่านระหว่างสถานะที่เพิ่มและไม่ได้เพิ่มจะราบรื่น
low-light-boost-processor-diagram.png

ข้อดี:
ใช้ได้กับอุปกรณ์หลากหลายรุ่นมากขึ้น (ปัจจุบันรองรับ Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra และ Pixel 6 ถึง Pixel 9) โดยไม่ต้องรองรับ HAL ที่เฉพาะเจาะจง รักษาอัตราเฟรมของกล้องไว้เนื่องจากเป็นเอฟเฟกต์หลังการประมวลผล

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

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

การติดตั้งใช้งานการเพิ่มแสงในสภาวะแสงน้อยในแอป

ตอนนี้มาดูวิธีใช้ทั้ง 2 ข้อเสนอของ LLB กัน คุณสามารถใช้ขั้นตอนต่อไปนี้ได้ไม่ว่าจะใช้ CameraX หรือ Camera2 ในแอปก็ตาม เราขอแนะนำให้ทำทั้งขั้นตอนที่ 1 และขั้นตอนที่ 2 เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด

ขั้นตอนที่ 1: โหมด AE การเพิ่มแสงในสภาวะแสงน้อย

โหมด LLB AE พร้อมใช้งานในอุปกรณ์บางรุ่นที่ใช้ Android 15 ขึ้นไป โดยจะทำงานเป็นโหมดการชดเชยแสง (AE) ที่เฉพาะเจาะจง

1. ตรวจสอบความพร้อมให้บริการ

ก่อนอื่น ให้ตรวจสอบว่าอุปกรณ์กล้องรองรับโหมด LLB AE หรือไม่

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isLlbSupported = cameraInfo.isLowLightBoostSupported

2. เปิดใช้โหมด

หากรองรับ คุณจะเปิดใช้โหมด AE ของ LLB ได้โดยใช้ออบเจ็กต์ CameraControl ของ CameraX

// After setting up your camera, use the CameraInfo object to enable LLB AE Mode.
camera = cameraProvider.bindToLifecycle(...)

if (isLlbSupported) {
  try {
    // The .await() extension suspends the coroutine until the
    // ListenableFuture completes. If the operation fails, it throws
    // an exception which we catch below.
    camera?.cameraControl.enableLowLightBoostAsync(true).await()
  } catch (e: IllegalStateException) {
    Log.e(TAG, "Failed to enable low light boost: not available on this device or with the current camera configuration", e)
  } catch (e: CameraControl.OperationCanceledException) {
    Log.e(TAG, "Failed to enable low light boost: camera is closed or value has changed", e)
  }
}

3. ตรวจสอบสถานะ

การที่คุณขอใช้โหมดนี้ไม่ได้หมายความว่าระบบจะ "เพิ่ม" วิดีโอในขณะนั้น ระบบจะเปิดใช้งานการเพิ่มเฉพาะเมื่อฉากมืดจริงๆ เท่านั้น คุณตั้งค่า Observer เพื่ออัปเดต UI (เช่น แสดงไอคอนดวงจันทร์) หรือแปลงเป็น Flow โดยใช้ฟังก์ชันส่วนขยาย asFlow() ได้

if (isLlbSupported) {
  camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
    // Update UI accordingly
    updateMoonIcon(state == LowLightBoostState.ACTIVE)
  }
}

อ่านคำแนะนำฉบับเต็มเกี่ยวกับ โหมด AE เพิ่มแสงน้อยได้ที่นี่

ขั้นตอนที่ 2: การเพิ่มประสิทธิภาพในที่แสงน้อยของ Google

สำหรับอุปกรณ์ที่ไม่รองรับโหมด AE ของฮาร์ดแวร์ Google Low Light Boost จะเป็นตัวเลือกสำรองที่มีประสิทธิภาพ โดยจะใช้ LowLightBoostSession เพื่อสกัดกั้นและเพิ่มความสว่างให้กับสตรีม

1. เพิ่มการอ้างอิง

ฟีเจอร์นี้ให้บริการผ่านบริการ Google Play

implementation("com.google.android.gms:play-services-camera-low-light-boost:16.0.1-beta06")
// Add coroutines-play-services to simplify Task APIs
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")

2. เริ่มต้นไคลเอ็นต์

ก่อนเริ่มกล้อง ให้ใช้ LowLightBoostClient เพื่อให้แน่ใจว่าได้ติดตั้งโมดูลแล้วและอุปกรณ์รองรับ

val llbClient = LowLightBoost.getClient(context)

// Check support and install if necessary
val isSupported = llbClient.isCameraSupported(cameraId).await()
val isInstalled = llbClient.isModuleInstalled().await()

if (isSupported && !isInstalled) {
    // Trigger installation
    llbClient.installModule(installCallback).await()
}

3. สร้างเซสชัน LLB

Google LLB จะประมวลผลแต่ละเฟรม ดังนั้นคุณต้องส่ง Surface ของจอแสดงผลไปยัง LowLightBoostSession และ LowLightBoostSession จะส่ง Surface ที่มีการปรับความสว่างกลับมาให้ สำหรับแอป Camera2 คุณสามารถเพิ่ม Surface ที่ได้ด้วย CaptureRequest.Builder.addTarget() สำหรับ CameraX ไปป์ไลน์การประมวลผลนี้จะสอดคล้องกับคลาส CameraEffect มากที่สุด ซึ่งคุณสามารถใช้เอฟเฟกต์กับ SurfaceProcessor และส่งกลับไปยังตัวอย่างด้วย SurfaceProvider ดังที่เห็นในโค้ดนี้

// With a SurfaceOutput from SurfaceProcessor.onSurfaceOutput() and a
// SurfaceRequest from Preview.SurfaceProvider.onSurfaceRequested(),
// create a LLB Session.
suspend fun createLlbSession(surfaceRequest: SurfaceRequest, outputSurfaceForLlb: Surface) {
  // 1. Create the LLB Session configuration
  val options = LowLightBoostOptions(
    outputSurfaceForLlb,
    cameraId,
    surfaceRequest.resolution.width,
    surfaceRequest.resolution.height,
    true // Start enabled
  )

  // 2. Create the session.
  val llbSession = llbClient.createSession(options, callback).await()

  // 3. Get the surface to use.
  val llbInputSurface = llbSession.getCameraSurface()

  // 4. Provide the surface to the CameraX Preview UseCase.
  surfaceRequest.provideSurface(llbInputSurface, executor, resultListener)

  // 5. Set the scene detector callback to monitor how much boost is being applied.
  val onSceneBrightnessChanged = object : SceneDetectorCallback {
    override fun onSceneBrightnessChanged(
      session: LowLightBoostSession,
      boostStrength: Float
    ) {
      // Monitor the boostStrength from 0 (no boosting) to 1 (maximum boosting)
    }
  }
  llbSession.setSceneDetectorCallback(onSceneBrightnessChanged, null)
}

4. ส่งข้อมูลเมตา

อัลกอริทึมต้องวิเคราะห์สถานะการเปิดรับแสงอัตโนมัติของกล้องจึงจะทำงานได้ คุณต้องส่งผลการจับภาพกลับไปยังเซสชัน LLB ใน CameraX คุณทำได้โดยขยาย Preview.Builder ด้วย Camera2Interop.Extender.setSessionCaptureCallback()

Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
  object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      llbSession?.processCaptureResult(result)
    }
  }
)

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

ขั้นตอนถัดไป

การใช้ตัวเลือกทั้ง 2 นี้จะช่วยให้มั่นใจได้ว่าผู้ใช้จะมองเห็นได้อย่างชัดเจน สแกนได้อย่างน่าเชื่อถือ และโต้ตอบได้อย่างมีประสิทธิภาพ ไม่ว่าสภาพแสงจะเป็นอย่างไร

หากต้องการดูฟีเจอร์เหล่านี้ในการทำงานภายในฐานของโค้ดที่สมบูรณ์และพร้อมใช้งานจริง โปรดดู แอปกล้อง Jetpack ใน GitHub โดยจะใช้ทั้งโหมด LLB AE และ Google LLB เพื่อให้คุณใช้อ้างอิงในการผสานรวมของคุณเอง 

เขียนโดย

อ่านต่อ