Face detection với Core Image trong iOS
Trong những năm gần đây, nhận diện khuôn mặt là một vấn đề được tìm hiểu rất nhiều trong ngành khoa học máy tính. Đã có rất nhiều nghiên cứu, những bài báo khoa học được đăng trên các trang công nghệ uy tín liên quan đến việc phân tích và nhận dạng khuôn mặt. Trên iOS, việc nhận dạng khuôn mặt đã ...
Trong những năm gần đây, nhận diện khuôn mặt là một vấn đề được tìm hiểu rất nhiều trong ngành khoa học máy tính. Đã có rất nhiều nghiên cứu, những bài báo khoa học được đăng trên các trang công nghệ uy tín liên quan đến việc phân tích và nhận dạng khuôn mặt.
Trên iOS, việc nhận dạng khuôn mặt đã được Apple tìm hiểu từ khá sớm, các API cho việc nhận diện khuôn mặt cũng đã được Apple viết và giới thiệu từ khi iOS 5 ra đời. Các API này là một phần của thư viện Core Image, cung cấp cho lập trình viên khả năng nhận dạng khuôn mặt thông qua các API đơn giản, rất tiện và không phải mất thời gian, công sức nghiên cứu các thuật toán về nhận diện khuôn mặt.
Trong bài viết này, tôi xin giới thiệu đến các bạn một tutorial đơn giản để nhận diện khuôn mặt bằng các face detection API trong CoreImage framework
Đầu tiên, chúng ta mở xCode, tạo iOS project, đặt tên project FaceDetection, chọn ngôn ngữ lập trình là Swift, devices Universal, bỏ tích các ô chọn và tạo project
Tiếp theo, chúng ta cần dữ liệu là ảnh mặt người để nhận diện, các bạn có thể lấy ảnh bất kỳ mình muốn, hoặc download ảnh giống tôi tại đây
Tiếp theo, chúng ta đổi tên ảnh thành "mark-zuckerberg" và ném vào Assets.xcassets của project. Lưu ý rằng tôi chỉ test ảnh trên simulator dùng device @2x, do vậy các bạn cần chú ý sử dụng các kích thước @1x và @3x trong project của mình.
Như vậy là bước chuẩn bị project của chúng ta đã xong. Bây giờ chúng ta sẽ bắt tay vào việc code. Đầu tiên, chúng ta mở file ViewController.swift và thêm code như sau:
var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView = UIImageView(image: UIImage(named: "mark-zuckerberg")) view.addSubview(imageView) }
Trong đoạn code trên, chúng ta khai báo property imageView, và trong hàm viewDidLoad(), chúng ta khởi tạo imageView với ảnh chúng ta đã download, và add imageView thành subview của ViewController.
Các bạn lưu ý, khi chúng ta khởi tạo một instance của UIImageView mà không khai báo frame thì instance này sẽ mặc định có origin là (0, 0) và độ dài (awidth, height) lần lượt là awidth và height của ảnh truyền vào. Ví dụ với ảnh của tôi ở đây có kích thước 547 x 547 và scale @2x. chúng ta sẽ có frame của imageView là (0, 0, 273.5, 273.5)
chạy thử project, chúng ta có kết quả như ảnh sau:
Bước tiếp theo, chúng ta sẽ viết code để nhận diện khuôn mặt cho ảnh trên, và hiện kết quả trên màn hình. Chúng ta thêm đoạn code sau:
func faceDetection(imageView: UIImageView) { // 1 let image = CIImage(CGImage: (imageView.image?.CGImage)!) // 2 let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) // 3 let features = detector.featuresInImage(image) as! [CIFaceFeature] // 4 let scale = UIScreen.mainScreen().scale // 5 for faceFeature in features { // 6 let faceFeatureBoundScaled = CGRect(x: faceFeature.bounds.origin.x/scale, y: faceFeature.bounds.origin.y/scale, awidth: faceFeature.bounds.size.awidth/scale, height: faceFeature.bounds.size.height/scale) // 7 let faceView = UIView(frame: CGRect(x: faceFeatureBoundScaled.origin.x, y: imageView.image!.size.height - faceFeatureBoundScaled.size.height - faceFeatureBoundScaled.origin.y, awidth: faceFeatureBoundScaled.size.awidth, height: faceFeatureBoundScaled.size.height)) faceView.layer.borderWidth = 1 faceView.layer.borderColor = UIColor.redColor().CGColor imageView.addSubview(faceView) } }
Bên trên, chúng ta viết function faceDetection với biến đầu vào là dạng UIImageView. Trong function:
- khởi tạo image với kiểu CIImage từ UIImage của UIImageView truyền vào function. CIImage là image của CoreImage framework, chúng ta cần chuyển từ UIImage sang CIImage để sử dụng trong các API của CoreImage
- khởi tạo detector kiểu CIDetector, đây chính là thứ chúng ta cần để nhận dạng khuôn mặt. Tất nhiên CIDetector cũng là class của CoreImage framework.
- Nhận dạng khuôn mặt. Vâng, các bạn không hề đọc sai đâu, chính xác đây là hàm nhận dạng khuôn mặt. thật không thể tin được, Chỉ cần gọi hàm duy nhất featuresInImage(