تشخیص متن و ویژگی های صورت کیت ML: iOS

۱. مقدمه

کیت ML یک SDK موبایل است که تخصص یادگیری ماشینی گوگل را در قالب یک بسته قدرتمند اما آسان برای استفاده، به برنامه‌های اندروید و iOS می‌آورد. چه در یادگیری ماشینی تازه‌کار باشید و چه باتجربه، می‌توانید به راحتی قابلیت‌های مورد نیاز خود را تنها با چند خط کد پیاده‌سازی کنید. برای شروع نیازی به دانش عمیق در مورد شبکه‌های عصبی یا بهینه‌سازی مدل نیست.

چگونه کار می‌کند؟

کیت ML با گردآوری فناوری‌های یادگیری ماشین گوگل، مانند Mobile Vision و TensorFlow Lite ، در یک SDK واحد، اعمال تکنیک‌های یادگیری ماشین را در برنامه‌های شما آسان می‌کند. چه به قدرت قابلیت‌های بلادرنگ مدل‌های روی دستگاه Mobile Vision نیاز داشته باشید و چه به انعطاف‌پذیری مدل‌های طبقه‌بندی تصویر سفارشی TensorFlow Lite، کیت ML این کار را تنها با چند خط کد امکان‌پذیر می‌کند.

این آزمایشگاه کدنویسی شما را در ساخت اپلیکیشن iOS خودتان که بتواند به طور خودکار متن و ویژگی‌های چهره را در یک تصویر تشخیص دهد، راهنمایی می‌کند.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک برنامه iOS با ML Kit خواهید ساخت. برنامه شما:

  • استفاده از API تشخیص متن ML Kit برای تشخیص متن در تصاویر
  • استفاده از API تشخیص چهره ML Kit برای شناسایی ویژگی‌های چهره در تصاویر

Image of Grace Hopper demonstrating ML KIt Face Recognition APIImage of sign on grass demonstrating text recognition API

آنچه یاد خواهید گرفت

  • نحوه استفاده از ML Kit SDK برای افزودن آسان قابلیت‌های پیشرفته یادگیری ماشینی مانند تشخیص متن، تشخیص چهره به هر برنامه iOS

آنچه نیاز دارید

  • نسخه جدید Xcode (نسخه ۱۲.۴ به بالا)
  • شبیه‌ساز iOS یا یک دستگاه فیزیکی iOS که iOS 10.0+ را اجرا می‌کند
  • کیت ML فقط از این دو معماری ۶۴ بیتی پشتیبانی می‌کند: x86_64 و arm64
  • کد نمونه
  • دانش پایه توسعه iOS در Swift
  • درک اولیه از مدل‌های یادگیری ماشین

این آزمایشگاه کد بر روی کیت یادگیری ماشین (ML Kit) تمرکز دارد. مفاهیم و بلوک‌های کد نامربوط، حذف شده‌اند و برای کپی و پیست ساده در اختیار شما قرار گرفته‌اند.

۲. راه‌اندازی

کد را دانلود کنید

برای دانلود تمام کدهای این codelab روی لینک زیر کلیک کنید:

فایل زیپ دانلود شده را از حالت فشرده خارج کنید. این کار یک پوشه ریشه ( mlkit-ios-codelab ) با تمام منابع مورد نیاز شما ایجاد می‌کند. برای این codelab، فقط به منابع موجود در زیرشاخه vision نیاز خواهید داشت.

زیرشاخه‌ی vision در مخزن mlkit-ios-codelab شامل دو دایرکتوری است:

  • پوشه android_studio.png کد آغازین - کدی که در این آزمایشگاه کد بر اساس آن کدنویسی می‌کنید.
  • پوشه android_studio.png نهایی - کد تکمیل‌شده برای برنامه نمونه نهایی.

وابستگی‌های ML Kit را با CocoaPods اضافه کنید

CocoaPods برای افزودن وابستگی‌های ML Kit به برنامه شما استفاده می‌شود. اگر CocoaPods را روی دستگاه خود نصب نکرده‌اید، دستورالعمل‌های نصب آن را اینجا بیابید. پس از نصب، Podfile را در ویرایشگر مورد علاقه خود باز کنید و ML Kit را به عنوان وابستگی اضافه کنید:

پادفایل

platform :ios, '10.0'
use_frameworks!

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

target 'MLKit-codelab' do
end

غلاف‌های کاکائو کیت ML را نصب کنید

برای اطمینان از اینکه همه وابستگی‌ها برای برنامه شما در دسترس هستند، باید از خط فرمان برای نصب ML Kit Cocoa Pods استفاده کنید.

خط فرمان

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

۳. برنامه‌ی آغازین را اجرا کنید

حالا آماده‌اید تا برنامه را برای اولین بار اجرا کنید. کلیک کنید ۹۸۲۰۵۸۱۱bbed9d74.png برای کامپایل کردن برنامه و اجرای آن در شبیه‌ساز iOS، آن را در Xcode اجرا کنید .

برنامه باید روی شبیه‌ساز شما اجرا شود. در این مرحله، باید یک طرح‌بندی اولیه را ببینید که دارای یک انتخابگر است که به شما امکان می‌دهد بین ۲ تصویر انتخاب کنید. در بخش بعدی، تشخیص متن را به برنامه خود اضافه می‌کنید تا متن موجود در تصاویر را شناسایی کند.

۴. اضافه کردن قابلیت تشخیص متن روی دستگاه

در این مرحله، ما قابلیتی را به برنامه شما اضافه خواهیم کرد تا متن موجود در تصاویر را تشخیص دهد.

ماژول MLVision را وارد کنید

تأیید کنید که import های زیر در کلاس ViewController شما وجود دارند.

ViewController.swift

import MLKit

ایجاد یک VisionTextRecognizer

ویژگی‌های lazy زیر را به کلاس 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)
        }
      }
    }
  }

اجرای برنامه روی شبیه‌ساز

حالا کلیک کنید ۹۸۲۰۵۸۱۱bbed9d74.png در Xcode اجرا کنید . پس از بارگذاری برنامه، مطمئن شوید که Image 1 در انتخابگر انتخاب شده است و روی دکمه‌ی Find Text کلیک کنید.

اکنون برنامه شما باید مانند تصویر زیر باشد، که نتایج تشخیص متن و کادرهای محصورکننده را در بالای تصویر اصلی نشان می‌دهد.

7269fd8fcb4dc793.png

عکس: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0

تبریک می‌گویم، شما به تازگی تشخیص متن روی دستگاه را با استفاده از کیت ML به برنامه خود اضافه کرده‌اید! تشخیص متن روی دستگاه برای بسیاری از موارد استفاده عالی است زیرا حتی زمانی که برنامه شما به اینترنت متصل نیست نیز کار می‌کند و به اندازه کافی سریع است که بتوان از آن در تصاویر ثابت و همچنین فریم‌های ویدیویی زنده استفاده کرد.

۵. اضافه کردن تشخیص خطوط چهره روی دستگاه

در این مرحله، ما قابلیتی را به برنامه شما اضافه خواهیم کرد تا خطوط چهره‌ها را در تصاویر تشخیص دهد.

یک تشخیص چهره ایجاد کنید

ویژگی‌های lazy زیر را به کلاس 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)
      }
    }
  }

اجرای برنامه روی شبیه‌ساز

حالا کلیک کنید ۹۸۲۰۵۸۱۱bbed9d74.png در Xcode اجرا کنید . پس از بارگذاری برنامه، مطمئن شوید که Image 2 در انتخابگر انتخاب شده است و روی دکمه‌ی Find Face Contour کلیک کنید. اکنون برنامه‌ی شما باید مانند تصویر زیر باشد که خطوط چهره‌ی گریس هاپر را به صورت نقاطی که روی تصویر اصلی قرار گرفته‌اند، نشان می‌دهد.

a5169b50dafbc2f.png

تبریک می‌گویم، شما به تازگی تشخیص خطوط چهره روی دستگاه را با استفاده از کیت یادگیری ماشین روی دستگاه به برنامه خود اضافه کرده‌اید. تشخیص خطوط چهره برای بسیاری از موارد استفاده عالی است زیرا حتی زمانی که برنامه شما به اینترنت متصل نیست نیز کار می‌کند و به اندازه کافی سریع است که هم در تصاویر ثابت و هم در فریم‌های ویدیویی زنده قابل استفاده باشد.

۶. تبریک می‌گویم!

شما از ML Kit برای افزودن آسان قابلیت‌های پیشرفته یادگیری ماشین به برنامه خود استفاده کرده‌اید.

آنچه ما پوشش داده‌ایم

  • نحوه اضافه کردن ML Kit به برنامه iOS شما
  • نحوه استفاده از تشخیص متن روی دستگاه در کیت ML برای یافتن متن در تصاویر
  • نحوه استفاده از تشخیص چهره روی دستگاه در کیت ML برای شناسایی ویژگی‌های چهره در تصاویر

مراحل بعدی

  • از کیت ML در برنامه iOS خود استفاده کنید.

اطلاعات بیشتر

  • https://g.co/mlkit