আপনি ছবি এবং ভিডিওতে মুখ সনাক্ত করতে ML কিট ব্যবহার করতে পারেন।
চেষ্টা করে দেখুন
- এই API এর একটি উদাহরণ ব্যবহার দেখতে নমুনা অ্যাপের সাথে খেলুন।
- কোডল্যাবের সাথে কোডটি নিজে চেষ্টা করুন।
আপনি শুরু করার আগে
- আপনার পডফাইলে নিম্নলিখিত এমএল কিট পডগুলি অন্তর্ভুক্ত করুন:
pod 'GoogleMLKit/FaceDetection', '3.2.0'
- আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, এটির
.xcworkspace
ব্যবহার করে আপনার Xcode প্রকল্পটি খুলুন। ML Kit Xcode সংস্করণ 12.4 বা তার বেশিতে সমর্থিত।
ইনপুট ইমেজ নির্দেশিকা
মুখ শনাক্তকরণের জন্য, আপনার কমপক্ষে 480x360 পিক্সেলের মাত্রা সহ একটি চিত্র ব্যবহার করা উচিত। ML Kit সঠিকভাবে মুখ সনাক্ত করতে, ইনপুট চিত্রগুলিতে পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা মুখগুলি থাকতে হবে৷ সাধারণভাবে, আপনি একটি ছবিতে সনাক্ত করতে চান এমন প্রতিটি মুখ কমপক্ষে 100x100 পিক্সেল হওয়া উচিত। আপনি যদি মুখের কনট্যুরগুলি সনাক্ত করতে চান, এমএল কিটের উচ্চ রেজোলিউশন ইনপুট প্রয়োজন: প্রতিটি মুখ কমপক্ষে 200x200 পিক্সেল হওয়া উচিত।
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে মুখগুলি সনাক্ত করেন তবে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রাগুলিও বিবেচনা করতে চাইতে পারেন৷ ছোট ছবিগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে ছবিগুলি ক্যাপচার করুন, তবে উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রাখবেন এবং নিশ্চিত করুন যে বিষয়ের মুখ যতটা সম্ভব ছবিটি দখল করে। এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।
খারাপ ইমেজ ফোকাস এছাড়াও নির্ভুলতা প্রভাবিত করতে পারে. আপনি গ্রহণযোগ্য ফলাফল না পেলে, ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলুন।
ক্যামেরার সাপেক্ষে একটি মুখের অভিযোজন ML কিট মুখের বৈশিষ্ট্যগুলিকেও প্রভাবিত করতে পারে৷ মুখ সনাক্তকরণ ধারণা দেখুন।
1. ফেস ডিটেক্টর কনফিগার করুন
আপনি একটি ছবিতে মুখ সনাক্তকরণ প্রয়োগ করার আগে, আপনি যদি ফেস ডিটেক্টরের ডিফল্ট সেটিংস পরিবর্তন করতে চান তবে একটিFaceDetectorOptions
অবজেক্টের সাথে সেই সেটিংসগুলি নির্দিষ্ট করুন৷ আপনি নিম্নলিখিত সেটিংস পরিবর্তন করতে পারেন:সেটিংস | |
---|---|
performanceMode | fast (ডিফল্ট) | accurate মুখ সনাক্ত করার সময় গতি বা নির্ভুলতার পক্ষে। |
landmarkMode | none (ডিফল্ট) | all সমস্ত শনাক্ত করা মুখের মুখের "ল্যান্ডমার্ক"—চোখ, কান, নাক, গাল, মুখ— সনাক্ত করার চেষ্টা করতে হবে কিনা। |
contourMode | none (ডিফল্ট) | all মুখের বৈশিষ্ট্যগুলির কনট্যুর সনাক্ত করতে হবে কিনা। একটি ছবিতে শুধুমাত্র সবচেয়ে বিশিষ্ট মুখের জন্য কনট্যুর সনাক্ত করা হয়। |
classificationMode | none (ডিফল্ট) | all "হাসি" এবং "চোখ খোলা" এর মতো বিভাগগুলিতে মুখগুলিকে শ্রেণীবদ্ধ করা হোক বা না হোক। |
minFaceSize | CGFloat (ডিফল্ট: 0.1 )মাথার প্রস্থ থেকে ছবির প্রস্থের অনুপাত হিসাবে প্রকাশ করা সবচেয়ে ছোট কাঙ্ক্ষিত মুখের আকার সেট করে৷ |
isTrackingEnabled | false (ডিফল্ট) | true মুখগুলিকে একটি আইডি বরাদ্দ করা হবে কি না, যেটি ছবি জুড়ে মুখগুলি ট্র্যাক করতে ব্যবহার করা যেতে পারে৷ মনে রাখবেন যখন কনট্যুর সনাক্তকরণ সক্ষম করা হয়, শুধুমাত্র একটি মুখ সনাক্ত করা হয়, তাই মুখ ট্র্যাকিং দরকারী ফলাফল দেয় না। এই কারণে, এবং সনাক্তকরণের গতি উন্নত করতে, কনট্যুর সনাক্তকরণ এবং ফেস ট্র্যাকিং উভয়ই সক্ষম করবেন না। |
উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণগুলির মতো একটি FaceDetectorOptions
অবজেক্ট তৈরি করুন:
সুইফট
// High-accuracy landmark detection and face classification let options = FaceDetectorOptions() options.performanceMode = .accurate options.landmarkMode = .all options.classificationMode = .all // Real-time contour detection of multiple faces // options.contourMode = .all
উদ্দেশ্য-C
// High-accuracy landmark detection and face classification MLKFaceDetectorOptions *options = [[MLKFaceDetectorOptions alloc] init]; options.performanceMode = MLKFaceDetectorPerformanceModeAccurate; options.landmarkMode = MLKFaceDetectorLandmarkModeAll; options.classificationMode = MLKFaceDetectorClassificationModeAll; // Real-time contour detection of multiple faces // options.contourMode = MLKFaceDetectorContourModeAll;
2. ইনপুট ইমেজ প্রস্তুত করুন
একটি ছবিতে মুখগুলি সনাক্ত করতে,process(_:completion:)
বা results(in:)
পদ্ধতি ব্যবহার করে FaceDetector
কাছে একটি UIImage
বা একটি CMSampleBufferRef
হিসাবে চিত্রটি পাস করুন: একটি UIImage
বা একটি CMSampleBuffer
ব্যবহার করে একটি VisionImage
অবজেক্ট তৈরি করুন।
আপনি একটি UIImage
ব্যবহার করলে, এই পদক্ষেপগুলি অনুসরণ করুন:
-
UIImage
দিয়ে একটিVisionImage
অবজেক্ট তৈরি করুন। সঠিক.orientation
উল্লেখ করতে ভুলবেন না।সুইফট
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
উদ্দেশ্য-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
আপনি যদি একটি
CMSampleBuffer
ব্যবহার করেন তবে এই পদক্ষেপগুলি অনুসরণ করুন:CMSampleBuffer
এ থাকা ইমেজ ডেটার ওরিয়েন্টেশন নির্দিষ্ট করুন।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
উদ্দেশ্য-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
-
CMSampleBuffer
অবজেক্ট এবং ওরিয়েন্টেশন ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
উদ্দেশ্য-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. ফেসডিটেক্টরের একটি উদাহরণ পান
FaceDetector
এর একটি উদাহরণ পান:সুইফট
let faceDetector = FaceDetector.faceDetector(options: options)
উদ্দেশ্য-C
MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
4. ইমেজ প্রক্রিয়া
তারপর, ছবিটিprocess()
পদ্ধতিতে পাস করুন:সুইফট
weak var weakSelf = self faceDetector.process(visionImage) { faces, error in guard let strongSelf = weakSelf else { print("Self is nil!") return } guard error == nil, let faces = faces, !faces.isEmpty else { // ... return } // Faces detected // ... }
উদ্দেশ্য-C
[faceDetector processImage:image completion:^(NSArray<MLKFace *> *faces, NSError *error) { if (error != nil) { return; } if (faces.count > 0) { // Recognized faces } }];
5. সনাক্ত করা মুখ সম্পর্কে তথ্য পান
ফেস ডিটেকশন অপারেশন সফল হলে, ফেস ডিটেক্টর সমাপ্তি হ্যান্ডলারেFace
অবজেক্টের একটি অ্যারে পাঠায়। প্রতিটিFace
অবজেক্ট একটি মুখের প্রতিনিধিত্ব করে যা ছবিতে সনাক্ত করা হয়েছিল। প্রতিটি মুখের জন্য, আপনি ইনপুট চিত্রে এর আবদ্ধ স্থানাঙ্ক পেতে পারেন, সেইসাথে আপনি ফেস ডিটেক্টরকে খুঁজে বের করার জন্য কনফিগার করেছেন এমন অন্য কোনো তথ্য। যেমন:সুইফট
for face in faces { let frame = face.frame if face.hasHeadEulerAngleX { let rotX = face.headEulerAngleX // Head is rotated to the uptoward rotX degrees } if face.hasHeadEulerAngleY { let rotY = face.headEulerAngleY // Head is rotated to the right rotY degrees } if face.hasHeadEulerAngleZ { let rotZ = face.headEulerAngleZ // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): if let leftEye = face.landmark(ofType: .leftEye) { let leftEyePosition = leftEye.position } // If contour detection was enabled: if let leftEyeContour = face.contour(ofType: .leftEye) { let leftEyePoints = leftEyeContour.points } if let upperLipBottomContour = face.contour(ofType: .upperLipBottom) { let upperLipBottomPoints = upperLipBottomContour.points } // If classification was enabled: if face.hasSmilingProbability { let smileProb = face.smilingProbability } if face.hasRightEyeOpenProbability { let rightEyeOpenProb = face.rightEyeOpenProbability } // If face tracking was enabled: if face.hasTrackingID { let trackingId = face.trackingID } }
উদ্দেশ্য-C
for (MLKFace *face in faces) { // Boundaries of face in image CGRect frame = face.frame; if (face.hasHeadEulerAngleX) { CGFloat rotX = face.headEulerAngleX; // Head is rotated to the upward rotX degrees } if (face.hasHeadEulerAngleY) { CGFloat rotY = face.headEulerAngleY; // Head is rotated to the right rotY degrees } if (face.hasHeadEulerAngleZ) { CGFloat rotZ = face.headEulerAngleZ; // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): MLKFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar]; if (leftEar != nil) { MLKVisionPoint *leftEarPosition = leftEar.position; } // If contour detection was enabled: MLKFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom]; if (upperLipBottomContour != nil) { NSArray<MLKVisionPoint *> *upperLipBottomPoints = upperLipBottomContour.points; if (upperLipBottomPoints.count > 0) { NSLog("Detected the bottom contour of the subject's upper lip.") } } // If classification was enabled: if (face.hasSmilingProbability) { CGFloat smileProb = face.smilingProbability; } if (face.hasRightEyeOpenProbability) { CGFloat rightEyeOpenProb = face.rightEyeOpenProbability; } // If face tracking was enabled: if (face.hasTrackingID) { NSInteger trackingID = face.trackingID; } }
মুখের রূপের উদাহরণ
যখন আপনার মুখের কনট্যুর সনাক্তকরণ সক্ষম থাকে, তখন আপনি সনাক্ত করা প্রতিটি মুখের বৈশিষ্ট্যের জন্য পয়েন্টগুলির একটি তালিকা পাবেন। এই পয়েন্টগুলি বৈশিষ্ট্যের আকৃতির প্রতিনিধিত্ব করে। কনট্যুরগুলি কীভাবে উপস্থাপন করা হয় সে সম্পর্কে বিশদ বিবরণের জন্য মুখ সনাক্তকরণ ধারণা দেখুন।
নিম্নলিখিত চিত্রটি ব্যাখ্যা করে কিভাবে এই পয়েন্টগুলি একটি মুখের সাথে মানচিত্র করে, এটিকে বড় করতে ছবিটিতে ক্লিক করুন:
রিয়েল-টাইম ফেস ডিটেকশন
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে মুখ সনাক্তকরণ ব্যবহার করতে চান, সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
মুখের কনট্যুর সনাক্তকরণ বা শ্রেণীবিভাগ এবং ল্যান্ডমার্ক সনাক্তকরণ ব্যবহার করতে ফেস ডিটেক্টর কনফিগার করুন, তবে উভয়ই নয়:
কনট্যুর সনাক্তকরণ
ল্যান্ডমার্ক সনাক্তকরণ
শ্রেণীবিভাগ
ল্যান্ডমার্ক সনাক্তকরণ এবং শ্রেণীবিভাগ
কনট্যুর সনাক্তকরণ এবং ল্যান্ডমার্ক সনাক্তকরণ
কনট্যুর সনাক্তকরণ এবং শ্রেণীবিভাগ
কনট্যুর সনাক্তকরণ, ল্যান্ডমার্ক সনাক্তকরণ, এবং শ্রেণীবিভাগfast
মোড সক্ষম করুন (ডিফল্টরূপে সক্ষম)।কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। যাইহোক, এই API এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।
- ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য, ডিটেক্টরের
results(in:)
সিঙ্ক্রোনাস API ব্যবহার করুন। প্রদত্ত ভিডিও ফ্রেম থেকে সুসংগতভাবে ফলাফল পেতেAVCaptureVideoDataOutputSampleBufferDelegate
'scaptureOutput(_, didOutput:from:)
ফাংশন থেকে এই পদ্ধতিতে কল করুন।AVCaptureVideoDataOutput
এরalwaysDiscardsLateVideoFrames
ডিসকার্ডসলেটভিডিওফ্রেমগুলিকে ডিটেক্টরে কল থ্রোটল করার জন্যtrue
হিসাবে রাখুন৷ ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, এটি বাদ দেওয়া হবে৷ - আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াকৃত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। একটি উদাহরণের জন্য ML কিট কুইকস্টার্ট নমুনায় UpdatePreviewOverlayViewWithLastFrame দেখুন।
অন্য কিছু উল্লেখ না করা থাকলে, এই পৃষ্ঠার কন্টেন্ট Creative Commons Attribution 4.0 License-এর অধীনে এবং কোডের নমুনাগুলি Apache 2.0 License-এর অধীনে লাইসেন্স প্রাপ্ত। আরও জানতে, Google Developers সাইট নীতি দেখুন। Java হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2024-11-13 UTC-তে শেষবার আপডেট করা হয়েছে।
[null,null,["2024-11-13 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[]]