2016-09-22 54 views
4

我有一個應用程序,需要用戶的所有圖像(所有資產從照片應用程序)。之後,應用程序應該運行所有圖像並檢測臉部並返回其面部標誌,然後查看數據庫以查看是否有任何具有相同地標的朋友(識別朋友面孔),類似於Facebook在即刻應用中所做的操作和網絡上。該應用程序將顯示該朋友出現在其中的所有照片。我的應用程序的重要部分是用戶隱私,所以我想將整個過程保留在設備上,而不是將其發送到在線服務。將其保留在設備上的另一個好處是,我的應用程序中的每個用戶都可以擁有數千張圖像,並且使用外部服務可以擴展並降低性能(如果需要將每張圖像發送到服務器)。在設備臉部識別 - Swift

,從我做了有許多在線服務(但他們不適合我的要求 - 該過程離線保存)的研究。還有CIDector可以檢測臉部,然後你可以返回一些特徵,比如眼睛位置和嘴部位置(我認爲這對於可靠識別來說不夠好)。我還聽說過Luxand,openCV和openFace,這些都在設備識別上,但都是C++類,這使得它很難與swift項目集成(文檔不是很好,也沒有解釋如何將它集成到你的項目以及如何快速進行臉部識別)。

所以我的問題是,如果有任何的方式來進行人臉檢測返回設備上的臉部標誌?

  • 如果不是有任何其他方式或服務,我可以使用。

此外,如果有任何有效和快速的方式來執行人臉檢測和識別,如果用戶可以有一千張圖像。

順便說一句,我是在發展的早期階段,我要尋找免費服務,我可以使用的發展階段。

+0

聽起來用於移動裝置有點重。我只想跟一個C++庫一起看看它在設備上的運行情況。沒有什麼值得做的事很容易;) – boidkan

+1

這個功能是不是已經在iOS10的照片應用程序中? –

+0

是的,@KevinGoedecke。我相信他們稱之爲場景分類。它適用於臉部以及常見的基本物體,如狗,山脈和河流。 – Sean

回答

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

}

+0

謝謝你的迴應,我知道IOS有臉部檢測。但我需要一種方法來識別臉部,這意味着我可以舉例說,圖像中的臉部是鮑勃的臉龐。爲了做到這一點,我想我相信我需要更多的信息,然後CIFaceFeature提供了什麼。你知道我怎麼能用內置的探測器來做到這一點。 –

+0

ohhhh,你需要面對比較。其實我沒有,從來沒有這樣做過。希望你會找到正確的答案。會評價你的問題。 – Volodymyr

+0

@Volodymyr如何通過實時相機使用檢測而不是Assests中的圖像? –