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

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

আপনি শুরু করার আগে

  1. আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
  2. আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
    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'
    
    আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর .xcworkspace ব্যবহার করে খুলতে ভুলবেন না।
  3. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import Firebase

    উদ্দেশ্য-C

    @import Firebase;

ইনপুট চিত্রের নির্দেশিকা

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

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

Poor image focus can hurt accuracy. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।

ক্যামেরার সাপেক্ষে একটি মুখের অভিযোজন ML কিট মুখের বৈশিষ্ট্যগুলিকেও প্রভাবিত করতে পারে৷ See Face Detection Concepts .

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

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

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

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

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

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

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

মুখের বৈশিষ্ট্যগুলির কনট্যুর সনাক্ত করতে হবে কিনা। Contours are detected for only the most prominent face in an image.

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

Whether or not to classify faces into categories such as "smiling", and "eyes open".

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

The minimum size, relative to the image, of faces to detect.

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

Whether or not to assign faces an ID, which can be used to track faces across images.

Note that when contour detection is enabled, only one face is detected, so face tracking doesn't produce useful results. এই কারণে, এবং সনাক্তকরণের গতি উন্নত করতে, কনট্যুর সনাক্তকরণ এবং ফেস ট্র্যাকিং উভয়ই সক্ষম করবেন না।

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণগুলির মধ্যে একটির মতো একটি 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

উদ্দেশ্য-C

// 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)

    উদ্দেশ্য-C

    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. Create a VisionImage object using the correctly-rotated UIImage . কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান, .topLeft , ব্যবহার করতে হবে।

      সুইফট

      let image = VisionImage(image: uiImage)

      উদ্দেশ্য-C

      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
          }
      }

      উদ্দেশ্য-C

      - (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
      )

      উদ্দেশ্য-C

      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

      উদ্দেশ্য-C

      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
      // ...
    }

    উদ্দেশ্য-C

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

৩. সনাক্ত করা মুখগুলি সম্পর্কে তথ্য পান

যদি ফেস সনাক্তকরণ অপারেশন সফল হয়, তবে ফেস ডিটেক্টরটি 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
  }
}

উদ্দেশ্য-C

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;
  }
}

মুখের রূপের উদাহরণ

আপনি যখন মুখোমুখি কনট্যুর সনাক্তকরণ সক্ষম করেছেন, আপনি সনাক্ত করা প্রতিটি মুখের বৈশিষ্ট্যের জন্য পয়েন্টগুলির একটি তালিকা পাবেন। These points represent the shape of the feature. See the Face Detection Concepts Overview for details about how contours are represented.

The following image illustrates how these points map to a face (click the image to enlarge):

রিয়েল-টাইম ফেস সনাক্তকরণ

আপনি যদি রিয়েল-টাইম অ্যাপ্লিকেশনটিতে ফেস সনাক্তকরণ ব্যবহার করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জনের জন্য এই নির্দেশিকাগুলি অনুসরণ করুন:

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

    কনট্যুর সনাক্তকরণ
    ল্যান্ডমার্ক সনাক্তকরণ
    শ্রেণীবিভাগ
    ল্যান্ডমার্ক সনাক্তকরণ এবং শ্রেণীবিভাগ
    Contour detection and landmark detection
    কনট্যুর সনাক্তকরণ এবং শ্রেণীবিভাগ
    কনট্যুর সনাক্তকরণ, ল্যান্ডমার্ক সনাক্তকরণ, এবং শ্রেণীবিভাগ

  • fast মোড সক্ষম করুন (ডিফল্টরূপে সক্ষম)।

  • Consider capturing images at a lower resolution. However, also keep in mind this API's image dimension requirements.

  • Throttle calls to the detector. ডিটেক্টর চলাকালীন যদি কোনও নতুন ভিডিও ফ্রেম উপলভ্য হয় তবে ফ্রেমটি ফেলে দিন।
  • আপনি যদি ইনপুট চিত্রটিতে গ্রাফিক্স ওভারলে করতে ডিটেক্টরের আউটপুট ব্যবহার করে থাকেন তবে প্রথমে এমএল কিট থেকে ফলাফল পান, তারপরে চিত্রটি রেন্ডার করুন এবং একক পদক্ষেপে ওভারলে করুন। By doing so, you render to the display surface only once for each input frame. উদাহরণের জন্য শোকেস নমুনা অ্যাপ্লিকেশনটিতে পূর্বরূপ ওভারলভিউ এবং ফায়ারডেটেকশনওভারলভিউ ক্লাসগুলি দেখুন।