'ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?'

"
全文共4792字,預計學習時長10分鐘
"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

捕獲幀並添加到模型中


需要用鏡頭委託ARSCNViewDelegate來擴展ViewController,這得用到兩種委託函數,一個用於人臉檢測設置,另一個在檢測到人臉時更新鏡頭:


人臉檢測:


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

guard let device = sceneView.device else {
return nil
}

let faceGeometry = ARSCNFaceGeometry(device: device)

let node = SCNNode(geometry: faceGeometry)

node.geometry?.firstMaterial?.fillMode = .lines

return node
}


人臉檢測


很遺憾,鏡頭並沒有在我們睜眼或者張嘴時更新。這種情況下,就得相應地更新鏡頭。


更新鏡頭:


func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}

faceGeometry.update(from: faceAnchor.geometry)


提取整個面部的幾何結構信息,更新節點。


獲取相機的幀:


既然ARSCNView 承自AVCaptureSession,那就可以獲取cvPixelFuffer填充入模型。


從sceneView屬性中獲取的簡單方法:


guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


將相機的幀添加到模型:


到這一步,可以檢測到人臉了,相機的幀也已完備,接下來就能為模型填充內容了:


guard let model = try? VNCoreMLModel(for: FaceRecognition3().model) else {
fatalError("Unable to load model")
}

let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
}
}

guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
DispatchQueue.global().async {
do {
try handler.perform([coreMlRequest])
} catch {
print(error)
}
}


didUpdate Renderer


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

捕獲幀並添加到模型中


需要用鏡頭委託ARSCNViewDelegate來擴展ViewController,這得用到兩種委託函數,一個用於人臉檢測設置,另一個在檢測到人臉時更新鏡頭:


人臉檢測:


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

guard let device = sceneView.device else {
return nil
}

let faceGeometry = ARSCNFaceGeometry(device: device)

let node = SCNNode(geometry: faceGeometry)

node.geometry?.firstMaterial?.fillMode = .lines

return node
}


人臉檢測


很遺憾,鏡頭並沒有在我們睜眼或者張嘴時更新。這種情況下,就得相應地更新鏡頭。


更新鏡頭:


func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}

faceGeometry.update(from: faceAnchor.geometry)


提取整個面部的幾何結構信息,更新節點。


獲取相機的幀:


既然ARSCNView 承自AVCaptureSession,那就可以獲取cvPixelFuffer填充入模型。


從sceneView屬性中獲取的簡單方法:


guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


將相機的幀添加到模型:


到這一步,可以檢測到人臉了,相機的幀也已完備,接下來就能為模型填充內容了:


guard let model = try? VNCoreMLModel(for: FaceRecognition3().model) else {
fatalError("Unable to load model")
}

let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
}
}

guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
DispatchQueue.global().async {
do {
try handler.perform([coreMlRequest])
} catch {
print(error)
}
}


didUpdate Renderer


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

顯示被識別者的姓名


最後一個惱人的部分就是把3D文本投射到識別的人臉上。我們稍加思考就會想到,配置不如ARWorldTrackingConfiguration 功能那麼強,提供的函數和類並不多。用前置攝像頭代替,能實現的功能有限。


儘管不能跟蹤面部動作並進行相應的改變,但我們仍能將3D文本投射到屏幕上。


let text = SCNText(string: "", extrusionDepth: 2)
let font = UIFont(name: "Avenir-Heavy", size: 18)
text.font = font
let material = SCNMaterial()
material.diffuse.contents = UIColor.black
text.materials = [material]
text.firstMaterial?.isDoubleSided = true

let textNode = SCNNode(geometry: faceGeometry)
textNode.position = SCNVector3(-0.1, -0.01, -0.5)
textNode.scale = SCNVector3(0.002, 0.002, 0.002)
textNode.geometry = tex

SCNText示例


有了SCNText對象後,需要隨著相應的人臉進行更新,然後添加到rootNode:


let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
if topResult.identifier != "Unknown" {
text.string = topResult.identifier
self!.sceneView.scene.rootNode.addChildNode(textNode)
self!.sceneView.autoenablesDefaultLighting = true
}
}
}


"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

捕獲幀並添加到模型中


需要用鏡頭委託ARSCNViewDelegate來擴展ViewController,這得用到兩種委託函數,一個用於人臉檢測設置,另一個在檢測到人臉時更新鏡頭:


人臉檢測:


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

guard let device = sceneView.device else {
return nil
}

let faceGeometry = ARSCNFaceGeometry(device: device)

let node = SCNNode(geometry: faceGeometry)

node.geometry?.firstMaterial?.fillMode = .lines

return node
}


人臉檢測


很遺憾,鏡頭並沒有在我們睜眼或者張嘴時更新。這種情況下,就得相應地更新鏡頭。


更新鏡頭:


func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}

faceGeometry.update(from: faceAnchor.geometry)


提取整個面部的幾何結構信息,更新節點。


獲取相機的幀:


既然ARSCNView 承自AVCaptureSession,那就可以獲取cvPixelFuffer填充入模型。


從sceneView屬性中獲取的簡單方法:


guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


將相機的幀添加到模型:


到這一步,可以檢測到人臉了,相機的幀也已完備,接下來就能為模型填充內容了:


guard let model = try? VNCoreMLModel(for: FaceRecognition3().model) else {
fatalError("Unable to load model")
}

let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
}
}

guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
DispatchQueue.global().async {
do {
try handler.perform([coreMlRequest])
} catch {
print(error)
}
}


didUpdate Renderer


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

顯示被識別者的姓名


最後一個惱人的部分就是把3D文本投射到識別的人臉上。我們稍加思考就會想到,配置不如ARWorldTrackingConfiguration 功能那麼強,提供的函數和類並不多。用前置攝像頭代替,能實現的功能有限。


儘管不能跟蹤面部動作並進行相應的改變,但我們仍能將3D文本投射到屏幕上。


let text = SCNText(string: "", extrusionDepth: 2)
let font = UIFont(name: "Avenir-Heavy", size: 18)
text.font = font
let material = SCNMaterial()
material.diffuse.contents = UIColor.black
text.materials = [material]
text.firstMaterial?.isDoubleSided = true

let textNode = SCNNode(geometry: faceGeometry)
textNode.position = SCNVector3(-0.1, -0.01, -0.5)
textNode.scale = SCNVector3(0.002, 0.002, 0.002)
textNode.geometry = tex

SCNText示例


有了SCNText對象後,需要隨著相應的人臉進行更新,然後添加到rootNode:


let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
if topResult.identifier != "Unknown" {
text.string = topResult.identifier
self!.sceneView.scene.rootNode.addChildNode(textNode)
self!.sceneView.autoenablesDefaultLighting = true
}
}
}


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

最終結果


人臉檢測與識別系統成果展示。

"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

捕獲幀並添加到模型中


需要用鏡頭委託ARSCNViewDelegate來擴展ViewController,這得用到兩種委託函數,一個用於人臉檢測設置,另一個在檢測到人臉時更新鏡頭:


人臉檢測:


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

guard let device = sceneView.device else {
return nil
}

let faceGeometry = ARSCNFaceGeometry(device: device)

let node = SCNNode(geometry: faceGeometry)

node.geometry?.firstMaterial?.fillMode = .lines

return node
}


人臉檢測


很遺憾,鏡頭並沒有在我們睜眼或者張嘴時更新。這種情況下,就得相應地更新鏡頭。


更新鏡頭:


func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}

faceGeometry.update(from: faceAnchor.geometry)


提取整個面部的幾何結構信息,更新節點。


獲取相機的幀:


既然ARSCNView 承自AVCaptureSession,那就可以獲取cvPixelFuffer填充入模型。


從sceneView屬性中獲取的簡單方法:


guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


將相機的幀添加到模型:


到這一步,可以檢測到人臉了,相機的幀也已完備,接下來就能為模型填充內容了:


guard let model = try? VNCoreMLModel(for: FaceRecognition3().model) else {
fatalError("Unable to load model")
}

let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
}
}

guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
DispatchQueue.global().async {
do {
try handler.perform([coreMlRequest])
} catch {
print(error)
}
}


didUpdate Renderer


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

顯示被識別者的姓名


最後一個惱人的部分就是把3D文本投射到識別的人臉上。我們稍加思考就會想到,配置不如ARWorldTrackingConfiguration 功能那麼強,提供的函數和類並不多。用前置攝像頭代替,能實現的功能有限。


儘管不能跟蹤面部動作並進行相應的改變,但我們仍能將3D文本投射到屏幕上。


let text = SCNText(string: "", extrusionDepth: 2)
let font = UIFont(name: "Avenir-Heavy", size: 18)
text.font = font
let material = SCNMaterial()
material.diffuse.contents = UIColor.black
text.materials = [material]
text.firstMaterial?.isDoubleSided = true

let textNode = SCNNode(geometry: faceGeometry)
textNode.position = SCNVector3(-0.1, -0.01, -0.5)
textNode.scale = SCNVector3(0.002, 0.002, 0.002)
textNode.geometry = tex

SCNText示例


有了SCNText對象後,需要隨著相應的人臉進行更新,然後添加到rootNode:


let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
if topResult.identifier != "Unknown" {
text.string = topResult.identifier
self!.sceneView.scene.rootNode.addChildNode(textNode)
self!.sceneView.autoenablesDefaultLighting = true
}
}
}


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

最終結果


人臉檢測與識別系統成果展示。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

項目地址:https://github.com/omarmhaimdat/WhoAreYou?source=post_page---------------------------

"
全文共4792字,預計學習時長10分鐘
ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

本文將詳細介紹一個人臉檢測與識別系統的創建過程。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


首先,需要用單視圖應用程序創建iOS項目:

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建單視圖應用程序


創建一個新的項目之後,我們計劃用純代碼的應用程序來實現,不需要來回切換的按鍵或開關。


首先要刪除main.storyboard,並按如下所示設置AppDelegate.swift文件:


func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let controller = ViewController()
window?.rootViewController = controller

return true
}


AppDelegate.swift


確保從部署信息中刪除main函數storyboard。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

創建鏡頭並添加到子視圖中


視圖控制器只有一個,這是應用程序的主要切入點。


在此階段,需要引入ARKit並把ARSCNView實例化,自動將攝像機設備的實時視頻源變成鏡頭背景。此外,還能讓SceneKit攝像機自動與設備的現實動作相匹配,這意味著不再需要用錨來追蹤添加到鏡頭的物體位置。


提供屏幕邊界使攝像機會話佔據整個屏幕:


let sceneView = ARSCNView(frame: UIScreen.main.bounds)

ARSCNView實例化


在ViewDidLoad 函數中,要建立諸如委託函數之類的東西,還需要觀察幀統計信息從而監控是否有丟幀的情況:


self.view.addSubview(sceneView) // add the scene to the subview

sceneView.delegate = self // Setting the delegate for our view controller

sceneView.showsStatistics = true // Show statistics

在ViewDidLoad 函數中設置鏡頭


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

開啟AR人臉跟蹤配置會話


現在需要以AR人臉跟蹤配置開啟會話,該配置可以讓我們使用iPhone X、Xs、和Xr專用的前置TrueDepth相機。以下是來自蘋果公司的詳細解釋:


人臉跟蹤配置通過設備的前置攝像頭檢測用戶面部。運行該配置時,AR會話檢測用戶面部(如果在前置攝像頭畫面可見),將代表人臉的AR面錨添加到錨定列表。面錨會提供關於人臉的位置與方向、其拓撲結構以及描述面部表情特徵的信息。

ViewDidLoad 函數示例:


override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(sceneView)
sceneView.delegate = self
sceneView.showsStatistics = true
guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration,options:[.resetTracking, .removeExistingAnchors])
}

ViewDidLoad()函數



ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

訓練人臉識別模型


創建CoreML兼容的.mlmodel文件函數很多,在此介紹使用較為普遍的:


1. Turicreate:簡化了自定義機器學習模型研發的python庫,更重要的是可以將模型輸出到.mlmodel文件,用Xcode進行語法分析。


2. MLImageClassifierBuilder():這是一個內置的可以隨時使用的解決方法,通過Xcode連接到大量拖放界面,對相對簡單的模型進行訓練。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

MLImageClassifierBuilder


因為沒有大型數據庫,所以我們創建了大量模型測試這兩種解決方法,最後決定使用MLImageClassifierBuilder(),設有 67張“Omar MHAIMDAT”的照片(也就是我),還有在unsplash上找到的261張陌生面孔。


打開playground輸入以下代碼:


import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()

MLImageClassifierBuilder


建議最高迭代次數設為20,再進行剪裁增強,每張圖像會添加4個剪裁圖像實例。


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

捕獲幀並添加到模型中


需要用鏡頭委託ARSCNViewDelegate來擴展ViewController,這得用到兩種委託函數,一個用於人臉檢測設置,另一個在檢測到人臉時更新鏡頭:


人臉檢測:


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

guard let device = sceneView.device else {
return nil
}

let faceGeometry = ARSCNFaceGeometry(device: device)

let node = SCNNode(geometry: faceGeometry)

node.geometry?.firstMaterial?.fillMode = .lines

return node
}


人臉檢測


很遺憾,鏡頭並沒有在我們睜眼或者張嘴時更新。這種情況下,就得相應地更新鏡頭。


更新鏡頭:


func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}

faceGeometry.update(from: faceAnchor.geometry)


提取整個面部的幾何結構信息,更新節點。


獲取相機的幀:


既然ARSCNView 承自AVCaptureSession,那就可以獲取cvPixelFuffer填充入模型。


從sceneView屬性中獲取的簡單方法:


guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


將相機的幀添加到模型:


到這一步,可以檢測到人臉了,相機的幀也已完備,接下來就能為模型填充內容了:


guard let model = try? VNCoreMLModel(for: FaceRecognition3().model) else {
fatalError("Unable to load model")
}

let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
}
}

guard let pixelBuffer = self.sceneView.session.currentFrame?.capturedImage else { return }


let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
DispatchQueue.global().async {
do {
try handler.perform([coreMlRequest])
} catch {
print(error)
}
}


didUpdate Renderer


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

顯示被識別者的姓名


最後一個惱人的部分就是把3D文本投射到識別的人臉上。我們稍加思考就會想到,配置不如ARWorldTrackingConfiguration 功能那麼強,提供的函數和類並不多。用前置攝像頭代替,能實現的功能有限。


儘管不能跟蹤面部動作並進行相應的改變,但我們仍能將3D文本投射到屏幕上。


let text = SCNText(string: "", extrusionDepth: 2)
let font = UIFont(name: "Avenir-Heavy", size: 18)
text.font = font
let material = SCNMaterial()
material.diffuse.contents = UIColor.black
text.materials = [material]
text.firstMaterial?.isDoubleSided = true

let textNode = SCNNode(geometry: faceGeometry)
textNode.position = SCNVector3(-0.1, -0.01, -0.5)
textNode.scale = SCNVector3(0.002, 0.002, 0.002)
textNode.geometry = tex

SCNText示例


有了SCNText對象後,需要隨著相應的人臉進行更新,然後添加到rootNode:


let coreMlRequest = VNCoreMLRequest(model: model) {[weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first
else {
fatalError("Unexpected results")
}
DispatchQueue.main.async {[weak self] in
print(topResult.identifier)
if topResult.identifier != "Unknown" {
text.string = topResult.identifier
self!.sceneView.scene.rootNode.addChildNode(textNode)
self!.sceneView.autoenablesDefaultLighting = true
}
}
}


ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

最終結果


人臉檢測與識別系統成果展示。

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

項目地址:https://github.com/omarmhaimdat/WhoAreYou?source=post_page---------------------------

ZAO換臉引發全民熱議,人臉檢測技術究竟是個啥?

留言 點贊 關注

我們一起分享AI學習與發展的乾貨

編譯組:李世琛、翁夢徽

相關鏈接:

https://medium.com/better-programming/face-detection-and-recognition-with-coreml-and-arkit-8b676b7448be

如需轉載,請後臺留言,遵守轉載規範

"

相關推薦

推薦中...