以前,夏休みの暇な時間を使ってDeep Learningで顔検出をしてみたというのをやってみました。
今回は,その応用で画像の中にあるテロップの位置を検出してみようということをやってみます。
まぁ応用というかそのまんまなんですけどね。
相も変わらず,Deep Learningって何?ディープラーニング?深層学習?という説明はすっ飛ばしていきます。
気になる方はググってみてください。
今回の試みのソースはこちらです。
※顔検出時をソースをほぼそのまま使っているため,変数名等が少し変なところが残ったままになっています。
やりたかったこと/実際にやったこと
今回やろうと思ったことはテロップの位置を検出するというものです。
イメージとしてはこんな感じですね。
画像はこれまた石川県出身の浜辺美波さんです。
これからも活躍していって欲しいですね!
赤い四角で囲っている部分がテロップの位置なので,その場所を取得しようというものです。
この画像の場合は計5か所です。
理想としては,1枚の画像(例えば,赤枠の無いこの画像)を入力すると,画像内にあるテロップの座標(赤枠の左上のxy座標と,幅・高さなど)をすべて取得するというものです。
ただ,前回同様に,画像内にテロップがひとつしかなければ簡単なのですが,複数ある場合にどうやって複数座標のデータを取得するかという問題があります。
もし,テロップがひとつしかなければ,出力層のユニット数を4つにして,それぞれLeft,Top,Width,Heifhtにして回帰問題として解いてしまえば一発です。
ただ,今回は複数テロップも対応したいため,別の方法が必要です。
という訳で,前回の顔検出と同様に,
- 入力は検出対象の画像
- 出力は,各ピクセルごとに,そこがテロップなのか否かを[0, 1](0~1の閉区間)でスコアを出力する
という形式にしたいと思います。
詳しくは,Deep Learningで顔検出をしてみたをご覧ください。
ただし,最終的に矩形の座標は欲しいので,画像全体のピクセルごとのスコアを出した後に,後処理として矩形を作成します。
実行環境
今回も前回と同様の条件ですが,実行環境を記載しておきます。
- GPU環境
- GPU付属版のSurface Book
- Requirement
- Python3.6
- Keras==2.1.4
- TensorFlow(GPU)==1.4.0
今回も初代Surface BookのGPU付属バージョンでやってみます。
そろそろ強いGPUが欲しいなぁ…。
Google Colabを使えば,K80が無料で使えるとは言いますが,やっぱりローカル環境に好きに使えるマシンが欲しい。
環境構築の勉強になったりもするし。
使用データ
前回の顔検出用のデータは,適当にググればオープンデータが出てきますのでそれを使用すればすぐに学習データを用意できました。
ただ,今回はテロップの座標データが必要なんですが,さすがにオープンデータでそういうデータはなかなかなさそうです。
頑張って探せば見つかるのかもしれませんが,さすがにその労力ももったいないので,勉強も兼ねて今回は自分でテロップ入りの画像データを作ることとします。
手順は大体こんな感じです。
- 適当に画像を沢山用意する(できれば文字が映っていないもの。自分で撮った風景写真とかが沢山ある人はそれで問題ないです)
- フリーのフォントを用意する(「フォント フリー」とかでググれば見つかります)
- 画像内でテロップを配置する場所や,テロップの大きさを決める
- その情報をもとに,持ってきたフォントで文字を画像に書き込む
Deep Learningをやる上で学習データを集めるのが結局ネックになってなかなか実用化できなかったりするのですが,テロップに関しては,逆に自分で画像にテロップを挿入出来てしまうので,学習データの準備という点ではかなりやりやすい題材かと思います。
今回もやはりGPUのメモリの問題がありますので,画像のサイズは入力も出力も縦:160×横:240ピクセルという小さいサイズにリサイズしています。
ネットワーク構成
まだとりあえず一発学習を実行してみたという程度の状況ではありますが,この記事を書いている時点ではこのような構成にしています。
これは,顔検出をやってみたときの最新版の構成をそのまま採用してみました。
結果
顔検出のときのハイパーパラメータで1度学習をさせてみたモデルでの推論結果はこんな感じになりました。
テロップ検出用にチューニングをした訳でもないのであまり期待していなかったのですが,思ったよりはテロップを認識している傾向は出てくれたように思います。
左上・右上の小さめのテロップだったり,大きいテロップがまだまだだったりしていますが,初回の結果としてはまぁまぁかなと思います。
まとめ
チューニングはこれからですが,現時点で気になったことをいくつか挙げてみたいと思います。
- 小さいテロップの認識が弱い
- 上部にある小さめのテロップで認識自体がまだできていない,要するにヒートマップで赤くなっていない部分がまだある
- 左上と右上のテロップが繋がってしまっている
考えられる理由としては,このくらいでしょうか。
- 学習データに小さい文字のテロップがなかった?
- 学習データのテロップには,空白文字も含めていたため,テロップ間のテロップじゃない区間もテロップ領域として認識しようとしてしまった?
また,その他気になった点としては,
- 白抜きの大きい文字がまったく認識できていない
- これが全く反応していないのは,さすがに少し以外
原因はこんな感じですかね?
- 学習データに白抜きの文字がなかった?
- フリーのフォントにはないタイプのフォントだった?
という感じで,テロップの位置を検出してみようという試みでした。
まだチューニングの余地はありそうなので,時間を見つけて徐々に精度を上げていければと思います。
もし上手くいったら,随時追記していきます。