カメラで得た画像にVision frameworkを使う
↑この続き。
どうなんだろうな?と思って確認すると、顔画像が90度回転してたり上下逆さまだと認識しないっぽい。

これで何が困るかというとiPhoneのカメラから得られる画像を回転を意識せずにUIImageViewで表示すると横向きになる(デバイスの姿勢はportrait)のでカメラから得たデータを回転させる必要がある。Vision frameworkの顔認識処理に渡すのはCGImageなのでここから回転させないと具合悪い。
いろいろと調べて試してみた結果、
Ios rotate, filter video stream in ios - Stack Overflow
↑ここにあるコードを使うと意図通り回転させることができた。
iPhoneのback cameraから取得した画像を90度回転させてVision.frameworkで顔検出ってとこまででけた。次はリアルタイムでどうやねんってとこか。 pic.twitter.com/MgjlFjrTOO
— Tatsuya (@yt) 2017年10月5日
↑これでカメラで得た画像に対して顔検出処理ができるとこまでOK。
iOS 11のVision framework、処理速度からすると追従性はこんなもんだろうとは思ってたけど、案外精度が残念。まあ用途にもよるだろうけど。 pic.twitter.com/XkpfNva1Zu
— Tatsuya (@yt) 2017年10月12日
↑iPhone 7 Plusのフロントカメラでリアルタイムでやってみたが、、、
顔検出処理に200msecほど必要だと測定してたから追従性はこんなもんだろうとは思っていたが、、、問題は期待ほど精度が高くないこと。顔の向きや光の具合でとんでもない判定が出ることが多い。それから動画にはないけどいわゆる変顔みたいな表情も苦手の様子。
リアルタイムではなくてもいいので正確に表情を検出したかったんだけど、これじゃ使えない感じ。ただ、こういう機械学習モノはどんどん精度が上がっていくだろうし、瞳が取得できない不具合も修正はされていくだろうから時々チェックするようにせねば。
<< 機械学習におけるデータの範囲(2) TopPage 機械学習におけるデータの範囲 >>
コメント
突然の質問、失礼致します。
英語サイトなどほとんどswiftで、こちらのサイトへたどり着きました。
VNFaceObservationのlandmarksから例えば口の輪郭のouterLips(VNFaceLandmarkRegion2D)を取得した後、
swiftの例ですとこれをforで回し、
indexで取得できる配列になっているようなのですが、objective-cだと
以下のようなメソッド(normalizedPoints)で最初の値しか取れませんでした。。
===========================================
VNFaceLandmarkRegion2D *outerLips = [[face landmarks] outerLips];
for(int i = 0; i < outerLips.pointCount; i++){
const CGPoint p = *[outerLips normalizedPoints];
}
===========================================
この辺りの実装はどう対応されたのでしょうか
ご存知でしたらご教示頂けますと幸いです。
なお、わたしの場合VNFaceObservationをswiftから持ってきているため
挙動が変わってきているのかもしれません、、
宜しくお願い致します。
2018.01.16 rnc 編集
Re: 突然の質問、失礼致します。
こんにちは。
for (int ite=0;ite< outerLips.pointCount;ite++) {
CGPoint p = outerLips.normalizedPoints[ite];
]
で取ってますね。
2018.01.16 たつや 編集
やっぱりそうなりますよね、、
ありがとうございます!!
本当に助かりましたm(__)m
2018.01.16 rnc 編集
トラックバック
https://ringsbell.blog.fc2.com/tb.php/1095-0d0e2e4e