【问题标题】:on device face recognition - Swift [closed]关于设备人脸识别 - Swift [关闭]
【发布时间】:2017-01-31 14:05:33
【问题描述】:

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

根据我所做的研究,有许多在线服务(但它们不符合我的要求 - 保持流程离线)。还有检测面部的 CIDector,然后您可以返回一些特征,例如眼睛位置和嘴巴位置(我认为这不足以进行可靠的识别)。也听说Luxand、openCV、openFace,都是在设备识别上的,但是都是C++类的,和swift项目集成比较困难(文档不是很好,也不解释怎么集成您的项目以及如何在 swift 上执行人脸识别)。

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

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

此外,如果有任何有效且快速的方法来执行人脸检测和识别,如果用户可以拥有数千张图像。

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

【问题讨论】:

  • 对于移动设备来说听起来有点沉重。我会选择一个 C++ 库,看看它在设备上的运行情况。没有什么值得做的事是容易的;)
  • iOS10的照片应用中不是已经有这个功能了吗?
  • 是的,@KevinGoedecke。我相信他们称之为场景分类。它适用于面部,也适用于常见的基本对象,如狗、山脉和河流。
  • 我可以在我自己的应用程序中使用它吗?我在文档中找不到它。
  • 我认为他们没有为该功能提供 SDK 或 API。但这听起来很像您尝试实现已经存在的功能:/

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


【解决方案1】:

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有人脸检测。但是我需要一种识别人脸的方法,这意味着我可以说图像中的人脸是鲍勃的脸。为了做到这一点,我认为我需要比 CIFaceFeature 提供的更多信息。你知道我怎么能用内置的探测器做到这一点。
  • ohhhh,你需要人脸比对。其实我没有,以前从来没有这样做过。希望你能找到正确的答案。将对您的问题进行评分。
  • @Volodymyr 如何通过实时摄像头而不是 Assests 中的图像使用检测。?
猜你喜欢
  • 2011-07-21
  • 2010-10-31
  • 2015-06-14
  • 2023-03-22
  • 2014-07-21
  • 2015-08-28
  • 2012-10-06
相关资源
最近更新 更多