MediaPipe Face Detector टास्क की मदद से, किसी इमेज या वीडियो में मौजूद चेहरों का पता लगाया जा सकता है. इस टास्क का इस्तेमाल, एक फ़्रेम में चेहरों और चेहरे के हाव-भाव का पता लगाने के लिए किया जा सकता है. इस टास्क में मशीन लर्निंग (एमएल) मॉडल का इस्तेमाल किया जाता है. यह मॉडल एक इमेज या लगातार स्ट्रीम होने वाली इमेज के साथ काम करता है. इस टास्क में, चेहरे की जगह की जानकारी के साथ-साथ चेहरे की जानकारी भी दिखाई जाती है: बायां आंख, दाहिनी आंख, नाक की नोक, मुंह, बाईं आंख की ट्रैजिशन, और दाहिनी आंख की ट्रैजिशन.
इन निर्देशों में बताया गया कोड सैंपल, GitHub पर उपलब्ध है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.
कोड का उदाहरण
MediaPipe Tasks का उदाहरण कोड, Android के लिए फ़ेस डिटेक्टर ऐप्लिकेशन को लागू करने का एक आसान तरीका है. इस उदाहरण में, Android डिवाइस के कैमरे का इस्तेमाल किया गया है, ताकि लगातार वीडियो स्ट्रीम में चेहरों की पहचान की जा सके. ऐप्लिकेशन, डिवाइस की गैलरी से इमेज और वीडियो में मौजूद चेहरों का भी पता लगा सकता है.
अपने Android ऐप्लिकेशन के लिए, शुरुआत करने के लिए इस ऐप्लिकेशन का इस्तेमाल किया जा सकता है या किसी मौजूदा ऐप्लिकेशन में बदलाव करते समय इसे देखा जा सकता है. फ़ेस डिटेक्टर के उदाहरण वाले कोड को GitHub पर होस्ट किया गया है.
कोड डाउनलोड करें
नीचे दिए गए निर्देशों में git कमांड लाइन टूल का इस्तेमाल करके, उदाहरण कोड की लोकल कॉपी बनाने का तरीका बताया गया है.
उदाहरण कोड डाउनलोड करने के लिए:
- नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
git clone https://github.com/google-ai-edge/mediapipe-samples
- इसके अलावा, अपने git इंस्टेंस को स्पैर्स चेकआउट का इस्तेमाल करने के लिए कॉन्फ़िगर करें. इससे आपके पास सिर्फ़ फ़ेस डिटेक्टर के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें होंगी:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_detector/android
उदाहरण कोड का स्थानीय वर्शन बनाने के बाद, प्रोजेक्ट को Android Studio में इंपोर्ट किया जा सकता है. इसके बाद, ऐप्लिकेशन को चलाया जा सकता है. निर्देशों के लिए, Android के लिए सेटअप गाइड देखें.
मुख्य कॉम्पोनेंट
इन फ़ाइलों में चेहरे की पहचान करने वाले इस उदाहरण ऐप्लिकेशन के लिए ज़रूरी कोड मौजूद है:
- FaceDetectorHelper.kt - यह सुविधा चेहरे की पहचान करने वाली सुविधा को शुरू करता है. साथ ही, मॉडल और डेलिगेट को चुनने का काम भी करता है.
- CameraFragment.kt - डिवाइस के कैमरे को मैनेज करता है और इमेज और वीडियो इनपुट डेटा को प्रोसेस करता है.
- GalleryFragment.kt -
आउटपुट इमेज या वीडियो दिखाने के लिए,
OverlayView
के साथ इंटरैक्ट करता है. - OverlayView.kt - पता लगाए गए चेहरों के लिए, डिसप्ले को बाउंडिंग बॉक्स के साथ लागू करता है.
सेटअप
इस सेक्शन में, डेवलपमेंट एनवायरमेंट को सेट अप करने के मुख्य चरणों के बारे में बताया गया है. साथ ही, खास तौर पर फ़ेस डिटेक्टर का इस्तेमाल करने के लिए, कोड प्रोजेक्ट भी बताए गए हैं. MediaPipe Tasks का इस्तेमाल करने और प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के साथ-साथ अपना डेवलपमेंट एनवायरमेंट सेट अप करने से जुड़ी सामान्य जानकारी के लिए, Android के लिए सेटअप गाइड देखें.
डिपेंडेंसी
फ़ेस डिटेक्टर, com.google.mediapipe:tasks-vision
लाइब्रेरी का इस्तेमाल करता है. अपने Android ऐप्लिकेशन की build.gradle
फ़ाइल में यह डिपेंडेंसी जोड़ें:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
मॉडल
MediaPipe Face Detector टास्क को, एक प्रशिक्षित मॉडल बंडल की ज़रूरत है, जो इस टास्क के साथ काम कर सके. फ़ेस डिटेक्टर के लिए उपलब्ध प्रशिक्षित मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.
मॉडल चुनें और डाउनलोड करें और इसे अपनी प्रोजेक्ट डायरेक्ट्री में स्टोर करें:
<dev-project-root>/src/main/assets
ModelAssetPath
पैरामीटर में मॉडल का पाथ बताएं. उदाहरण कोड में, मॉडल की जानकारी FaceDetectorHelper.kt
फ़ाइल में दी गई है:
val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)
टास्क बनाएं
MediaPipe Face Detector टास्क, टास्क सेट अप करने के लिए createFromOptions()
फ़ंक्शन का इस्तेमाल करता है. createFromOptions()
फ़ंक्शन, कॉन्फ़िगरेशन के विकल्पों के लिए वैल्यू स्वीकार करता है. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन के विकल्प देखें.
फ़ेस डिटेक्टर इन इनपुट डेटा टाइप के साथ काम करता है: स्टिल इमेज, वीडियो फ़ाइलें, और लाइव वीडियो स्ट्रीम. टास्क बनाते समय, आपको अपने इनपुट डेटा टाइप के हिसाब से 'रनिंग मोड' तय करना होगा. टास्क बनाने और अनुमान लगाने का तरीका जानने के लिए, अपने इनपुट डेटा टाइप के हिसाब से टैब चुनें.
Image
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
वीडियो
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
लाइव स्ट्रीम
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
फ़ेस डिटेक्टर के उदाहरण वाले कोड को लागू करने पर, उपयोगकर्ता एक से दूसरे प्रोसेसिंग मोड पर स्विच कर सकता है. यह तरीका टास्क बनाने वाले कोड को ज़्यादा जटिल बना देता है.
ऐसा भी हो सकता है कि वह आपके इस्तेमाल के उदाहरण के लिए सही न हो. आपके पास इस कोड को FaceDetectorHelper.kt
फ़ाइल में मौजूद setupFaceDetector()
फ़ंक्शन में देखने का विकल्प है.
कॉन्फ़िगरेशन विकल्प
इस टास्क में, Android ऐप्लिकेशन के कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:
विकल्प का नाम | ब्यौरा | वैल्यू रेंज | डिफ़ॉल्ट मान |
---|---|---|---|
runningMode |
टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं: इमेज: सिंगल इमेज इनपुट के लिए मोड. वीडियो: वीडियो के डिकोड किए गए फ़्रेम का मोड. LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
minDetectionConfidence |
चेहरे की पहचान के लिए ज़रूरी सबसे कम कॉन्फ़िडेंस स्कोर. इस स्कोर को बेहतर माना जाता है. | Float [0,1] |
0.5 |
minSuppressionThreshold |
चेहरे की पहचान के लिए, नॉन-ज़्यादा से ज़्यादा सप्रेशन की सीमा, ताकि उसे ओवरलैप माना जा सके. | Float [0,1] |
0.3 |
resultListener |
जब फ़ेस डिटेक्टर लाइव स्ट्रीम मोड में हो, तो नतीजे लिसनर को
पहचान के नतीजों को एसिंक्रोनस तरीके से पाने के लिए सेट करता है. इसे सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो. |
N/A |
Not set |
errorListener |
गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. | N/A |
Not set |
डेटा तैयार करना
फ़ेस डिटेक्टर, इमेज, वीडियो फ़ाइल, और लाइव वीडियो स्ट्रीम के साथ काम करता है. यह टास्क, डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें साइज़ बदलना, घुमाना, और वैल्यू को सामान्य बनाना भी शामिल है.
इस कोड में बताया गया है कि डेटा को प्रोसेसिंग के लिए कैसे दें. इन सैंपल में, इमेज, वीडियो फ़ाइलों, और लाइव वीडियो स्ट्रीम के डेटा को मैनेज करने के तरीके के बारे में जानकारी शामिल है.
Image
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()
फ़ेस डिटेक्टर के उदाहरण वाले कोड में, डेटा तैयार करने का काम FaceDetectorHelper.kt
फ़ाइल में किया जाता है.
टास्क चलाएं
आपको किस तरह के डेटा के साथ काम करना है, इस आधार पर faceDetector.detect...()
वाला तरीका इस्तेमाल करें. यह तरीका खास तौर पर उस डेटा टाइप के हिसाब से होना चाहिए. अलग-अलग इमेज के लिए detect()
, वीडियो फ़ाइलों में फ़्रेम के लिए detectForVideo()
, और वीडियो स्ट्रीम के लिए detectAsync()
का इस्तेमाल करें. किसी वीडियो स्ट्रीम पर डिटेक्शन चलाते समय, यूज़र इंटरफ़ेस थ्रेड को ब्लॉक होने से बचाने के लिए, पक्का करें कि आप डिटेक्शन को किसी अलग थ्रेड पर चलाएं.
नीचे दिए गए कोड सैंपल, इन अलग-अलग डेटा मोड में फ़ेस डिटेक्टर चलाने के आसान उदाहरण दिखाते हैं:
Image
val result = faceDetector.detect(mpImage)
वीडियो
val timestampMs = i * inferenceIntervalMs faceDetector.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
लाइव स्ट्रीम
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() faceDetector.detectAsync(mpImage, frameTime)
निम्न पर ध्यान दें:
- वीडियो मोड या लाइव स्ट्रीम मोड में चलाते समय, फ़ेस डिटेक्टर टास्क को आपको इनपुट फ़्रेम का टाइमस्टैंप देना होगा.
- इमेज या वीडियो मोड में चलाते समय, फ़ेस डिटेक्टर का टास्क मौजूदा थ्रेड को तब तक ब्लॉक रखता है, जब तक इनपुट इमेज या फ़्रेम की प्रोसेसिंग पूरी नहीं हो जाती. यूज़र इंटरफ़ेस को ब्लॉक होने से बचाने के लिए, प्रोसेसिंग को बैकग्राउंड थ्रेड में चलाएं.
- लाइव स्ट्रीम मोड में चलाते समय, फ़ेस डिटेक्टर तुरंत वापस आ जाता है और मौजूदा थ्रेड को ब्लॉक नहीं करता है. जब भी इनपुट फ़्रेम की प्रोसेसिंग पूरी होगी, तब यह पहचान के नतीजे के साथ, नतीजे को सुनने वाले को शुरू करेगा. अगर पहचान फ़ंक्शन को तब कॉल किया जाता है, जब फ़ेस डिटेक्टर का टास्क किसी अन्य फ़्रेम को प्रोसेस करने में व्यस्त हो, तो यह टास्क नए इनपुट फ़्रेम को अनदेखा कर देगा.
चेहरे का पता लगाने वाले टूल के उदाहरण कोड में, detect
, detectForVideo
, और detectAsync
फ़ंक्शन के बारे में FaceDetectorHelper.kt
फ़ाइल में बताया गया है.
नतीजे मैनेज करें और दिखाएं
फ़ेस डिटेक्टर हर बार चलाए जाने के लिए, एक FaceDetectorResult
ऑब्जेक्ट दिखाता है. नतीजे के ऑब्जेक्ट में, पहचाने गए चेहरों के लिए बाउंडिंग बॉक्स और पहचाने गए हर चेहरे के लिए कॉन्फ़िडेंस स्कोर होता है.
इस टास्क के आउटपुट डेटा का एक उदाहरण यहां दिया गया है:
FaceDetectionResult:
Detections:
Detection #0:
BoundingBox:
origin_x: 126
origin_y: 100
width: 463
height: 463
Categories:
Category #0:
index: 0
score: 0.9729152917861938
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.18298381567001343
y: 0.2961040139198303
NormalizedKeypoint #1:
x: 0.3302789330482483
y: 0.29289937019348145
... (6 keypoints for each face)
Detection #1:
BoundingBox:
origin_x: 616
origin_y: 193
width: 430
height: 430
Categories:
Category #0:
index: 0
score: 0.9251380562782288
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.6151331663131714
y: 0.3713381886482239
NormalizedKeypoint #1:
x: 0.7460576295852661
y: 0.38825345039367676
... (6 keypoints for each face)
इस इमेज में, टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है:
बिना बाउंडिंग बॉक्स वाली इमेज के लिए, ओरिजनल इमेज देखें.
फ़ेस डिटेक्टर के उदाहरण वाले कोड से, टास्क के नतीजों को दिखाने का तरीका पता चलता है. ज़्यादा जानकारी के लिए, OverlayView
क्लास देखें.