设备人脸识别 - Swift

时间:2016-09-22 20:37:37

标签: ios swift offline face-detection face-recognition

我有一个应用程序,可以获取用户的所有图像(来自Photo应用程序的所有资产)。之后应用程序应该运行抛出所有图像并检测面部并返回其面部地标,然后查看数据库以查看是否有任何朋友具有相同的地标(识别朋友面孔),类似于Facebook在时刻应用程序上执行的操作并在网上。然后,该应用将显示朋友在其中显示的所有照片。我的应用程序的重要部分是用户隐私,因此我希望将整个过程保留在设备上,而不是将其发送到在线服务。将其保留在设备上的另一个好处是,我的应用程序中的每个用户都可以拥有数千个图像,并且使用外部服务将是扩展的并且可能会降低性能(如果每个图像都需要发送到服务器)。

根据我所做的研究,有许多在线服务(但它们不符合我的要求 - 保持流程脱机)。还有CIDector可以检测到面部,然后您可以返回一些功能,例如眼睛位置和嘴部位置(我不相信这对于可靠的识别是足够好的)。我也听说过Luxand,openCV和openFace,这些都是设备识别,但是是C ++类,这使得很难与swift项目集成(文档不是很好,并没有解释如何集成它适用于您的项目以及如何在swift上执行人脸识别)。

所以我的问题是,是否有任何方法可以执行面部检测以返回设备上的面部标志?

  • 如果没有,我可以使用任何其他方式或服务。

此外,如果有任何有效且快速的方式来执行面部检测和识别,如果用户可能有数千个图像。

顺便说一下,我处于开发的早期阶段,我正在寻找可用于开发阶段的免费服务。

1 个答案:

答案 0 :(得分:2)

iOS在CoreImage框架中具有原生面部检测效果非常酷。您也可以检测眼睛等。只需查看此代码,即可展示如何使用它。

func detect() {

guard let personciImage = CIImage(image: personPic.image!) else {
    return
}

let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
let faces = faceDetector.featuresInImage(personciImage)

// converting to other coordinate system
let ciImageSize = personciImage.extent.size
var transform = CGAffineTransformMakeScale(1, -1)
transform = CGAffineTransformTranslate(transform, 0, -ciImageSize.height)

for face in faces as! [CIFaceFeature] {

    print("Found bounds are \(face.bounds)")

    // calculating place for faceBox
    var faceViewBounds = CGRectApplyAffineTransform(face.bounds, transform)

    let viewSize = personPic.bounds.size
    let scale = min(viewSize.width / ciImageSize.width,
                    viewSize.height / ciImageSize.height)
    let offsetX = (viewSize.width - ciImageSize.width * scale) / 2
    let offsetY = (viewSize.height - ciImageSize.height * scale) / 2

    faceViewBounds = CGRectApplyAffineTransform(faceViewBounds, CGAffineTransformMakeScale(scale, scale))
    faceViewBounds.origin.x += offsetX
    faceViewBounds.origin.y += offsetY

    let faceBox = UIView(frame: faceViewBounds)

    faceBox.layer.borderWidth = 3
    faceBox.layer.borderColor = UIColor.redColor().CGColor
    faceBox.backgroundColor = UIColor.clearColor()
    personPic.addSubview(faceBox)

    if face.hasLeftEyePosition {
        print("Left eye bounds are \(face.leftEyePosition)")
    }

    if face.hasRightEyePosition {
        print("Right eye bounds are \(face.rightEyePosition)")
    }
}

}