12/08/2018, 16:38

Tìm hiểu về CoreML: machine learning trên iOS

Trong những năm trở lại đây, machine learning nổi lên là một lĩnh vực khá hot trong thế giới công nghệ thông tin. Nguồn nhân lực đổ vào nghiên cứu machine learning là rất lớn, mỗi năm có hàng nghìn bài báo nghiên cứu khoa học được giới thiệu, các công ty công nghệ lớn nhất thế giới như Google, ...

Trong những năm trở lại đây, machine learning nổi lên là một lĩnh vực khá hot trong thế giới công nghệ thông tin. Nguồn nhân lực đổ vào nghiên cứu machine learning là rất lớn, mỗi năm có hàng nghìn bài báo nghiên cứu khoa học được giới thiệu, các công ty công nghệ lớn nhất thế giới như Google, Microsoft, Apple,... cũng dành rất nhiều tài lực vào nghiên cứu lĩnh vực này.

Trước đây, việc áp dụng machine learning lên ứng dụng mobile là một việc khá khó khăn, các lập trình viên phải sử dụng thư viện của các bên thứ 3, gửi các api lên server của các bên khác để thực hiện quá trình học máy và trả về kết quả. quá trình này sử dụng request mạng, làm giảm trải nghiệm của người dùng. Tuy nhiên, trong WWDC 2017, Apple đã mang tới cho giới lập trình viên 1 công cụ tuyệt vời: CoreML framework. Đây là một framework tuyệt vời, giúp chúng ta có thể tích hợp các mô hình học máy ứng dụng iOS. Điều tuyệt vời nhất của thư viện này là ở chỗ nó cung cấp cho chúng ta các API rất đơn giản để làm việc, chúng ta không cần phải có những kiến thức cao siêu của machine learning, về học máy, về mạng nơron, ...

Trong bài viết này, tôi sẽ giới thiệu đến các bạn về thư viện CoreML này. Thông qua bài viết này, chúng ta sẽ tạo một ứng dụng nhận diện ảnh, với đầu vào là 1 ảnh của 1 vật, và đầu ra là dự đoán của máy về vật đó là gì. ok, let's start!

1. Tạo project

Trong bài viết này chúng ta tập chung tìm hiểu về CoreML, vì vậy chúng ta sẽ không đi sâu về những vấn đề khác. Việc tạo template project cũng khá đơn giản, các bạn cần những kiến thức cơ bản về ios là có thể làm được:

  • Đầu tiên, chúng ta tạo project với tên CoreMLTutorial, ngôn ngữ Swift.
  • Tiếp theo chúng ta vào storyboard, nhúng ViewController vào UINavigationController, thêm 2 UIBarButtonItem vào 2 bên trái phải của Navigation Item, đổi tên nút tuỳ thích hoặc như mình bên hình dưới (đặt tên sao cũng được không quan trọng)
  • Thêm 1 UIImageView vào chính giữa màn của ViewController, thêm constraint cho imageView đó với height và awidth là 299, và căn chính giữa với super view
  • Thêm 1 UILabel phía dưới UIImageView bên trên, thêm constraint sao cho đẹp và build không vỡ layout tuỳ ý các bạn
  • kéo các IBOutlet cho UIImageView và UILabel, kéo IBAction cho 2 nút trái phải của Navigation Item vào ViewController.swift như code bên dưới đây.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    @IBOutlet weak var resultLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func cameraButtonClicked(_ sender: Any) {
        
    }
    
    @IBAction func addButtonClicked(_ sender: Any) {
        
    }
    
}

OK, chúng ta đã có 2 nút camera và add để thêm ảnh từ camera hoặc photo libraty của máy, có 1 imageView để hiển thị ảnh đã chọn, ảnh này sẽ làm đầu vào cho CoreML để nhận diện ảnh, và có 1 resultLabel để hiển thị đầu ra của CoreML.

2. Thêm code cơ bản

Bây giờ chúng ta sẽ thêm code cho các hàm lấy ảnh, vì bài này chỉ tập chung vào CoreML nên chúng ta chỉ nói qua trong phần này. Các bạn implement ViewController.swift như sau:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    @IBOutlet weak var resultLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func cameraButtonClicked(_ sender: Any) {
        // 1
        if !UIImagePickerController.isSourceTypeAvailable(.camera) {
            return
        }
        
        let cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self
        cameraPicker.sourceType = .camera
        cameraPicker.allowsEditing = false
        
        present(cameraPicker, animated: true)
    }
    
    @IBAction func addButtonClicked(_ sender: Any) {
        // 2
        let picker = UIImagePickerController()
        picker.allowsEditing = false
        picker.delegate = self
        picker.sourceType = .photoLibrary
        present(picker, animated: true)
    }
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // 3
        dismiss(animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // 4
        picker.dismiss(animated: true)
        guard let image = info["UIImagePickerControllerOriginalImage"] as? UIImage else {
            return
        }
        
        imageView.image = image
        resultLabel.text = "Analyzing Image..."
    }
}

Bên trên chúng ta lần lượt làm những việc sau:

  • 1: Implement hàm cameraButtonClicked(_             </div>
            
            <div class=
0