ios – 关于设备人脸识别 – Swift

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

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

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

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

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

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

最佳答案 iOS在Core
Image框架中具有原生面部检测功能,非常酷.您也可以检测眼睛等.只需查看此代码,就会展示如何使用它.

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)")
    }
}

}

点赞