バファローズポンタの「おりほー」「んほー」画像分類モデルを作る

# 概要

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">＼ポンタは　バファローズ ポンタに　なった！／<br><br> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA%E3%83%9D%E3%83%B3%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#バファローズポンタ</a> <a href="https://t.co/WINIFqKTDW">pic.twitter.com/WINIFqKTDW</a></p>&mdash; バファローズポンタ (@bs_ponta) <a href="https://twitter.com/bs_ponta/status/718259156793311232?ref_src=twsrc%5Etfw">April 8, 2016</a></blockquote>

野球のことは一切全く何もわからないのですが、[バファローズポンタ](https://twitter.com/bs_ponta)、かわいいですよね。それはわかります。

彼はオリックス・バファローズのマスコットというわけではなく、ただ推し球団であるバファローズを応援しているポンタということらしいのですが、その公式Twitterアカウント([@bs_ponta](https://twitter.com/bs_ponta))のツイートが極めて特徴的なことで有名です。

**バファローズが試合に勝ったときのツイート**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">7-5!<br>おりほー！<br> <a href="https://twitter.com/hashtag/bs2016?src=hash&amp;ref_src=twsrc%5Etfw">#bs2016</a> <a href="https://twitter.com/hashtag/NPB?src=hash&amp;ref_src=twsrc%5Etfw">#NPB</a> <a href="https://twitter.com/hashtag/%E3%82%AA%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9?src=hash&amp;ref_src=twsrc%5Etfw">#オリックス</a> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#バファローズ</a> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA%E3%83%9D%E3%83%B3%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#バファローズポンタ</a> <a href="https://t.co/6NfoRfmR8d">pic.twitter.com/6NfoRfmR8d</a></p>&mdash; バファローズポンタ (@bs_ponta) <a href="https://twitter.com/bs_ponta/status/728120107809964032?ref_src=twsrc%5Etfw">May 5, 2016</a></blockquote>

**バファローズが試合に負けたときのツイート**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr">2-5・・・<br> <a href="https://twitter.com/hashtag/bs2016?src=hash&amp;ref_src=twsrc%5Etfw">#bs2016</a> <a href="https://twitter.com/hashtag/NPB?src=hash&amp;ref_src=twsrc%5Etfw">#NPB</a> <a href="https://twitter.com/hashtag/%E3%82%AA%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9?src=hash&amp;ref_src=twsrc%5Etfw">#オリックス</a> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#バファローズ</a> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA%E3%83%9D%E3%83%B3%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#バファローズポンタ</a> <a href="https://t.co/lUiub1zDK1">pic.twitter.com/lUiub1zDK1</a></p>&mdash; バファローズポンタ (@bs_ponta) <a href="https://twitter.com/bs_ponta/status/750673465682763780?ref_src=twsrc%5Etfw">July 6, 2016</a></blockquote>

埋め込みツイートからでは画像が見えないと思うので、元ツイートの参照をお願いします。

このように、試合に勝ったときにはいかにも楽しそうな姿、負けたときには非常に落ち込んでいる姿(なぜか全裸)を見せてくれるのが非常に愛らしくて良いですよね。

というわけなので(唐突)、勝った時の画像と負けたときの画像をCNNで分類してみましょう。

# データセット

## 作成

我が国の著作権法は情報解析（多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の解析を行うことをいう。第四十七条の五第一項第二号において同じ。）の用に供する場合においては著作物の複製を認めています。

そういうわけなので、

1. まずはバファローズポンタの公式Twitterアカウントによる投稿画像をダウンロードし、
2. 次に[日本野球機構](http://npb.jp/games/2019/schedule_10_detail.html)の公式サイトから、2016年から2019年までのバファローズの試合結果を全て入手し、
3. 最後に試合結果の日付とダウンロードしてきた画像の投稿日付を対応させ、勝った日の投稿画像を正例、負けた日の投稿画像を負例として画像にラベルを付与していきました。
    - 引き分けや雨天中止の場合の画像は棄却しました。
    - 試合結果の日付に対応する画像が複数ある場合は、その日の一番最後に投稿された画像をラベル付けの対象とし、他は棄却しました。

なお今回、バファローズポンタの公式Twitterアカウントから入手したのは画像のみで、動画は取り上げませんでした。
しかしどうも最近では動画をツイートすることもあるらしく([動画ツイートの例](https://twitter.com/bs_ponta/status/1177189758927167489))、その関係でいくつか正しくない画像がデータセットに紛れ込んでしまっています。今回のところはそのまま無視しましたが、本気でおりほー分類に取り組むなら対策が必要でしょう。

## 前処理

- 正例・負例でそれぞれに画像をランダムで並び替え、うち2割をテストセットとして分割し、残りをトレーニングセットとしました。
- 画像の大きさには500x278のものと450x250のものがあったので、450x250で大きさを統一しました。
- トレーニングセットの画像については、それぞれ左右反転・上下反転・上下左右反転した画像を加えることでデータのかさ増し(Data Augmentation)を行いました。

# モデル構築

畳み込みニューラルネットワークを使います。

![oriho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507909/07794916-cfde-b59e-4277-088820338805.png)

普通より入力画像のサイズが大きいのでストライドを多めに取るとか、Conv+Poolingをもう一個重ねてみるとか、Denseをもう一個挟むとかまあ色々考えたんですがどれもイマイチで、結局サンプルにあるようなCNNをそのまま使う脳死仕様モデルとなりました。
全結合層の長さで図の縦幅がヤバイ。

まあ先行研究は存在しないと思うのでベースラインってことで許してください…

モデルの構築や評価には[Deeplearning4j](https://deeplearning4j.org/)を利用しました。

# 評価

Evaluation Metrics

|評価指標|値|
|---|---|
|Accuracy|0.7684|
|Precision|0.7317|
|Recall|0.7317|
|F1 Score|0.7317|

Confusion Matrix

|0|1||
|---|---|---|
|43|11|**0=0**|
|11|30|**1=1**|

コメントに困る性能。

何の工夫も無くディープラーニングをやるにはどう考えてもデータが足りませんでした。
気が向いたら別の手法を試してみましょう。次にやるとしたら、ImageMagickのidentifyコマンドで出せる色の特徴量をSVMに突っ込んでみようかな。

# あとがき

どっかにバファローズポンタの画像分類を仕事にしてる会社とか無いですかね。

福ちゃん([@fukuchancat](https://twitter.com/fukuchancat))