目的

iOSアプリで顔認識システムを利用する時、利用できる標準のライブラリにCIDetectorVisionがあります。
この記事ではどちらを使った方が良いかとかのメリットを述べていきたいと思います。


….という内容を書こうとしたのですが、
iOS12で両方のライブラリを試してみると。
私の検証結果では、両ライブラリに 認識精度の違いはありませんでした。

本当はVisionの方があきらかに精度が良いから、Visionおすすめだよ と書きたかったのです。

まぁでも、Visionがおすすめの思いは、変わりありません。


何を書きたかったかというと

顔認識機能を搭載したアプリに少しかかわったのですが、
CIDetectorライブラリを利用していました。

このCIDetectorですが、
iOS10の時点では、逆光により顔が暗くなった状態の顔認識精度はものすごく悪かったです。
↓こういうやつAPhoto




アプリの仕様として
明るい場所で撮影して!
としていたのですが、
先日、やはり逆光の時も認識できるようにしてほしいとのご命令が下りまして。

そこでVidionを使ってみることにしました。
VisionはiOS11からしか対応できませんが、iOS13が出ようとしている昨今でそこは問題ありません。

とりあえず、現時点での最新のiOS12にして Vision を導入したところ。

逆光状態でも問題なく認識することが出来ました

ただし、、
ためしにCIDetectorでもう一度検証してみると、

逆光状態で認識しました
ということで、もうどっちでもいいかなという感です。
iOS12で性能が改善されたのでしょうか?カメラの?CIDetectorの?


コード掲載

一応、CIDetectorVisionのそれぞれのコードを掲載します。

まずは、CIDetector
printで1以上であれば、顔認識としています。

CIDetector
let image = UIImage(named: "Image")!
let ciImage = CIImage(image: image)!

let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: nil)
if let features = detector?.features(in: ciImage) {
    print(features.count)
}


次にVision
printで1以上であれば、顔を認識したとしています。

Vision
let image = UIImage(named: "Image")!
let ciImage = CIImage(image: image)!

if let orientation = CGImagePropertyOrientation(rawValue: UInt32(image.imageOrientation.rawValue)) {
    let handler = VNImageRequestHandler(ciImage: ciImage, orientation:orientation)
    let request = VNDetectFaceRectanglesRequest { (request, _) in
        print(request.results?.count ?? "0")
    }
    do {
        try handler.perform([request])
    } catch {
    }
}


Appleの見解

Appleの公式ドキュメントにCIDetector vs. Visionとして、少しだけ言及されています。
Vision Framework
P76ごろに

CIDetector vs. Vision
CIDetector will remain as they are in Core Image
New algorithms will be exposed through Vision
Algorithm improvements will be made available in Vision
とあります。
CIDetectorはCoreImageのままだが、
Visionは新しいアルゴリズムを使っていて、改善予定にある。とか。。

ということで、冒頭に書いたとおり、このままVisionを使い続けようと思います。


週刊ニューズウィーク日本版 「特集:顔認証の最前線」〈2019年9月17日号〉 [雑誌]