设备上的面部识别 - Swift

4
我有一个应用程序,可以获取用户的所有图像(从照片应用程序中获取所有资产)。之后,该应用程序应遍历所有图像并检测人脸并返回它们的面部标记,然后查看数据库以查看是否有任何具有相同标记的朋友(识别朋友面孔),类似于Facebook在Moments应用程序和Web上所做的。然后,该应用程序将显示朋友出现在其中的所有照片。我的应用程序的重要部分是用户隐私,因此我希望整个过程都保留在设备上,而不是发送到在线服务。将其保留在设备上的另一个好处是,我的应用程序中的每个用户都可以拥有数千张图片,并且与外部服务一起工作将是昂贵的,并可能降低性能(如果需要将每个图像发送到服务器)。
从我所做的研究来看,有许多在线服务(但它们不符合我的要求-保持离线处理)。还有CIDector可以检测面部,然后您可以返回一些功能,例如眼睛位置和口位置(我不认为这足够可靠)。我还听说过Luxand,openCV和openFace,这些都是设备上的识别,但都是C ++类,这使得将其集成到swift项目中变得困难(文档不是很好,不解释如何将其集成到您的项目中以及如何在swift上执行人脸识别)。
所以我的问题是是否有任何方法可以执行返回设备上面部标记的面部检测?
如果没有,是否有其他方法或服务可用。
此外,如果有一种有效且快速的方式来执行面部检测和识别,如果用户可以拥有数千张图像。
顺便说一句,我处于开发的早期阶段,正在寻找可以用于开发阶段的免费服务。

听起来对于移动设备有些沉重。我只会选择一个C++库,并观察它在设备上的运行情况。没有什么值得做的是容易的 ;) - boidkan
1
iOS10的照片应用程序中不是已经有这个功能了吗? - Kevin Goedecke
是的,@KevinGoedecke。我相信他们称之为场景分类。它适用于人脸以及常见的基本物体,如狗、山和河流。 - Sean
我能在我的应用程序中使用它吗?我在文档中找不到它。 - Idan Aviv
大家好,@IdanAviv 和 Xcodian,我也遇到了同样的问题,你们有找到解决方案吗? - Piyush Sanepara
显示剩余5条评论
1个回答

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

}


谢谢您的回复,我知道IOS有面部检测功能。但是我需要一种识别面部的方法,也就是说,我可以举例说明图像中的面部是Bob的面部。为了做到这一点,我认为我需要比CIFaceFeature提供的更多信息。您知道如何使用内置检测器来实现吗? - Idan Aviv
哦,你需要进行人脸比对。实际上我从未做过这个。希望你能找到合适的答案。我会给你评分的。 - Volodymyr
@Volodymyr 我该如何在 Assests 中使用实时摄像头进行检测,而不是图片? - Xcodian Solangi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接