זיהוי טקסט ותווי פנים של ערכת למידת מכונה: iOS

1. מבוא

‫ML Kit הוא SDK לנייד שמביא את המומחיות של Google בתחום הלמידה מחישובים אל אפליקציות ל-Android ול-iOS בחבילה עוצמתית ונוחה לשימוש. לא משנה אם אתם חדשים בתחום של למידת מכונה או מנוסים בו, תוכלו להטמיע בקלות את הפונקציונליות שאתם צריכים בכמה שורות קוד בלבד. לא צריך ידע מעמיק ברשתות עצביות או באופטימיזציה של מודלים כדי להתחיל.

איך זה עובד

‫ML Kit מאפשר לכם להחיל בקלות טכניקות של למידת מכונה באפליקציות שלכם, על ידי שילוב של טכנולוגיות למידת מכונה של Google, כמו Mobile Vision ו-TensorFlow Lite, ב-SDK יחיד. בין אם אתם צריכים את העוצמה של היכולות בזמן אמת של מודלים במכשיר של Mobile Vision, או את הגמישות של מודלים מותאמים אישית של סיווג תמונות ב-TensorFlow Lite, ‏ ML Kit מאפשר לכם לעשות זאת בכמה שורות קוד בלבד.

ב-Codelab הזה תלמדו איך ליצור אפליקציה ל-iOS משלכם שיכולה לזהות באופן אוטומטי טקסט ותווי פנים בתמונה.

מה תפַתחו

ב-Codelab הזה תלמדו איך לפתח אפליקציה ל-iOS באמצעות ML Kit. האפליקציה שלכם:

  • שימוש ב-ML Kit Text Recognition API כדי לזהות טקסט בתמונות
  • שימוש ב-ML Kit Face Detection API כדי לזהות תכונות פנים בתמונות

תמונה של גרייס הופר שמדגימה את ML Kit Face Recognition APIתמונה של שלט על הדשא שממחישה את ה-API לזיהוי טקסט

מה תלמדו

  • איך משתמשים ב-ML Kit SDK כדי להוסיף בקלות יכולות מתקדמות של למידת מכונה, כמו זיהוי טקסט וזיהוי תכונות של פנים, לכל אפליקציה ל-iOS

מה תצטרכו

  • גרסה עדכנית של Xcode (גרסה 12.4 ואילך)
  • ‫iOS Simulator או מכשיר iOS פיזי עם iOS בגרסה 10.0 ומעלה
  • ‫ML Kit תומך רק בשתי הארכיטקטורות הבאות של 64 ביט: x86_64 ו-arm64
  • קוד לדוגמה
  • ידע בסיסי בפיתוח ל-iOS ב-Swift
  • הבנה בסיסית של מודלים של למידת מכונה

ה-Codelab הזה מתמקד ב-ML Kit. מושגים ובלוקים של קוד שלא רלוונטיים מוצגים בקצרה, ואתם יכולים פשוט להעתיק ולהדביק אותם.

2. תהליך ההגדרה

הורדת הקוד

כדי להוריד את כל הקוד של ה-Codelab הזה, לוחצים על הקישור הבא:

מחלצים את קובץ ה-ZIP שהורד. תיקיית הבסיס (mlkit-ios-codelab) תיווצר עם כל המשאבים שתצטרכו. ב-codelab הזה, תצטרכו רק את המשאבים בספריית המשנה vision.

ספריית המשנה vision במאגר mlkit-ios-codelab מכילה שתי ספריות:

  • android_studio_folder.pngstarter – קוד התחלתי שעליו מתבססים ב-Codelab הזה.
  • android_studio_folder.pngfinal – קוד מלא של אפליקציית הדוגמה המוגמרת.

הוספת יחסי התלות של ML Kit באמצעות CocoaPods

משתמשים ב-CocoaPods כדי להוסיף את יחסי התלות של ML Kit לאפליקציה. אם CocoaPods לא מותקן במחשב, אפשר למצוא את הוראות ההתקנה כאן. אחרי ההתקנה, פותחים את Podfile בכלי העריכה המועדף ומוסיפים את ML Kit כתלות:

Podfile

platform :ios, '10.0'
use_frameworks!

pod 'GoogleMLKit/FaceDetection'
pod 'GoogleMLKit/TextRecognition'

target 'MLKit-codelab' do
end

התקנת ML Kit Cocoa Pods

כדי לוודא שכל קשרי התלות זמינים לאפליקציה, צריך להשתמש בשורת הפקודה כדי להתקין את ה-Cocoa Pods של ML Kit.

שורת פקודה

# Make sure you are in the root of your app
pod install
xed .

3. הפעלת האפליקציה לתחילת הדרך

עכשיו אפשר להפעיל את האפליקציה בפעם הראשונה. לוחצים על 98205811bbed9d74.pngRun ב-Xcode כדי לקמפל את האפליקציה ולהריץ אותה בסימולטור של iOS.

האפליקציה אמורה להיפתח בסימולטור. בשלב הזה אמור להופיע פריסת תוכן בסיסית עם כלי לבחירת תמונות, שמאפשר לבחור בין 2 תמונות. בקטע הבא, מוסיפים לאפליקציה זיהוי טקסט כדי לזהות טקסט בתמונות.

4. הוספת זיהוי טקסט במכשיר

בשלב הזה, נוסיף לאפליקציה פונקציונליות לזיהוי טקסט בתמונות.

ייבוא המודול MLVision

בודקים שהייבוא הבא קיים בכיתה ViewController.

ViewController.swift

import MLKit

יצירת VisionTextRecognizer

מוסיפים את המאפיינים הבאים של lazy ל-class‏ ViewController.

ViewController.swift

private lazy var textRecognizer = TextRecognizer.textRecognizer()

הגדרה והפעלה של זיהוי טקסט בתמונה במכשיר

מוסיפים את הטקסט הבא לשיטה runTextRecognition של המחלקה ViewController:

ViewController.swift

func runTextRecognition(with image: UIImage) {
  let visionImage = VisionImage(image: image)
  textRecognizer.process(visionImage) { features, error in
    self.processResult(from: features, error: error)
  }
}

הקוד שלמעלה מגדיר את הגלאי לזיהוי טקסט ומפעיל את הפונקציה processResult(from:, error:) עם התגובה.

עיבוד התגובה של זיהוי הטקסט

מוסיפים את הקוד הבא ל- processResult בכיתה ViewController כדי לנתח את התוצאות ולהציג אותן באפליקציה.

ViewController.swift

 func processResult(from text: Text?, error: Error?) {
    removeDetectionAnnotations()
    guard error == nil, let text = text else {
      let errorString = error?.localizedDescription ?? Constants.detectionNoResultsMessage
      print("Text recognizer failed with error: \(errorString)")
      return
    }

    let transform = self.transformMatrix()

    // Blocks.
    for block in text.blocks {
      drawFrame(block.frame, in: .purple, transform: transform)

      // Lines.
      for line in block.lines {
        drawFrame(line.frame, in: .orange, transform: transform)

        // Elements.
        for element in line.elements {
          drawFrame(element.frame, in: .green, transform: transform)

          let transformedRect = element.frame.applying(transform)
          let label = UILabel(frame: transformedRect)
          label.text = element.text
          label.adjustsFontSizeToFitWidth = true
          self.annotationOverlayView.addSubview(label)
        }
      }
    }
  }

הרצת האפליקציה בסימולטור

עכשיו לוחצים על 98205811bbed9d74.pngRun (הפעלה) ב-Xcode. אחרי שהאפליקציה נטענת, מוודאים ש-Image 1 נבחר בכלי לבחירת תמונות ולוחצים על הלחצן Find Text.

האפליקציה שלכם אמורה להיראות עכשיו כמו בתמונה שלמטה, עם תוצאות זיהוי הטקסט ותיבות התוחמות שמוצגות מעל התמונה המקורית.

7269fd8fcb4dc793.png

צילום: קאי שרייבר (Kai Schreiber) / Wikimedia Commons / CC BY-SA 2.0

ברכות, הרגע הוספתם לאפליקציה שלכם זיהוי טקסט במכשיר באמצעות ML Kit! זיהוי טקסט במכשיר מתאים למקרים רבים, כי הוא פועל גם כשהאפליקציה לא מחוברת לאינטרנט, והוא מהיר מספיק לשימוש בתמונות סטילס וגם בפריים של סרטונים בשידור חי.

5. הוספת זיהוי קווי מתאר של הפנים במכשיר

בשלב הזה, נוסיף לאפליקציה פונקציונליות שתאפשר לזהות את קווי המתאר של הפנים בתמונות.

יצירת FaceDetector

מוסיפים את המאפיינים הבאים של lazy ל-class‏ ViewController.

ViewController.swift

private lazy var faceDetectorOption: FaceDetectorOptions = {
  let option = FaceDetectorOptions()
  option.contourMode = .all
  option.performanceMode = .fast
  return option
}()
private lazy var faceDetector = FaceDetector.faceDetector(options: faceDetectorOption)

הגדרה והרצה של זיהוי קווי מתאר של פנים בתמונה במכשיר

מוסיפים את הטקסט הבא לשיטה runFaceContourDetection של המחלקה ViewController:

ViewController.swift

  func runFaceContourDetection(with image: UIImage) {
    let visionImage = VisionImage(image: image)
    faceDetector.process(visionImage) { features, error in
      self.processResult(from: features, error: error)
    }
  }

הקוד שלמעלה מגדיר את הגלאי לזיהוי טקסט ומפעיל את הפונקציה processResult(from:, error:) עם התגובה.

עיבוד התגובה של גלאי הפנים

מוסיפים את הקוד הבא ל- processResult בכיתה ViewController כדי לנתח את התוצאות ולהציג אותן באפליקציה.

ViewController.swift

  func processResult(from faces: [Face]?, error: Error?) {
    removeDetectionAnnotations()
    guard let faces = faces else {
      return
    }

    for feature in faces {
      let transform = self.transformMatrix()
      let transformedRect = feature.frame.applying(transform)
      UIUtilities.addRectangle(
        transformedRect,
        to: self.annotationOverlayView,
        color: UIColor.green
      )
      self.addContours(forFace: feature, transform: transform)
    }
  }

לבסוף, מוסיפים את שיטת העזר addContours במחלקה ViewController כדי לשרטט את נקודות המתאר.

ViewController.swift

 private func addContours(forFace face: Face, transform: CGAffineTransform) {
    // Face
    if let faceContour = face.contour(ofType: .face) {
      for point in faceContour.points {
        drawPoint(point, in: .blue, transform: transform)
      }
    }

    // Eyebrows
    if let topLeftEyebrowContour = face.contour(ofType: .leftEyebrowTop) {
      for point in topLeftEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let bottomLeftEyebrowContour = face.contour(ofType: .leftEyebrowBottom) {
      for point in bottomLeftEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let topRightEyebrowContour = face.contour(ofType: .rightEyebrowTop) {
      for point in topRightEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let bottomRightEyebrowContour = face.contour(ofType: .rightEyebrowBottom) {
      for point in bottomRightEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }

    // Eyes
    if let leftEyeContour = face.contour(ofType: .leftEye) {
      for point in leftEyeContour.points {
        drawPoint(point, in: .cyan, transform: transform)
      }
    }
    if let rightEyeContour = face.contour(ofType: .rightEye) {
      for point in rightEyeContour.points {
        drawPoint(point, in: .cyan, transform: transform)
      }
    }

    // Lips
    if let topUpperLipContour = face.contour(ofType: .upperLipTop) {
      for point in topUpperLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let bottomUpperLipContour = face.contour(ofType: .upperLipBottom) {
      for point in bottomUpperLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let topLowerLipContour = face.contour(ofType: .lowerLipTop) {
      for point in topLowerLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let bottomLowerLipContour = face.contour(ofType: .lowerLipBottom) {
      for point in bottomLowerLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }

    // Nose
    if let noseBridgeContour = face.contour(ofType: .noseBridge) {
      for point in noseBridgeContour.points {
        drawPoint(point, in: .yellow, transform: transform)
      }
    }
    if let noseBottomContour = face.contour(ofType: .noseBottom) {
      for point in noseBottomContour.points {
        drawPoint(point, in: .yellow, transform: transform)
      }
    }
  }

הרצת האפליקציה בסימולטור

עכשיו לוחצים על 98205811bbed9d74.pngRun (הפעלה) ב-Xcode. אחרי שהאפליקציה נטענת, מוודאים ש-Image 2 נבחר בכלי לבחירת תמונות ולוחצים על הלחצן Find Face Contour. האפליקציה אמורה להיראות כמו בתמונה שלמטה, עם קווי המתאר של הפנים של גרייס הופר כנקודות שמוצגות על גבי התמונה המקורית.

a5169b50dafbcb2f.png

מזל טוב, הרגע הוספת לאפליקציה שלך זיהוי קווי מתאר של פנים במכשיר באמצעות ML Kit. זיהוי קווי מתאר של פנים במכשיר מתאים למקרים רבים כי הוא פועל גם כשהאפליקציה לא מחוברת לאינטרנט, והוא מהיר מספיק לשימוש בתמונות סטילס וגם בפריימים של סרטונים בשידור חי.

6. מעולה!

השתמשתם ב-ML Kit כדי להוסיף בקלות יכולות מתקדמות של למידת מכונה לאפליקציה.

מה נכלל

  • איך מוסיפים את ML Kit לאפליקציית iOS
  • איך משתמשים בזיהוי טקסט במכשיר ב-ML Kit כדי למצוא טקסט בתמונות
  • איך משתמשים בזיהוי פנים במכשיר ב-ML Kit כדי לזהות תכונות פנים בתמונות

השלבים הבאים

  • שימוש ב-ML Kit באפליקציית iOS משלכם.

מידע נוסף

  • https://g.co/mlkit