はじめに
この記事で示されるコードは動作はするが、品質は微妙なので実用レベルではない。
動機と先行事例の調査
さんざん撮り溜めたテレビの録画から自動的にCMがカットできればうれしいなあとずっと思っていた。具体的にはカリフォルニア工科大学に勤める才能溢れる若者がなぜかその能力を斜め上の方向に傾注するシチュエーション・コメディや、現代に甦ったシャーロック・ホームズがニューヨークでチャーリーズ・エンジェルに出てそうなアジア系のドクター・ワトソンと難事件に挑むドラマなど。少し前まではメンバーの一人が不祥事を起こしてしまったアイドルグループが山の中や孤島でいろいろ自給自足生活に挑戦するバラエティなど。毎回編集してCMを取り除くのは億劫なので、そういうものをいい感じにアレできるようなものがあるといい感じなんじゃないかな、と。
調べたかぎりでは先行事例は3つ。
- 事例(1): https://vasanthkalingeri.github.io/CommercialDetection/
- シーンの区切りは音声の無音区間を認識。実際にはダイナミックレンジの偏差も取っている
- 予めCM音声のフィンガープリントを取っておいて、区切ったシーンごとに該当するかを判断
- 事例(2): https://github.com/Breakthrough/PySceneDetect
- 画像の変化の幅を利用してシーンの区切りを検出
- シーンそのものの種別の認識はやっていない
- 事例(3): https://www.pyimagesearch.com/2019/07/15/video-classification-with-keras-and-deep-learning/
- 転移学習、ファインチューニングを使用して、動画のセマンティックスを認識
事例(1)についてはたぶんCMの認識精度は高いんだろうけど、全てのCMをパターンに登録しておかないといけないので結局それって全エピソード手動で切り分けることとほとんど大差ないねって感じで、手間かかるだろうなという感じ。事例(2)についてはデモ動かした感じでは認識が鋭敏すぎてちょっとしたシーンの切り替え(カメラアングルの変化)とかでもシーンチェンジと認識してしまっているので、ちょっとしんどいな、という感じ。
事例(3)がかなり自分の中では刺さって、これでCMの認識とかいけるんじゃなかろうか!ということで応用してみた。
実装
こちらを参照。
Kerasなので極端に言えばGPUなくても動く。でも現実的なパフォーマンスを出すには 16GB MEM, 4GB以上のメモリを搭載したGeForceがいるとおもう。私はディープ・ラーニングの勉強も今後したかったので¥15,000出して玄人志向のGeForce GTX 1650を購入した。
教師データにはドラマの録画そのものを使用した。2エピソードだけ手動で厳密に本編とCMを切り分け、それを元に動画を読み込んでフレームを切り出した時のラベル(0=本編, 1=CM)をつけて教師データにしている。教師データの数が結構多いので、Data Augmentationは行わなかった。1エピソードだけでもメモリ9GB程度を使うみたいだ。
トレーニングの結果としては、数字だけ見るとまじでって感じ。そう何回もepochを回していないうちにvalidation accuracyも90%とかになって、これかなりいけるんじゃないのって感じ。
で、実際Estimateで他エピソードのシーンカット、種別認識を行った結果が bbt-01-08-timesheet-queue30.txt 。トレーニングの時点でCM側のRecall rateが低めですねとは出ていたんだけど、FNが結構キツめに出てますね、と。アイデア元の記事でも言及されていたんだけど、予測がチャタるというか、ちらつく現象が出ている。ただチャタる部分は傾向性があるのでヒューリスティックなフィルタリングで除去できそう。
実装してみてどうだったか
- ざっくりとしたレベルでは本編とCMは切り分けることができる。ただ本編シーンの前後にCMが少しまざったりしてきっちり切り分けるのは無理っぽいなあ、と思った。元記事の記述だとRNNやLSTMを使うとこのへんはもっと改善できるらしい。う〜ん
- 教師データ足りないんじゃないのというのも思いついたけど、もともとの動機が怠惰にCMと本編を切り分けたいということだったので、教師データ増やすために頑張るというのもなんか本末転倒だよなあ、と
- まだ私の知識が足りていないので、何かが悪い時に改善策を打つことができない。単にその辺に転がってるコードを実行してみて良かった、悪かった、的な感じを繰り返しているとよくなさそう。やっぱりちゃんと勉強しないとなあ
こんな感じ。ディープラーニングって動かすだけならまあまあできるけど、うまく動かない時ちゃんと勉強していないと大変ですね