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

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

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

কোড উদাহরণ

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

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

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

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

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

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

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

মূল উপাদান

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

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

সেটআপ

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

নির্ভরতা

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

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

মডেল

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

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

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

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

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

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

MediaPipe ফেস ল্যান্ডমার্কার টাস্কটি টাস্ক সেট আপ করতে 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() ফাংশনে এই কোডটি দেখতে পারেন।

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

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

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

IMAGE: একক ইমেজ ইনপুট জন্য মোড.

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

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
numFaces FaceLandmarker দ্বারা শনাক্ত করা যায় এমন মুখের সর্বাধিক সংখ্যা৷ smoothing শুধুমাত্র প্রয়োগ করা হয় যখন 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 ক্লাস দেখুন।