1. Giới thiệu
Bộ công cụ học máy là một SDK di động mang 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ẽ nhưng dễ sử dụng. Cho dù là người mới bắt đầu hay đã có kinh nghiệm về học máy, bạn đều có thể dễ dàng triển khai chức năng cần thiết chỉ bằng một vài dòng mã. Bạn không cần có kiến thức chuyên sâu về mạng nơ-ron hoặc việc tối ưu hoá mô hình để bắt đầu.
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 Vision và TensorFlow Lite vào một SDK duy nhất. Cho dù bạn cần sức mạnh của các tính năng theo thời gian thực của các mô hình trên thiết bị của Mobile Vision hay sự linh hoạt của các mô hình phân loại hình ảnh TensorFlow Lite tuỳ chỉnh, Bộ công cụ học máy đều có thể giúp bạn làm điều đó chỉ bằng một 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 mình có thể tự động phát hiện văn bản và các đặc điểm trên 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ẽ:
|
|
Kiến thức bạn sẽ học được
- Cách sử dụng SDK Bộ công cụ học máy để dễ dàng thêm các chức năng nâng cao về Học máy như nhận dạng văn bản, phát hiện đặc điểm khuôn mặt vào bất kỳ ứng dụng iOS nào
Bạn cần có
- Một phiên bản Xcode gần đây (từ phiên bản 12.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_64vàarm64 - Mã mẫu
- Kiến thức cơ bản về việc phát triển iOS bằng 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 tinh chỉnh và cung cấp cho bạn, chỉ cầ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. Trong lớp học lập trình này, bạn sẽ 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 có 2 thư mục:
starter – Mã khởi đầu mà bạn sẽ xây dựng trong lớp học lập trình này.
final – Mã hoàn chỉnh cho ứng dụng mẫu đã hoàn tất.
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 chưa cài đặt CocoaPods trên máy, hãy xem 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 mà bạn yêu thích và 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 Cocoa Pods của Bộ công cụ học máy
Để đảm bảo rằng ứng dụng của bạn có tất cả các phần phụ thuộc, bạn nên dùng dòng lệnh để cài đặt Bộ công cụ học máy Cocoa Pods.
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
Giờ đây, bạn đã sẵn sàng chạy ứng dụng lần đầu tiên. Nhấp vào
Run (Chạ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. Tại thời điểm này, bạn sẽ thấy một bố cục cơ bản có một bộ chọn cho phép bạn chọn giữa 2 hình ảnh. Trong 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 để xác định 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ị
Trong bước này, chúng ta sẽ thêm chức năng nhận dạng văn bản trong hình ảnh vào ứng dụng.
Nhập mô-đun MLVision
Xác nhận rằng các hoạt động nhập sau đây tồn tại trong lớp ViewController của bạn.
ViewController.swift
import MLKit
Tạo VisionTextRecognizer
Thêm các thuộc tính trì hoãn sau vào lớp ViewController của bạn.
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ị đối với một hình ảnh
Thêm nội dung 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)
}
}
Đoạn 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:) bằng phản hồi.
Xử lý phản hồi nhận dạng văn bản
Thêm đoạn mã sau vào processResult trong lớp ViewController để phân tích cú pháp kết quả và hiển thị kết quả đó 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
Giờ hãy nhấp vào
Run (Chạy) trong Xcode. Sau khi ứng dụng tải xong, 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.
Giờ đây, ứng dụng của bạn sẽ có dạng như hình ảnh bên dưới, cho thấy kết quả nhận dạng văn bản và các hộp giới hạn được phủ lên trên hình ảnh gốc.

Ảnh: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0
Chúc mừng bạn đã 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! Tính năng nhận dạng văn bản trên thiết bị rất phù hợp với nhiều trường hợp sử dụng vì 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 cả hình ả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 nét khuôn mặt trên thiết bị
Trong bước này, chúng ta sẽ thêm chức năng vào ứng dụng để phát hiện đường viền khuôn mặt trong hình ảnh.
Tạo một FaceDetector
Thêm các thuộc tính trì hoãn sau vào lớp ViewController của bạn.
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ị đối với một hình ảnh
Thêm nội dung 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)
}
}
Đoạn 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:) bằng phản hồi.
Xử lý phản hồi của trình phát hiện khuôn mặt
Thêm đoạn mã sau vào processResult trong lớp ViewController để phân tích cú pháp kết quả và hiển thị kết quả đó 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 hỗ trợ addContours vào lớp ViewController để vẽ các điểm đường viền.
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
Giờ hãy nhấp vào
Run (Chạy) trong Xcode. Sau khi ứng dụng tải xong, 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. Giờ đây, ứng dụng của bạn sẽ trông giống như hình ảnh bên dưới, cho thấy đường nét khuôn mặt của Grace Hopper dưới dạng các điểm được phủ lên trên hình ảnh gốc.

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 Bộ công cụ học máy trên thiết bị. Tính năng phát hiện đường viền khuôn mặt trên thiết bị rất phù hợp với nhiều trường hợp sử dụng vì 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 đã sử 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 sử 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

