Nhận dạng văn bản và đặc điểm khuôn mặt Bộ công cụ học máy: iOS

1. Giới thiệu

Bộ công cụ học máy là một SDK dành cho thiết bị di động mang kiến thức chuyên môn về học máy của Google vào các ứng dụng Android và iOS trong một gói mạnh mẽ và dễ sử dụng. Cho dù là người mới hay có kinh nghiệm về công nghệ học máy, bạn đều có thể dễ dàng triển khai chức năng mình cần chỉ bằng vài dòng mã. Để bắt đầu, bạn không cần phải có kiến thức chuyên sâu về mạng nơron hoặc tối ưu hoá mô hình.

Tính năng này hoạt động ra sao?

Nhờ bộ công cụ học máy, bạn dễ dàng áp dụng các kỹ thuật học máy trong ứng dụng của mình bằng cách tích hợp các công nghệ học máy của Google như Mobile VisionTensorFlow Lite vào một SDK duy nhất. Dù bạn cần sức mạnh của các mô hình trên thiết bị theo thời gian thực của Mobile Vision hay cần sự linh hoạt của các mô hình phân loại hình ảnh tuỳ chỉnh TensorFlow Lite, Bộ công cụ học máy đều có thể giúp bạn chỉ cần vài dòng mã.

Lớp học lập trình này sẽ hướng dẫn bạn cách tạo ứng dụng iOS của riêng bạn có thể tự động phát hiện văn bản và đặc điểm khuôn mặt trong một hình ảnh.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ xây dựng một ứng dụng iOS bằng Bộ công cụ học máy. Ứng dụng này sẽ:

  • Dùng API nhận dạng văn bản của bộ công cụ học máy để phát hiện văn bản trong hình ảnh
  • Sử dụng API Phát hiện khuôn mặt của Bộ công cụ học máy để xác định các đặc điểm trên khuôn mặt trong hình ảnh

Hình ảnh Grace Hopper minh hoạ API nhận dạng khuôn mặt ML KItHình ảnh biển báo trên cỏ minh hoạ API nhận dạng văn bản

Kiến thức bạn sẽ học được

  • Cách dùng SDK Bộ công cụ học máy để dễ dàng thêm các tính năng Học máy nâng cao như nhận dạng văn bản, phát hiện tính năng khuôn mặt vào bất kỳ ứng dụng iOS nào

Bạn cần có

  • Phiên bản Xcode gần đây (v12.4 trở lên)
  • Trình mô phỏng iOS hoặc thiết bị iOS thực chạy iOS 10.0 trở lên
  • Bộ công cụ học máy chỉ hỗ trợ 2 kiến trúc 64 bit sau: x86_64arm64
  • Mã mẫu
  • Kiến thức cơ bản về phát triển iOS trong Swift
  • Hiểu biết cơ bản về các mô hình học máy

Lớp học lập trình này tập trung vào Bộ công cụ học máy. Các khái niệm và khối mã không liên quan được che khuất và chỉ được cung cấp cho bạn để sao chép và dán.

2. Chuẩn bị

Tải mã nguồn xuống

Nhấp vào đường liên kết sau đây để tải toàn bộ mã nguồn cho lớp học lập trình này:

Giải nén tệp zip đã tải xuống. Thao tác này sẽ tạo một thư mục gốc (mlkit-ios-codelab) chứa tất cả tài nguyên bạn cần. Đối với lớp học lập trình này, bạn chỉ cần các tài nguyên trong thư mục con vision.

Thư mục con vision trong kho lưu trữ mlkit-ios-codelab chứa 2 thư mục:

  • android_studio_folder.pngstarter (khởi đầu) – Mã khởi đầu mà bạn sẽ sử dụng trong lớp học lập trình này.
  • android_studio_folder.pnghoàn thiện – Mã đã hoàn tất cho ứng dụng mẫu hoàn chỉnh.

Thêm các phần phụ thuộc cho Bộ công cụ học máy bằng CocoaPods

CocoaPods được dùng để thêm các phần phụ thuộc của Bộ công cụ học máy vào ứng dụng của bạn. Nếu bạn chưa cài đặt CocoaPods trên máy của mình, hãy tìm hướng dẫn cài đặt tại đây. Sau khi cài đặt, hãy mở Podfile trong trình chỉnh sửa yêu thích rồi thêm Bộ công cụ học máy làm phần phụ thuộc:

Podfile

platform :ios, '10.0'
use_frameworks!

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

target 'MLKit-codelab' do
end

Cài đặt ML Kit Cacao Pods

Để đảm bảo tất cả các phần phụ thuộc đều có sẵn cho ứng dụng của bạn, bạn nên sử dụng dòng lệnh để cài đặt Gói Cacao của Bộ công cụ học máy.

Dòng lệnh

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

3. Chạy ứng dụng khởi đầu

Bây giờ, bạn đã sẵn sàng chạy ứng dụng lần đầu tiên. Nhấp vào 98205811bbed9d74.pngSChạy trong Xcode để biên dịch ứng dụng và chạy ứng dụng đó trên Trình mô phỏng iOS.

Ứng dụng sẽ chạy trên trình mô phỏng của bạn. Tại thời điểm này, bạn sẽ thấy một bố cục cơ bản có bộ chọn cho phép bạn chọn giữa 2 hình ảnh. Ở phần tiếp theo, bạn sẽ thêm tính năng nhận dạng văn bản vào ứng dụng để nhận dạng văn bản trong hình ảnh.

4. Thêm tính năng nhận dạng văn bản trên thiết bị

Ở bước này, chúng ta sẽ thêm chức năng vào ứng dụng của bạn để nhận dạng văn bản trong hình ảnh.

Nhập mô-đun MLVision

Kiểm tra để chắc chắn rằng các lệnh nhập sau vào lớp ViewController của bạn tồn tại.

ViewController.swift

import MLKit

Tạo VisionTextIdentifierr

Thêm các thuộc tính từng phần sau đây vào lớp ViewController.

ViewController.swift

private lazy var textRecognizer = TextRecognizer.textRecognizer()

Thiết lập và chạy tính năng nhận dạng văn bản trên thiết bị cho một hình ảnh

Thêm đoạn mã sau vào phương thức runTextRecognition của lớp 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)
  }
}

Mã ở trên định cấu hình trình phát hiện nhận dạng văn bản và gọi hàm processResult(from:, error:) cùng với phản hồi.

Xử lý phản hồi nhận dạng văn bản

Thêm mã sau vào processResult trong lớp ViewController để phân tích cú pháp kết quả và hiển thị chúng trong ứng dụng của bạn.

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

Chạy ứng dụng trên trình mô phỏng

Bây giờ, hãy nhấp vào 98205811bbed9d74.pngSRun (Chạy) trong Xcode. Sau khi ứng dụng tải, hãy đảm bảo rằng bạn đã chọn Image 1 trong bộ chọn rồi nhấp vào nút Find Text.

Bây giờ, ứng dụng của bạn sẽ có dạng như hình dưới đây, cho thấy kết quả nhận dạng văn bản và các hộp giới hạn phủ lên trên hình ảnh gốc.

7269fd8fcb4dc793.pngS

Ảnh: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0

Xin chúc mừng! Bạn vừa thêm tính năng nhận dạng văn bản trên thiết bị vào ứng dụng của mình bằng Bộ công cụ học máy! Công nghệ nhận dạng văn bản trên thiết bị rất phù hợp cho nhiều trường hợp sử dụng vì nó hoạt động ngay cả khi ứng dụng của bạn không có kết nối Internet. Công nghệ này đủ nhanh để sử dụng trên ảnh tĩnh cũng như khung hình video trực tiếp.

5. Thêm tính năng phát hiện đường viền khuôn mặt trên thiết bị

Ở bước này, chúng tôi sẽ thêm chức năng vào ứng dụng của bạn để phát hiện đường viền của các khuôn mặt trong ảnh.

Tạo Trình phát hiện khuôn mặt

Thêm các thuộc tính từng phần sau đây vào lớp 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)

Thiết lập và chạy tính năng phát hiện đường viền khuôn mặt trên thiết bị cho một hình ảnh

Thêm đoạn mã sau vào phương thức runFaceContourDetection của lớp 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)
    }
  }

Mã ở trên định cấu hình trình phát hiện nhận dạng văn bản và gọi hàm processResult(from:, error:) cùng với phản hồi.

Xử lý phản hồi của trình phát hiện khuôn mặt

Thêm mã sau vào processResult trong lớp ViewController để phân tích cú pháp kết quả và hiển thị chúng trong ứng dụng của bạn.

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

Cuối cùng, hãy thêm phương thức trợ giúp addContours vào lớp ViewController để vẽ các điểm đồng mức.

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

Chạy ứng dụng trên trình mô phỏng

Bây giờ, hãy nhấp vào 98205811bbed9d74.pngSRun (Chạy) trong Xcode. Sau khi ứng dụng tải, hãy đảm bảo rằng bạn đã chọn Image 2 trong bộ chọn rồi nhấp vào nút Find Face Contour. Bây giờ, ứng dụng của bạn sẽ có dạng như hình dưới đây, cho thấy các đường viền khuôn mặt của Grace Hopper là các điểm phủ lên trên hình ảnh gốc.

a5169b50dafbcb2f.png

Xin chúc mừng! Bạn vừa thêm tính năng phát hiện đường viền khuôn mặt trên thiết bị vào ứng dụng của mình bằng cách sử dụng tính năng phát hiện đường viền khuôn mặt của Bộ công cụ học máy trên thiết bị. Tính năng này hoạt động ngay cả khi ứng dụng của bạn không có kết nối Internet và đủ nhanh để sử dụng trên ảnh tĩnh cũng như khung hình video trực tiếp.

6. Xin chúc mừng!

Bạn đã dùng Bộ công cụ học máy để dễ dàng thêm các chức năng học máy nâng cao vào ứng dụng của mình.

Nội dung đã đề cập

  • Cách thêm Bộ công cụ học máy vào ứng dụng iOS
  • Cách sử dụng tính năng nhận dạng văn bản trên thiết bị trong Bộ công cụ học máy để tìm văn bản trong hình ảnh
  • Cách dùng tính năng nhận dạng khuôn mặt trên thiết bị trong Bộ công cụ học máy để xác định các đặc điểm khuôn mặt trong hình ảnh

Các bước tiếp theo

  • Sử dụng Bộ công cụ học máy trong ứng dụng iOS của riêng bạn.

Tìm hiểu thêm

  • https://g.co/mlkit