頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


顔認識 OpenCV対CIDetector

OpenCVのサンプルを試していたら顔を検出するなんてのがあったのよ。
そう言えば元々そういうのがあったよね、ってことで確認するとiOS 5でCoreImageフレームワークにCIDetectorクラスが追加されてるみたい。え?iOS 5からあったの?今まで興味なかったのでスルーしてたな。

どっちが速いのかなと思って比較してみたんだ。リアルタイムでカメラからの入力を処理する、というのを考えて1280x720pxのカラーのpng画像を用意したんだけど、、、そもそもこれだと大きすぎるのでグレースケールにして縮小するのが一般的っぽい。
あと、分類器ファイルの読み込みなどの前処理は考慮外ってことで。
単純にデータから顔を検出する部分でどれだけ時間かかるの?って比較ね。

実際にはこの部分を計測したのよ。
OpenCVの方はここ
{
    cascade.detectMultiScale(image, faces,
                             1.1, 2,
                             CV_HAAR_SCALE_IMAGE,
                             cv::Size(30, 30));
}
CIDetectorの方はここ
{
    NSDictionary *detectorOptions = [[[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil] autorelease];
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions];
    NSDictionary *imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1]
                                                             forKey:CIDetectorImageOrientation];
    NSArray *array = [faceDetector featuresInImage:ciimage options:imageOptions];
}
顔認識結果

↑参考までに結果はこんなの。元画像にマルを描いてるのがOpenCVで、四角い枠のUIViewオブジェクトを乗せている方がCIDetectorでの結果。

結論から言うと設定というか用途によりけりって感じなのかな。OpenCVの方が速い場合もCIDetectorの方が速い場合もあったのよ。
というかCIDetectorの場合、最初が遅くてそれ以降処理速度が速くなるんだ。そう言えばCoreDataの処理速度を調べた時も同じことを思ったわ。Cocoa touchフレームワークって内部で何やらごにょごにょやって計算に必要なデータを抱えているのかな。ほらFFTする時に必要なFFTSetupみたいなやつ、、、ってちょっとマイナーな例だな。
ともかくCIDetectorは二回目以降の速い時の速度で比較してる。それでケースバイケースって感じ。

どこくらいのオーダーかって程度に数字を書いておくよ。

———————————————————
1280x720pxの元画像をグレースケール化&縮小した画像で比較
それぞれ二回続けて計測
単位 [msec]

(1) iPod touch (5thG), iOS 7.1

1/4に縮小の場合
OpenCV : 217.10 → 212.25
CIDetector : 1115.63 → 281.25

1/2に縮小の場合
OpenCV : 862.41 → 857.82
CIDetector : 741.23 → 273.15

(2) iPhone 5s 32bit, iOS 7.1
1/4に縮小の場合
OpenCV : 45.03 → 43.77
CIDetector : 517.68 → 85.04

1/2に縮小の場合
OpenCV : 184.37 → 178.71
CIDetector : 416.24 → 85.36

———————————————————
ね?OpenCVは二回目でも同じようなもんだけど、CIDetectorの方はどれも速くなるでしょ?
結局のところどういう使い方でどのくらいの大きさの人物を認識するのかみたいな想定でどちらがよいかは変わりそう、というなんとも微妙な結果に。

ちなみにかろうじてOpenCVをインストールできた俺にはOpenCVを64bitでインストールする力量にはほど遠く、32bitでビルドしてるよ。

<< タッチされた点から滑らかな曲線を得る  TopPage  iOSでOpenCVのサンプルが動かない >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/885-58ea3b3d




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad