#はじめに
こんにちは、drama(@1901drama)です!
Amazon Prime Videoの ドキュメンタル が好きなのですが、
シーズン1から「フジモンの判定甘いんじゃないか」問題が評価を下げる要因として話されています。。。
場回し的な人がいないと展開が少なくなったりしますし、ある程度仕方ないかな とは思うのですが、
**そもそも 本当に笑っているのでしょうか? ** この問題をARで解決しました。
出来たもの
DOCU-JUDGE
Documental HELP その1 pic.twitter.com/C5NppqChsm
— drama(ARエンジニア) (@1901drama) 2019年3月5日
・カメラ画像から顔検出をする
・笑顔かどうかを判定する
・笑ってたらアウトにする(顔をドキュメンタルのロゴに変える/画面のふちに赤っぽいフレームを追加する)
Documental HELP その2 pic.twitter.com/q3UKT4qxbB
— drama(ARエンジニア) (@1901drama) 2019年3月5日
これでどこでもドキュメンタルが出来ます。
やってみてわかったのですが、他の人も結構笑顔判定されます。
※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の顔に自動でマスクをつける機能が使えます。
顔を猫に変えるとか、アウトマーク以外の追加であれば、その方が簡単に導入出来ると思います。
2.カメラの向き(横か縦)を、cgimageに引継げない。
UIimageは、撮影時のデバイス向きを保持しているのですが、
動画から取り出したimageの cgimage は、向き情報を持ってなかったです。
顔検出や笑顔判定には向き情報が必要な為、ここを解決出来ず縦でしか使え無いアプリとなってしまいました...。
一般的には画面の向きも 別変数で取得して一緒に利用しているのでしょうか?
このあたりご存知の方いれば教えて欲しいです。
まとめ
ドキュメンタルの結論
「笑ってるけど、皆 まあまあ 笑ってる」 でした。なので楽しく見ましょう。
ここまで読んで頂きありがとうございました!
動画:ドキュメンタル シーズン5
引用中の動画は他のものに置き換えるかも知れません