iOS-এ ML কিট দিয়ে মুখগুলি সনাক্ত করুন৷

আপনি ছবি এবং ভিডিওতে মুখ সনাক্ত করতে ML কিট ব্যবহার করতে পারেন।

তুমি শুরু করার আগে

  1. আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
  2. আপনার পডফাইলে ML কিট লাইব্রেরিগুলি অন্তর্ভুক্ত করুন:
    pod 'Firebase/MLVision', '6.25.0'
    # If you want to detect face contours (landmark detection and classification
    # don't require this additional model):
    pod 'Firebase/MLVisionFaceModel', '6.25.0'
    
    আপনি আপনার প্রকল্পের পডগুলি ইনস্টল বা আপডেট করার পরে, এটির .xcworkspace ব্যবহার করে আপনার Xcode প্রকল্পটি খুলতে ভুলবেন না।
  3. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import Firebase

    উদ্দেশ্য গ

    @import Firebase;

ইনপুট ইমেজ নির্দেশিকা

ML Kit সঠিকভাবে মুখ সনাক্ত করতে, ইনপুট চিত্রগুলিতে পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা মুখগুলি থাকতে হবে৷ সাধারণভাবে, আপনি একটি ছবিতে সনাক্ত করতে চান এমন প্রতিটি মুখ কমপক্ষে 100x100 পিক্সেল হওয়া উচিত। আপনি যদি মুখের কনট্যুরগুলি সনাক্ত করতে চান, এমএল কিটের উচ্চ রেজোলিউশন ইনপুট প্রয়োজন: প্রতিটি মুখ কমপক্ষে 200x200 পিক্সেল হওয়া উচিত।

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

খারাপ ছবির ফোকাস নির্ভুলতা ক্ষতি করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।

ক্যামেরার সাপেক্ষে একটি মুখের অভিযোজন ML কিট মুখের বৈশিষ্ট্যগুলিকেও প্রভাবিত করতে পারে৷ মুখ সনাক্তকরণ ধারণা দেখুন।

1. ফেস ডিটেক্টর কনফিগার করুন

আপনি একটি ছবিতে মুখ সনাক্তকরণ প্রয়োগ করার আগে, আপনি যদি মুখ সনাক্তকারীর ডিফল্ট সেটিংস পরিবর্তন করতে চান তবে একটি VisionFaceDetectorOptions অবজেক্টের সাথে সেই সেটিংসগুলি নির্দিষ্ট করুন৷ আপনি নিম্নলিখিত সেটিংস পরিবর্তন করতে পারেন:

সেটিংস
performanceMode fast (ডিফল্ট) | accurate

মুখ সনাক্ত করার সময় গতি বা নির্ভুলতার পক্ষে।

landmarkMode none (ডিফল্ট) | all

সমস্ত শনাক্ত করা মুখের মুখের "ল্যান্ডমার্ক"—চোখ, কান, নাক, গাল, মুখ— সনাক্ত করার চেষ্টা করতে হবে কিনা।

contourMode none (ডিফল্ট) | all

মুখের বৈশিষ্ট্যগুলির কনট্যুর সনাক্ত করতে হবে কিনা। একটি ছবিতে শুধুমাত্র সবচেয়ে বিশিষ্ট মুখের জন্য কনট্যুর সনাক্ত করা হয়।

classificationMode none (ডিফল্ট) | all

মুখগুলিকে "হাসি" এবং "চোখ খোলা" এর মতো বিভাগগুলিতে শ্রেণীবদ্ধ করা যায় কিনা।

minFaceSize CGFloat (ডিফল্ট: 0.1 )

ন্যূনতম আকার, চিত্রের সাপেক্ষে, সনাক্ত করার জন্য মুখগুলির।

isTrackingEnabled false (ডিফল্ট) | true

মুখগুলিকে একটি আইডি বরাদ্দ করা হবে কি না, যা সমস্ত ছবি জুড়ে মুখগুলি ট্র্যাক করতে ব্যবহার করা যেতে পারে৷

মনে রাখবেন যখন কনট্যুর সনাক্তকরণ সক্ষম করা হয়, শুধুমাত্র একটি মুখ সনাক্ত করা হয়, তাই মুখ ট্র্যাকিং দরকারী ফলাফল দেয় না। এই কারণে, এবং সনাক্তকরণের গতি উন্নত করতে, কনট্যুর সনাক্তকরণ এবং ফেস ট্র্যাকিং উভয়ই সক্ষম করবেন না।

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণগুলির মতো একটি VisionFaceDetectorOptions অবজেক্ট তৈরি করুন:

সুইফট

// High-accuracy landmark detection and face classification
let options = VisionFaceDetectorOptions()
options.performanceMode = .accurate
options.landmarkMode = .all
options.classificationMode = .all

// Real-time contour detection of multiple faces
let options = VisionFaceDetectorOptions()
options.contourMode = .all

উদ্দেশ্য গ

// High-accuracy landmark detection and face classification
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.performanceMode = FIRVisionFaceDetectorPerformanceModeAccurate;
options.landmarkMode = FIRVisionFaceDetectorLandmarkModeAll;
options.classificationMode = FIRVisionFaceDetectorClassificationModeAll;

// Real-time contour detection of multiple faces
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.contourMode = FIRVisionFaceDetectorContourModeAll;

2. ফেস ডিটেক্টর চালান

একটি ছবিতে মুখগুলি সনাক্ত করতে, ছবিটিকে UIImage বা CMSampleBufferRef হিসাবে VisionFaceDetector এর detect(in:) পদ্ধতিতে পাস করুন:

  1. VisionFaceDetector এর একটি উদাহরণ পান:

    সুইফট

    lazy var vision = Vision.vision()
    
    let faceDetector = vision.faceDetector(options: options)
    

    উদ্দেশ্য গ

    FIRVision *vision = [FIRVision vision];
    FIRVisionFaceDetector *faceDetector = [vision faceDetector];
    // Or, to change the default settings:
    // FIRVisionFaceDetector *faceDetector =
    //     [vision faceDetectorWithOptions:options];
    
  2. একটি UIImage বা একটি CMSampleBufferRef ব্যবহার করে একটি VisionImage অবজেক্ট তৈরি করুন।

    একটি UIImage ব্যবহার করতে:

    1. প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির imageOrientation বৈশিষ্ট্য .up হয়।
    2. সঠিকভাবে ঘোরানো UIImage ব্যবহার করে একটি VisionImage অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান, .topLeft , ব্যবহার করতে হবে।

      সুইফট

      let image = VisionImage(image: uiImage)

      উদ্দেশ্য গ

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    একটি CMSampleBufferRef ব্যবহার করতে:

    1. একটি VisionImageMetadata অবজেক্ট তৈরি করুন যা CMSampleBufferRef বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।

      ইমেজ ওরিয়েন্টেশন পেতে:

      সুইফট

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      উদ্দেশ্য গ

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:

      সুইফট

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      উদ্দেশ্য গ

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. CMSampleBufferRef অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটি VisionImage অবজেক্ট তৈরি করুন:

      সুইফট

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      উদ্দেশ্য গ

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. তারপরে, চিত্রটিকে detect(in:) পদ্ধতিতে পাস করুন:

    সুইফট

    faceDetector.process(visionImage) { faces, error in
      guard error == nil, let faces = faces, !faces.isEmpty else {
        // ...
        return
      }
    
      // Faces detected
      // ...
    }
    

    উদ্দেশ্য গ

    [faceDetector detectInImage:image
                     completion:^(NSArray<FIRVisionFace *> *faces,
                                  NSError *error) {
      if (error != nil) {
        return;
      } else if (faces != nil) {
        // Recognized faces
      }
    }];
    

3. সনাক্ত করা মুখ সম্পর্কে তথ্য পান

ফেস ডিটেকশন অপারেশন সফল হলে, ফেস ডিটেক্টর সম্পূর্ণ হ্যান্ডলারের কাছে VisionFace অবজেক্টের একটি অ্যারে পাস করে। প্রতিটি VisionFace অবজেক্ট একটি মুখের প্রতিনিধিত্ব করে যা ছবিতে সনাক্ত করা হয়েছিল। প্রতিটি মুখের জন্য, আপনি ইনপুট চিত্রে এর আবদ্ধ স্থানাঙ্ক পেতে পারেন, সেইসাথে আপনি ফেস ডিটেক্টরকে খুঁজে বের করার জন্য কনফিগার করেছেন এমন অন্য কোনো তথ্য। উদাহরণ স্বরূপ:

সুইফট

for face in faces {
  let frame = face.frame
  if face.hasHeadEulerAngleY {
    let rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
  }
  if face.hasHeadEulerAngleZ {
    let rotZ = face.headEulerAngleZ  // Head is rotated upward 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
  }
}

উদ্দেশ্য গ

for (FIRVisionFace *face in faces) {
  // Boundaries of face in image
  CGRect frame = face.frame;

  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):
  FIRVisionFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar];
  if (leftEar != nil) {
    FIRVisionPoint *leftEarPosition = leftEar.position;
  }

  // If contour detection was enabled:
  FIRVisionFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom];
  if (upperLipBottomContour != nil) {
    NSArray<FIRVisionPoint *> *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 এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।

  • থ্রটল ডিটেক্টর কল. ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, ফ্রেমটি ফেলে দিন।
  • আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।