Edited at

CIDetectorでAmazonPrimeのドキュメンタルを正確に判定してみた。


はじめに

こんにちは、drama(@1901drama)です!

Amazon Prime Videoの ドキュメンタル が好きなのですが、

シーズン1から「フジモンの判定甘いんじゃないか」問題が評価を下げる要因として話されています。。。

場回し的な人がいないと展開が少なくなったりしますし、ある程度仕方ないかな とは思うのですが、

そもそも 本当に笑っているのでしょうか?  この問題をARで解決しました。


出来たもの

DOCU-JUDGE


・カメラ画像から顔検出をする

・笑顔かどうかを判定する

・笑ってたらアウトにする(顔をドキュメンタルのロゴに変える/画面のふちに赤っぽいフレームを追加する)


これでどこでもドキュメンタルが出来ます。

やってみてわかったのですが、他の人も結構笑顔判定されます。

※1/30 フレーム単位なのでジャッジは厳しめです。


仕様

以下の流れでドキュメンタルをしています。

1.カメラで取得した動画リアルタイムで、バッファに入れます。

2.バッファに入った動画を、フレーム(1/30)単位で画像に変換します。

3.画像ごとに顔検出を行います。

4.顔検出された場合、顔の特徴点から笑顔か否かを判定します。

5.笑顔と判定された場合、顔の位置と大きさを、描写用のコントローラに受け渡します。

6.定められた位置と顔の大きさのアウトマークを画面に追加(表示)します。

7.0.1秒後に追加したアウトマークを削除します。

8.上記1~7をループ

▼因みに、顔検出&笑顔判定はとても簡単でした。

//顔検出

let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])

// 取得するパラメーター(笑顔判定)を指定する
let options = [CIDetectorSmile : true]
// 画像からパラメーター(笑顔判定)を抽出する ※ciimage = フレーム単位で取得した画像
let features = detector.featuresInImage(ciImage, options: options)

そして、それ以上に驚いたのが、



CPU使用率がすごい。

デバイスがiPhone SEというのもありますが、検出精度をlowにしていても、基本100%以上でした。

これを6時間見続ける審査員って相当疲れるんだろうなっと思いました。


難しかった点

1.ARAnchor->画面位置への変換

当初は遠近を把握する為に、ARFaceAnchorを利用して顔判別をしようと思ってました。

class ARFaceAnchor : ARAnchor

しかしフレーム単位では処理が重過ぎたので、アウトマークの画像サイズと場所を高速で更新する方法に変えました。

因みにiPhoneX以上の機種であればARKit2の顔に自動でマスクをつける機能が使えます。

顔を猫に変えるとか、アウトマーク以外の追加であれば、その方が簡単に導入出来ると思います。


参考:Creating Face-Based AR Experiences


2.カメラの向き(横か縦)を、cgimageに引継げない。

UIimageは、撮影時のデバイス向きを保持しているのですが、

動画から取り出したimageの cgimage は、向き情報を持ってなかったです。

顔検出や笑顔判定には向き情報が必要な為、ここを解決出来ず縦でしか使え無いアプリとなってしまいました...。

一般的には画面の向きも 別変数で取得して一緒に利用しているのでしょうか?

このあたりご存知の方いれば教えて欲しいです。


まとめ

ドキュメンタルの結論

「笑ってるけど、皆 まあまあ 笑ってる」 でした。なので楽しく見ましょう。

ここまで読んで頂きありがとうございました!


動画:ドキュメンタル シーズン5

引用中の動画は他のものに置き換えるかも知れません