প্রোডাক্ট সংক্রান্ত খবর

লো লাইট বুস্টের মাধ্যমে আপনার রিয়েল-টাইম ক্যামেরা ফিড আরও উজ্জ্বল করুন

৭ মিনিট লাগবে
Donovan McMurray-এর প্রোফাইল দেখুন
Donovan McMurray ডেভেলপার রিলেশনস ইঞ্জিনিয়ার

আমরা সম্প্রতি শেয়ার করেছি কীভাবে Instagram ব্যবহারকারীদের নাইট মোড ব্যবহার করে কম আলোতে দারুণ ফটো তুলতে সাহায্য করেছে। এই ফিচারটি স্থির ছবির জন্য উপযুক্ত, যেখানে খুব ভালো কোয়ালিটির স্থির শট তৈরি করার জন্য একাধিক এক্সপোজার একত্রিত করার সময় থাকে। কিন্তু ফটো তোলার মধ্যবর্তী সময়ে যে মুহূর্তগুলি ঘটে, সেগুলির কী হবে? ব্যবহারকারীদের শুধু শাটার বোতাম প্রেস করার মুহূর্তের চেয়েও বেশি সময় ধরে ক্যামেরার সাথে ইন্টার‍্যাক্ট করতে হবে। এছাড়াও, তারা প্রিভিউ ব্যবহার করে দৃশ্য কম্পোজ করেন বা QR কোড স্ক্যান করেন।

আজ, আমরা লো লাইট বুস্ট (LLB) সম্পর্কে জানব, এটি একটি শক্তিশালী ফিচার যা রিয়েল-টাইম ক্যামেরা স্ট্রিমকে উজ্জ্বল করার জন্য ডিজাইন করা হয়েছে। নাইট মোডের মতো নয়, যেখানে ক্যাপচার করার সময় স্থির হয়ে থাকতে হয়, লো লাইট বুস্ট আপনার লাইভ প্রিভিউ এবং ভিডিও রেকর্ডিংয়ে তাৎক্ষণিকভাবে কাজ করে। উপলভ্য আলোর উপর ভিত্তি করে কতটা উজ্জ্বলতা প্রয়োজন তা LLB অটোমেটিক অ্যাডজাস্ট করে, তাই এটি প্রতিটি পরিবেশের জন্য অপ্টিমাইজ করা হয়।

সাম্প্রতিক আপডেটের মাধ্যমে, LLB, Instagram ব্যবহারকারীদের নিখুঁত শট নেওয়ার সুবিধা দেয় এবং তারপরে তাদের বর্তমান নাইট মোড প্রয়োগের ফলে একই খুব ভালো কোয়ালিটির কম-আলোর ফটো পাওয়া যায় যা তাদের ব্যবহারকারীরা এক বছরেরও বেশি সময় ধরে উপভোগ করছেন।

রিয়েল-টাইম উজ্জ্বলতা কেন গুরুত্বপূর্ণ

নাইট মোডের লক্ষ্য হল ফাইনাল ছবির কোয়ালিটি উন্নত করা, অন্যদিকে লো লাইট বুস্টের লক্ষ্য হল অন্ধকার পরিবেশে ব্যবহারযোগ্যতা ও ইন্টার‍্যাক্টিভিটি উন্নত করা। আরেকটি গুরুত্বপূর্ণ বিষয় হল – যদিও তারা একসাথে খুব ভাল কাজ করে – আপনি LLB এবং নাইট মোড স্বাধীনভাবে ব্যবহার করতে পারেন এবং আপনি এই ব্যবহারের কিছু ক্ষেত্রে দেখতে পাবেন যে, নাইট মোড ফটোর প্রয়োজন না হলে LLB-এর নিজস্ব মূল্য রয়েছে। LLB কীভাবে ব্যবহারকারীর অভিজ্ঞতা উন্নত করে তা এখানে দেওয়া হল:

  • আরও ভালো ফ্রেমিং ও ক্যাপচার: কম আলোয় স্ট্যান্ডার্ড ক্যামেরা প্রিভিউতে কিছুই দেখা যায় না। LLB ভিউফাইন্ডারকে উজ্জ্বল করে, যার ফলে ব্যবহারকারীরা শাটার বোতামে প্রেস করার আগে তারা কী ফ্রেম করছেন তা দেখতে পান। এই অভিজ্ঞতার জন্য, আপনি কম আলোতে সেরা কোয়ালিটির ফটো তোলার জন্য নাইট মোড ব্যবহার করতে পারেন অথবা LLB-কে ব্যবহারকারীকে "আপনি যা দেখছেন তাই পাবেন" ফটো ফলাফল দিতে দিতে পারেন।
  • নির্ভরযোগ্য স্ক্যানিং: QR কোড সর্বত্রই রয়েছে, তবে অন্ধকার রেস্তোরাঁ বা পার্কিং গ্যারেজে সেগুলি স্ক্যান করা প্রায়শই হতাশাজনক হয়। ক্যামেরা ফিড উল্লেখযোগ্যভাবে উজ্জ্বল হওয়ার কারণে, স্ক্যানিং অ্যালগরিদম খুব কম আলোতেও QR কোড নির্ভরযোগ্যভাবে শনাক্ত ও ডিকোড করতে পারে।
  • উন্নত ইন্টার‍্যাকশন: লাইভ ভিডিও ইন্টার‍্যাকশন (যেমন AI অ্যাসিস্ট্যান্ট বা ভিডিও কল) সহ অ্যাপের জন্য LLB বোধগম্য তথ্যের পরিমাণ বাড়ায়, যাতে কম্পিউটার ভিশন মডেলের কাছে কাজ করার জন্য পর্যাপ্ত ডেটা থাকে

Instagram-এ পার্থক্য

LLB_IG_demo_white_background.gif

Android Instagram অ্যাপের ইঞ্জিনিয়ারিং টিম সবসময় তাদের ব্যবহারকারীদের জন্য অত্যাধুনিক ক্যামেরা অভিজ্ঞতা প্রদান করার জন্য কঠোর পরিশ্রম করে। Pixel 10 Pro-তে LLB কতটা পার্থক্য তৈরি করে তা আপনি উপরের উদাহরণে দেখতে পাবেন। 

lowlight.png

ব্যবহারকারীর অভিজ্ঞতায় এটি কতটা পার্থক্য তৈরি করে তা সহজেই বোঝা যায়। ব্যবহারকারীরা যা ক্যাপচার করছেন তা দেখতে না পেলে, ক্যাপচার করা ছেড়ে দেওয়ার সম্ভাবনা বেশি থাকে। 

lowlight1.png

কীভাবে প্রয়োগ করবেন তা বেছে নেওয়া

সবচেয়ে বেশি সংখ্যক ডিভাইসে সেরা অভিজ্ঞতা প্রদান করার জন্য লো লাইট বুস্ট প্রয়োগ করার দুটি উপায় আছে:

  1. লো লাইট বুস্ট AE মোড: এটি একটি হার্ডওয়্যার-লেয়ার অটো-এক্সপোজার মোড। এটি সবচেয়ে ভাল কোয়ালিটি ও পারফর্ম্যান্স অফার করে কারণ এটি সরাসরি ইমেজ সিগন্যাল প্রসেসর (ISP) পাইপলাইন ফাইন-টিউন করে। সবসময় প্রথমে এটি চেক করুন।
  2. Google Low Light Boost: ডিভাইসে 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) বাড়ানোর পরিবর্তে এক্সপোজারের সময় বাড়ানোর ফলে সেন্সর আরও বেশি আলোর তথ্য ক্যাপচার করতে পারে।

সুবিধা:
এটি ডেডিকেটেড হার্ডওয়্যার পাথওয়ে ব্যবহার করে বলে, সম্ভাব্য আরও ভালো ছবির কোয়ালিটি ও পাওয়ার এফিশিয়েন্সি পাওয়া যায়।

ট্রেড অফ:
খুব অন্ধকার পরিস্থিতিতে ফ্রেম রেট কম হতে পারে কারণ সেন্সরের আলো ক্যাপচার করতে আরও বেশি সময় প্রয়োজন। খুব কম আলো থাকলে ফ্রেম রেট কমে ১০ FPS পর্যন্ত হতে পারে।

Google লো লাইট বুস্ট (Google Play পরিষেবার মাধ্যমে সফ্টওয়্যার)

মেকানিজম:
এই সমাধান, Google Play পরিষেবার মাধ্যমে ঐচ্ছিক মডিউল হিসেবে ডিস্ট্রিবিউট করা হয়, ক্যামেরা স্ট্রিমে পোস্ট-প্রসেসিং প্রয়োগ করে। এটি HDRNet নামক একটি অত্যাধুনিক রিয়েল-টাইম ইমেজ এনহ্যান্সমেন্ট প্রযুক্তি ব্যবহার করে।

Google HDRNet:
এই ডিপ লার্নিং মডেলটি প্যারামিটারের একটি কমপ্যাক্ট সেট (একটি দ্বিপাক্ষিক গ্রিড) অনুমান করার জন্য কম রেজোলিউশনে ছবি বিশ্লেষণ করে। এই গ্রিডটি তখন GPU-তে ফুল-রেজোলিউশন ছবির দক্ষ, স্থানিক-পরিবর্তনশীল বর্ধনকে নির্দেশ করে। কম আলোতে ছবির কোয়ালিটি উন্নত ও উজ্জ্বল করার জন্য মডেলটিকে ট্রেনিং দেওয়া হয়েছে, যাতে মুখের দৃশ্যমানতার উপর ফোকাস করা যায়।

প্রসেস অর্কেস্ট্রেশন:
HDRNet মডেল এবং এর সাথে থাকা লজিক লো লাইট বুস্ট প্রসেসর দ্বারা অর্কেস্ট্রেট করা হয়। এর মধ্যে রয়েছে:

  1. দৃশ্য বিশ্লেষণ:
    একটি কাস্টম ক্যালকুলেটর যা ক্যামেরার মেটাডেটা (সেন্সর সংবেদনশীলতা, এক্সপোজার সময় ইত্যাদি) এবং ছবির কন্টেন্ট ব্যবহার করে দৃশ্যের আসল উজ্জ্বলতা অনুমান করে। এই বিশ্লেষণ বুস্ট লেভেল নির্ধারণ করে।
  2. HDRNet প্রসেসিং:
    ফ্রেম উজ্জ্বল করতে HDRNet মডেল প্রয়োগ করে। ব্যবহৃত মডেলটি কম আলোর দৃশ্যের জন্য টিউন করা হয়েছে এবং রিয়েল-টাইম পারফর্ম্যান্সের জন্য অপ্টিমাইজ করা হয়েছে।
  3. ব্লেন্ডিং:
    আসল এবং HDRNet প্রসেস করা ফ্রেম ব্লেন্ড করা হয়। কতটা ব্লেন্ডিং প্রয়োগ করা হবে তা দৃশ্যের উজ্জ্বলতা ক্যালকুলেটর দ্বারা ডাইনামিকভাবে নিয়ন্ত্রণ করা হয়, যাতে বুস্ট করা ও বুস্ট না করা অবস্থার মধ্যে মসৃণ ট্রানজিশন নিশ্চিত করা যায়।
low-light-boost-processor-diagram.png

সুবিধা:
নির্দিষ্ট HAL সাপোর্ট ছাড়াই আরও বেশি সংখ্যক ডিভাইসে (বর্তমানে Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra এবং Pixel 6 থেকে Pixel 9 পর্যন্ত) কাজ করে। এটি পোস্ট-প্রসেসিং এফেক্ট হওয়ার কারণে ক্যামেরার ফ্রেম রেট বজায় রাখে।

ট্রেড-অফ:
পোস্ট-প্রসেসিং পদ্ধতি হিসেবে, সেন্সর থেকে পাওয়া ফ্রেমের তথ্যের উপর নির্ভর করে কোয়ালিটি সীমিত করা হয়। সেন্সর লেভেলে অত্যন্ত অন্ধকার থাকার কারণে হারিয়ে যাওয়া বিবরণ এটি ফিরিয়ে আনতে পারে না।

হার্ডওয়্যার এবং সফ্টওয়্যার উভয় পাথওয়ে অফার করার মাধ্যমে, লো লাইট বুস্ট Android ইকোসিস্টেম জুড়ে কম আলোতে ক্যামেরার পারফর্ম্যান্স উন্নত করার জন্য একটি স্কেলেবল সমাধান প্রদান করে। ডেভেলপারদের উচিত AE মোড উপলভ্য থাকলে সেটিকে অগ্রাধিকার দেওয়া এবং Google Low Light Boost-কে একটি শক্তিশালী ফলব্যাক হিসেবে ব্যবহার করা।

আপনার অ্যাপে লো লাইট বুস্ট প্রয়োগ করা

এখন দেখা যাক কীভাবে দুটি LLB অফারই প্রয়োগ করা যায়। আপনার অ্যাপে CameraX বা Camera2 যাই ব্যবহার করুন না কেন, আপনি নিম্নলিখিত পদ্ধতি প্রয়োগ করতে পারেন। সেরা ফলাফলের জন্য, আমরা ধাপ ১ ও ধাপ ২, দুটিই প্রয়োগ করার সাজেশন দিই।

ধাপ ১: কম আলোর বুস্ট AE মোড

Android 15 ও তার পরবর্তী যেকোনও ভার্সনে চলা বাছাই করা ডিভাইসে উপলভ্য, LLB AE মোড নির্দিষ্ট অটো-এক্সপোজার (AE) মোড হিসেবে কাজ করে।

১. উপলভ্য কিনা দেখুন

প্রথমে, ক্যামেরা ডিভাইসে LLB AE মোড কাজ করে কিনা তা চেক করুন।

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

২. মোড চালু করুন

কাজ করলে, CameraX-এর CameraControl অবজেক্ট ব্যবহার করে আপনি LLB AE মোড চালু করতে পারবেন।

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

৩. স্টেট মনিটর করুন

আপনি মোডের জন্য অনুরোধ করেছেন মানেই যে এটি বর্তমানে "বুস্ট করছে" তা নয়। দৃশ্যটি সত্যিই অন্ধকার হলে তবেই সিস্টেম বুস্ট অ্যাক্টিভেট করে। আপনার UI আপডেট করতে (যেমন চাঁদের আইকন দেখানো) আপনি Observer সেট-আপ করতে পারেন অথবা asFlow() এক্সটেনশন ফাংশন ব্যবহার করে Flow-তে কনভার্ট করতে পারেন।

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

আপনি লো লাইট বুস্ট AE মোড সম্পর্কে সম্পূর্ণ গাইড এখানে পড়তে পারবেন।

ধাপ ২: Google লো লাইট বুস্ট

যেসব ডিভাইসে হার্ডওয়্যার AE মোড কাজ করে না, সেগুলিতে Google Low Light Boost একটি শক্তিশালী বিকল্প হিসেবে কাজ করে। এটি স্ট্রিম ইন্টারসেপ্ট ও উজ্জ্বল করতে LowLightBoostSession ব্যবহার করে।

১. নির্ভরতা যোগ করুন

এই ফিচার 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")

২. ক্লায়েন্ট শুরু করুন

ক্যামেরা চালু করার আগে, মডিউল ইনস্টল করা আছে এবং ডিভাইসটি কাজ করে কিনা তা নিশ্চিত করতে 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()
}

৩. LLB সেশন তৈরি করুন

Google LLB প্রতিটি ফ্রেম প্রসেস করে, তাই আপনাকে অবশ্যই ডিসপ্লে সারফেস LowLightBoostSession-কে দিতে হবে এবং এটি আপনাকে এমন একটি সারফেস ফেরত দেবে যাতে ব্রাইটনেস প্রয়োগ করা হয়েছে। Camera2 অ্যাপের জন্য, আপনি CaptureRequest.Builder.addTarget()-এর মাধ্যমে Surface যোগ করতে পারবেন। 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)
}

৪. মেটাডেটা পাস করা

অ্যালগরিদম কাজ করার জন্য, ক্যামেরার অটো-এক্সপোজার স্ট্যাটাস বিশ্লেষণ করতে হবে। আপনাকে অবশ্যই LLB সেশনে ক্যাপচার ফলাফল ফেরত পাঠাতে হবে। CameraX-এ, Camera2Interop.Extender.setSessionCaptureCallback()-এর মাধ্যমে Preview.Builder এক্সটেন্ড করে এটি করা যেতে পারে।

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 Low Light Boost নির্দেশিকায় পাওয়া যাবে।

পরবর্তী ধাপ

এই দুটি বিকল্প প্রয়োগ করার মাধ্যমে, আপনি নিশ্চিত করেন যে আপনার ব্যবহারকারীরা আলোর অবস্থা যাই হোক না কেন, স্পষ্টভাবে দেখতে, নির্ভরযোগ্যভাবে স্ক্যান করতে এবং কার্যকরভাবে ইন্টার‍্যাক্ট করতে পারবেন।

সম্পূর্ণ, প্রোডাকশন-রেডি কোডবেসের মধ্যে এইসব ফিচার কাজ করতে দেখতে, GitHub-এ Jetpack Camera অ্যাপ চেক করে দেখুন। এটি LLB AE মোড এবং Google LLB, দুটিই প্রয়োগ করে, যা আপনার নিজস্ব ইন্টিগ্রেশনের জন্য রেফারেন্স প্রদান করে। 

লিখেছেন:
পড়া চালিয়ে যান