Mirrativ tech blog

株式会社ミラティブの開発者(サーバサイドエンジニア,iOSエンジニア,Androidエンジニア,機械学習エンジニア,インフラエンジニア, etc...)によるブログです

機械学習で配信中の映像からゲームを推定する機能を開発しています🎮

おはようございます、機械学習エンジニアのハヤシです。

本稿では現在テスト中の配信中の映像からゲームを自動で設定する機能についてご紹介します。

背景

Mirrativには「マイアプリ」や「おすすめ」といったタブがあり、そのタブにいろいろな配信が表示されています。視聴者さんはこれらのタブから自分の見たい配信をタップして、視聴を開始します。

また、配信者さん向けの機能として「現在遊んでいるアプリを設定する」という機能があります。配信開始時や配信中にアプリ名を選択し、「いまこのゲームの配信をしているよ」と表明する機能です。(以下「アプリ設定をする」と表現します)

「マイアプリ」や「おすすめ」にどの配信が表示するか判断するロジックに、このアプリ設定の情報を使用しています。つまり、アプリ設定がされている配信は、上記のタブで紹介される確率が高まり、視聴者さんが来やすくなり、コメントも付きやすくなります。

f:id:namagon:20190307080955p:plain
アプリ選択画面。

一方でアプリ設定をしていない配信者さんはアプリ設定をしている配信者さんより配信への入室率や1回以上コメントが送られる割合が下がる傾向にあります。それゆえ配信を続けるモチベーションを保つのが難しく、次回以降の配信の継続率が下がってしまう事象が観測されていました。

コメントがない配信、喋る内容がわからなくなりがちです。私も経験があります……配信してるのに……無言でゲームしてしまいます……つらい……

視聴者さんと配信者さんの適切なアプリのマッチング(見たい・コメントしたい・配信したい)をすることで配信体験の UX を向上させたいと思いました。

Mirrativ は配信プラットフォームであると共にSNSです。配信者さんと視聴者さん共に Mirrativ のプラットフォーム上で配信を通じたコミュニケーションを通じてわかりあってもらうことを願っております。

ゆえに、配信を続けてもらえる配信者さんを少しでも増やすことを目的として当機能を開発することにしました。

しかしながら、iOS/Android ともに OS の仕様上、バックグラウンドで動いている Mirrativ のプロセスから実際にフォアグラウンドで動いているアプリ情報を取得するのは非常に難しいです。

ですが、配信のキャプチャ画像をクラス分類することである程度の精度が出せそうなため、機械学習による配信中のゲームの自動推定機能を開発するに至りました。

f:id:namagon:20190311191922p:plain
イメージ図

対象タイトル

まずは全ゲーム配信中、約70%を占めるゲームにのみに適用して検証して結果が良ければ対象タイトルを拡大していきます。

仕様検討

画像分類で解く以上アプリ推定の精度が100%になることはまずありえません。それゆえはじめは確からしいアプリが推定された際にプレイ中のゲームは hogehoge ですか? [はい] [いいえ] という通知ダイアログを出してユーザーに選ばせる仕様で想定していました。

ところで、ゲームの内容とは無関係の通知ダイアログが出てきたとしてタップしますか?少なくとも僕はしません

配信者さんから見て自動でアプリが設定されることにネガティブな感情を持つことはほぼ無い上、仮にアプリ設定が間違ったとしても重大な問題につながる可能性は非常に低いと判断したため、アプリ未設定の場合はメッセージを出した上で自動で設定することにしました。

プロトタイプ

現在配信者さんが選択しているアプリと画像から推定されたアプリが異なる場合、slack に推定結果を画像つきで投稿するプロトタイプのbotを*1作りました。

f:id:namagon:20190311235832p:plain
ユーザーが設定したアプリと推定したアプリが違うとき投稿されるチャンネル
f:id:namagon:20190307053943p:plain
沸き立つ社内slack

現状のモデルで精度十分でしたが、1枚あたりの推定処理が遅いという課題を抱えていました。

パフォーマンス要件

アプリ未設定の配信者さんに対し可能な限り早く正確な推定をしたいため、現在放送されている全配信の画面キャプチャを1分ごとに画像認識モデルに通すスケジュールバッチを実装することにしました。

この段階でバッチ処理の単位時間と処理件数が算出できたため、あとは実際に運用するインフラの選定に移れます。

今回、モデルの学習処理には Google Compute Engine の GPU インスタンスを利用しています。

しかし、GPU インスタンスを本番運用するとなると CPU インスタンスと比較して利用料金が非常に高価である上リソース監視にGPUも入れる必要があります。ゲーム推定機能は単位時間あたりの処理件数が膨大な量ではなく、モデルの精度もある程度妥協できるため*2 CPU インスタンスの並列処理で対応可能と判断しました。

本番運用するにあたるモデルアルゴリズムの選定

いくつかのモデルを検証したところ、軽量な MobileNet をベースにしたモデルだと精度・処理速度ともにパフォーマンス要件を満たせる可能性が高いと判断しました。

実際にゲーム自動で設定する対象については Confidence *3 の閾値を高めにすることでアプリ設定の正答率を担保するようにしています。

プロトタイプで採用していた VGG16 のモデルと LeNet-5 のモデルと比較してみました。

モデル 設定対象の割合 正答率*4 1枚あたりの処理時間
VGG16 49.7% 98.5% 0.2 sec
LeNet5 55.4% 93% 0.05 sec
MobileNet 63.3% 98% 0.065 sec

精度と処理時間のバランスが最も取れていた MobileNet ベースのモデルを仮採用

試験用の仕組みにデプロイしたところ教師データに Mirrativ の エモモの画像を学習させていなかったため、ゲームとして誤認識してしまう事象が散見されました。

f:id:namagon:20190312000028p:plain
エモモをゲームと認識してしまうミス、かわいいけどこれではだめ、かわいいけど。

それを解決すべく、ゲーム以外の画像を その他 と分類するモデルを作り、自動設定の対象外としました。

f:id:namagon:20190312000054p:plain
その他クラスと認識されるエモモ、これは正しい。そしてかわいい。

モデル 設定対象の割合 正答率 1枚あたりの処理時間
21クラス MobileNet 81.67% 99.2% 0.066 sec

パフォーマンスをほぼ犠牲にすることなく、モデルの精度が更に良くなったのでこれでいきましょう。

配信してみた

アプリ未設定のまま対象タイトルを配信しているとこんな感じでアプリが自動設定されます。

f:id:namagon:20190311182204p:plain
画面は開発中のものです。

今後の展開

現在試験中の機能ですが、ユーザーさんから頂いたフィードバックや自動設定された配信の数値指標から見えてきた今後の展開などを次回の記事で書こうと思います。

追記

書きました!

tech.mirrativ.stream

We are hiring!

Mirrativ では一緒に開発してくれるエンジニアを募集しています!

体験入社や副業も大歓迎です。お気軽にどうぞ!

www.mirrativ.co.jp

*1:私が join する前に副業メンバーに作っていただきました🙇 Mirrativ では副業メンバーも絶賛募集中です

*2:もちろん高ければ高いほどよい

*3:推定結果の確からしさ

*4:Confidence の閾値を超えている画像を対象とした正答率