Android এর জন্য ফেস ল্যান্ডমার্ক সনাক্তকরণ গাইড

MediaPipe Face Landmarker টাস্ক আপনাকে ছবি এবং ভিডিওতে মুখের ল্যান্ডমার্ক এবং মুখের অভিব্যক্তি সনাক্ত করতে দেয়। আপনি এই টাস্কটি ব্যবহার করে মানুষের মুখের অভিব্যক্তি সনাক্ত করতে, মুখের ফিল্টার এবং প্রভাব প্রয়োগ করতে এবং ভার্চুয়াল অবতার তৈরি করতে পারেন। এই টাস্কটি মেশিন লার্নিং (ML) মডেল ব্যবহার করে যা একক ছবি বা ছবির একটি অবিচ্ছিন্ন প্রবাহের সাথে কাজ করতে পারে। টাস্কটি ত্রিমাত্রিক মুখের ল্যান্ডমার্ক, ব্লেন্ডশেপ স্কোর (মুখের অভিব্যক্তি প্রতিনিধিত্বকারী সহগ) আউটপুট করে রিয়েল-টাইমে বিশদ মুখের পৃষ্ঠতল অনুমান করতে এবং প্রভাব রেন্ডারিংয়ের জন্য প্রয়োজনীয় রূপান্তর সম্পাদন করতে রূপান্তর ম্যাট্রিক্স আউটপুট করে।

এই নির্দেশাবলীতে বর্ণিত কোড নমুনাটি GitHub- এ উপলব্ধ। এই কাজের ক্ষমতা, মডেল এবং কনফিগারেশন বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য, ওভারভিউ দেখুন।

কোড উদাহরণ

মিডিয়াপাইপ টাস্কের উদাহরণ কোডটি অ্যান্ড্রয়েডের জন্য একটি ফেস ল্যান্ডমার্কার অ্যাপের একটি সহজ বাস্তবায়ন। উদাহরণটি একটি অবিচ্ছিন্ন ভিডিও স্ট্রিমে মুখ সনাক্ত করতে একটি বাস্তব অ্যান্ড্রয়েড ডিভাইসের ক্যামেরা ব্যবহার করে। অ্যাপটি ডিভাইস গ্যালারি থেকে ছবি এবং ভিডিওতে মুখ সনাক্ত করতে পারে।

আপনি আপনার নিজস্ব অ্যান্ড্রয়েড অ্যাপের জন্য অ্যাপটিকে একটি সূচনা বিন্দু হিসেবে ব্যবহার করতে পারেন, অথবা বিদ্যমান অ্যাপটি পরিবর্তন করার সময় এটি ব্যবহার করতে পারেন। ফেস ল্যান্ডমার্কার উদাহরণ কোডটি GitHub- এ হোস্ট করা আছে।

কোডটি ডাউনলোড করুন

নিম্নলিখিত নির্দেশাবলী আপনাকে দেখায় কিভাবে git কমান্ড লাইন টুল ব্যবহার করে উদাহরণ কোডের একটি স্থানীয় কপি তৈরি করতে হয়।

উদাহরণ কোডটি ডাউনলোড করতে:

  1. নিম্নলিখিত কমান্ড ব্যবহার করে গিট রিপোজিটরি ক্লোন করুন:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. ঐচ্ছিকভাবে, আপনার গিট ইনস্ট্যান্সটি স্পার্স চেকআউট ব্যবহার করার জন্য কনফিগার করুন, যাতে আপনার কাছে কেবল ফেস ল্যান্ডমার্কার উদাহরণ অ্যাপের জন্য ফাইল থাকে:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

উদাহরণ কোডের একটি স্থানীয় সংস্করণ তৈরি করার পরে, আপনি প্রকল্পটি অ্যান্ড্রয়েড স্টুডিওতে আমদানি করতে পারেন এবং অ্যাপটি চালাতে পারেন। নির্দেশাবলীর জন্য, অ্যান্ড্রয়েডের জন্য সেটআপ গাইড দেখুন।

মূল উপাদান

নিম্নলিখিত ফাইলগুলিতে এই ফেস ল্যান্ডমার্কিং উদাহরণ অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ কোড রয়েছে:

  • FaceLandmarkerHelper.kt - ফেস ল্যান্ডমার্কারটি শুরু করে এবং মডেল এবং ডেলিগেট নির্বাচন পরিচালনা করে।
  • CameraFragment.kt - ডিভাইসের ক্যামেরা পরিচালনা করে এবং ছবি এবং ভিডিও ইনপুট ডেটা প্রক্রিয়া করে।
  • GalleryFragment.kt - আউটপুট ছবি বা ভিডিও প্রদর্শনের জন্য OverlayView সাথে ইন্টারঅ্যাক্ট করে।
  • OverlayView.kt - সনাক্ত করা মুখগুলির জন্য একটি ফেস মেশ সহ ডিসপ্লে প্রয়োগ করে।

সেটআপ

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

নির্ভরতা

ফেস ল্যান্ডমার্কার টাস্কটি com.google.mediapipe:tasks-vision লাইব্রেরি ব্যবহার করে। আপনার অ্যান্ড্রয়েড অ্যাপের build.gradle ফাইলে এই নির্ভরতা যোগ করুন:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

মডেল

মিডিয়াপাইপ ফেস ল্যান্ডমার্কার টাস্কের জন্য একটি প্রশিক্ষিত মডেল বান্ডেল প্রয়োজন যা এই টাস্কের সাথে সামঞ্জস্যপূর্ণ। ফেস ল্যান্ডমার্কারের জন্য উপলব্ধ প্রশিক্ষিত মডেল সম্পর্কে আরও তথ্যের জন্য, টাস্ক ওভারভিউ মডেল বিভাগটি দেখুন।

মডেলটি নির্বাচন করুন এবং ডাউনলোড করুন, এবং এটি আপনার প্রকল্প ডিরেক্টরিতে সংরক্ষণ করুন:

<dev-project-root>/src/main/assets

ModelAssetPath প্যারামিটারের মধ্যে মডেলের পাথ নির্দিষ্ট করুন। উদাহরণ কোডে, মডেলটি FaceLandmarkerHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

টাস্কটি তৈরি করুন

MediaPipe Face Landmarker টাস্কটি টাস্ক সেট আপ করার জন্য createFromOptions() ফাংশন ব্যবহার করে। createFromOptions() ফাংশনটি কনফিগারেশন বিকল্পগুলির জন্য মান গ্রহণ করে। কনফিগারেশন বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য, কনফিগারেশন বিকল্পগুলি দেখুন।

ফেস ল্যান্ডমার্কার নিম্নলিখিত ইনপুট ডেটা প্রকারগুলিকে সমর্থন করে: স্থির চিত্র, ভিডিও ফাইল এবং লাইভ ভিডিও স্ট্রিম। টাস্ক তৈরি করার সময় আপনাকে আপনার ইনপুট ডেটা প্রকারের সাথে সম্পর্কিত চলমান মোড নির্দিষ্ট করতে হবে। টাস্ক তৈরি এবং ইনফারেন্স রান করার পদ্ধতি দেখতে আপনার ইনপুট ডেটা প্রকারের জন্য ট্যাবটি নির্বাচন করুন।

ভাবমূর্তি

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

ভিডিও

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

সরাসরি সম্প্রচার

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

ফেস ল্যান্ডমার্কার উদাহরণ কোড বাস্তবায়ন ব্যবহারকারীকে প্রক্রিয়াকরণ মোডগুলির মধ্যে স্যুইচ করার সুযোগ দেয়। এই পদ্ধতিটি টাস্ক তৈরির কোডটিকে আরও জটিল করে তোলে এবং আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত নাও হতে পারে। আপনি এই কোডটি FaceLandmarkerHelper.kt ফাইলের setupFaceLandmarker() ফাংশনে দেখতে পাবেন।

কনফিগারেশন বিকল্পগুলি

এই টাস্কে অ্যান্ড্রয়েড অ্যাপের জন্য নিম্নলিখিত কনফিগারেশন বিকল্পগুলি রয়েছে:

বিকল্পের নাম বিবরণ মূল্য পরিসীমা ডিফল্ট মান
runningMode টাস্কের জন্য রানিং মোড সেট করে। তিনটি মোড আছে:

চিত্র: একক চিত্র ইনপুটগুলির জন্য মোড।

ভিডিও: একটি ভিডিওর ডিকোড করা ফ্রেমের মোড।

LIVE_STREAM: ক্যামেরার মতো ইনপুট ডেটার লাইভস্ট্রিমের মোড। এই মোডে, অ্যাসিঙ্ক্রোনাসভাবে ফলাফল গ্রহণের জন্য একটি শ্রোতা সেট আপ করার জন্য resultListener কে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
numFaces FaceLandmarker দ্বারা সর্বাধিক কতগুলি মুখ সনাক্ত করা যেতে পারে। স্মুথিং শুধুমাত্র তখনই প্রয়োগ করা হয় যখন num_faces 1 তে সেট করা থাকে। Integer > 0 1
minFaceDetectionConfidence মুখ সনাক্তকরণ সফল বলে বিবেচিত হওয়ার জন্য ন্যূনতম আত্মবিশ্বাসের স্কোর। Float [0.0,1.0] 0.5
minFacePresenceConfidence মুখের ল্যান্ডমার্ক সনাক্তকরণে মুখের উপস্থিতি স্কোরের ন্যূনতম আত্মবিশ্বাস স্কোর। Float [0.0,1.0] 0.5
minTrackingConfidence ফেস ট্র্যাকিং সফল বলে বিবেচিত হওয়ার জন্য ন্যূনতম আত্মবিশ্বাসের স্কোর। Float [0.0,1.0] 0.5
outputFaceBlendshapes ফেস ল্যান্ডমার্কার ফেস ব্লেন্ডশেপ আউটপুট করে কিনা। 3D ফেস মডেল রেন্ডার করার জন্য ফেস ব্লেন্ডশেপ ব্যবহার করা হয়। Boolean False
outputFacialTransformationMatrixes ফেসল্যান্ডমার্কার ফেসিয়াল ট্রান্সফর্মেশন ম্যাট্রিক্স আউটপুট করে কিনা। ফেসল্যান্ডমার্কার ম্যাট্রিক্স ব্যবহার করে ফেস ল্যান্ডমার্কগুলিকে একটি ক্যানোনিকাল ফেস মডেল থেকে ডিটেকশন করা ফেসে রূপান্তর করে, যাতে ব্যবহারকারীরা ডিটেকশন করা ল্যান্ডমার্কগুলিতে ইফেক্ট প্রয়োগ করতে পারেন। Boolean False
resultListener FaceLandmarker লাইভ স্ট্রিম মোডে থাকাকালীন ফলাফল শ্রোতাকে ল্যান্ডমার্কারের ফলাফল অ্যাসিঙ্ক্রোনাসভাবে গ্রহণ করার জন্য সেট করে। শুধুমাত্র রানিং মোড LIVE_STREAM এ সেট করা থাকলে ব্যবহার করা যেতে পারে। ResultListener N/A
errorListener একটি ঐচ্ছিক ত্রুটি শ্রোতা সেট করে। ErrorListener N/A

তথ্য প্রস্তুত করুন

ফেস ল্যান্ডমার্কার ছবি, ভিডিও ফাইল এবং লাইভ ভিডিও স্ট্রিম নিয়ে কাজ করে। এই কাজটি ডেটা ইনপুট প্রিপ্রসেসিং পরিচালনা করে, যার মধ্যে রয়েছে রিসাইজিং, রোটেশন এবং ভ্যালু নরমালাইজেশন।

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

ভাবমূর্তি

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
    

ভিডিও

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

val argb8888Frame =
    if (frame.config == Bitmap.Config.ARGB_8888) frame
    else frame.copy(Bitmap.Config.ARGB_8888, false)

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(argb8888Frame).build()
    

সরাসরি সম্প্রচার

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    

ফেস ল্যান্ডমার্কার উদাহরণ কোডে, ডেটা প্রস্তুতি FaceLandmarkerHelper.kt ফাইলে পরিচালিত হয়।

টাস্কটি চালান

আপনি যে ধরণের ডেটা নিয়ে কাজ করছেন তার উপর নির্ভর করে, FaceLandmarker.detect...() পদ্ধতিটি ব্যবহার করুন যা সেই ডেটা ধরণের জন্য নির্দিষ্ট। পৃথক চিত্রের জন্য detect() , ভিডিও ফাইলের ফ্রেমের জন্য detectForVideo() এবং ভিডিও স্ট্রিমগুলির জন্য detectAsync() ব্যবহার করুন। যখন আপনি একটি ভিডিও স্ট্রিম সনাক্তকরণ সম্পাদন করছেন, তখন নিশ্চিত করুন যে আপনি ব্যবহারকারী ইন্টারফেস থ্রেড ব্লক করা এড়াতে একটি পৃথক থ্রেডে সনাক্তকরণগুলি চালাচ্ছেন।

নিম্নলিখিত কোড নমুনাগুলি এই বিভিন্ন ডেটা মোডে ফেস ল্যান্ডমার্কার কীভাবে চালানো যায় তার সহজ উদাহরণ দেখায়:

ভাবমূর্তি

val result = FaceLandmarker.detect(mpImage)
    

ভিডিও

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

সরাসরি সম্প্রচার

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

নিম্নলিখিত বিষয়গুলি লক্ষ্য করুন:

  • ভিডিও মোড বা লাইভ স্ট্রিম মোডে চলার সময়, আপনাকে ফেস ল্যান্ডমার্কার টাস্কে ইনপুট ফ্রেমের টাইমস্ট্যাম্প প্রদান করতে হবে।
  • ইমেজ বা ভিডিও মোডে চলার সময়, ফেস ল্যান্ডমার্কার টাস্ক বর্তমান থ্রেডটিকে ব্লক করে যতক্ষণ না এটি ইনপুট ইমেজ বা ফ্রেম প্রক্রিয়াকরণ শেষ করে। ইউজার ইন্টারফেস ব্লক করা এড়াতে, একটি ব্যাকগ্রাউন্ড থ্রেডে প্রসেসিং সম্পাদন করুন।
  • লাইভ স্ট্রিম মোডে চলাকালীন, ফেস ল্যান্ডমার্কার টাস্কটি তাৎক্ষণিকভাবে ফিরে আসে এবং বর্তমান থ্রেডটিকে ব্লক করে না। এটি প্রতিবার ইনপুট ফ্রেম প্রক্রিয়াকরণ শেষ করার সময় সনাক্তকরণ ফলাফল সহ ফলাফল শ্রোতাকে আহ্বান করবে।

ফেস ল্যান্ডমার্কার উদাহরণ কোডে, detect , detectForVideo , এবং detectAsync ফাংশনগুলি FaceLandmarkerHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে।

ফলাফল পরিচালনা এবং প্রদর্শন করুন

প্রতিটি সনাক্তকরণ রানের জন্য ফেস ল্যান্ডমার্কার একটি FaceLandmarkerResult অবজেক্ট প্রদান করে। ফলাফল অবজেক্টে প্রতিটি সনাক্তকৃত মুখের জন্য একটি ফেস মেশ থাকে, প্রতিটি ফেস ল্যান্ডমার্কের জন্য স্থানাঙ্ক সহ। ঐচ্ছিকভাবে, ফলাফল অবজেক্টে ব্লেন্ডশেপও থাকতে পারে, যা মুখের অভিব্যক্তি নির্দেশ করে এবং সনাক্তকৃত ল্যান্ডমার্কগুলিতে মুখের প্রভাব প্রয়োগ করার জন্য একটি ফেসিয়াল ট্রান্সফর্মেশন ম্যাট্রিক্স থাকতে পারে।

এই টাস্ক থেকে আউটপুট ডেটার একটি উদাহরণ নিচে দেওয়া হল:

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

নিচের চিত্রটি টাস্ক আউটপুটের একটি ভিজ্যুয়ালাইজেশন দেখায়:

একজন মানুষ যার মুখের আকৃতি এবং মাত্রা নির্দেশ করার জন্য তার মুখের অংশগুলি জ্যামিতিকভাবে ম্যাপ করা হয়েছে।

ফেস ল্যান্ডমার্কার উদাহরণ কোডটি দেখায় যে কীভাবে টাস্ক থেকে প্রাপ্ত ফলাফলগুলি প্রদর্শন করতে হয়, আরও বিস্তারিত জানার জন্য OverlayView ক্লাসটি দেখুন।