ブログ

有馬記念なので馬とCustom Visionで遊んでみた

大北です。
今日は、有馬記念ということで、MicrosoftのCustom Visionを使って牡馬(「ぼば」と読みます。オス馬のこと。)と牝馬(「ひんば」と読みます。メス馬のこと。)の判別に挑戦してみました!
ちなみに、有馬記念とは、毎年12月の終わり頃に開催される競馬のG1レースです。ファンの人気投票によって出走馬が決まります。私の1番好きな有馬記念は、2014年の有馬記念です。常に3番人気以内にいたジェンティルドンナという牝馬が、引退レースにも関わらず、4番人気という(ジェンティルドンナの中では)低評価をつけられてしまいます。しかしながら、その低評価を覆して1着でゴールする姿は圧巻でした。レースが気になる方は、JRAによってYoutubeにレース動画があがっているので、ぜひ御覧ください。https://youtu.be/uH8Gooc2-FU
それでは、本題に入ります!
Custom Visionは、画像とタグを用意するだけで、簡単に画像識別器を作ってくれます。しかも、結果にアクセスするためのAPIまで用意してくれます。
簡単に使い方を説明していきます。
Custom Visionのページにアクセスし、”はじめる”ボタンからスタートします。
Custom Vision Get Started
新しいプロジェクトを作るように促されるので、以下を記入して、あたらしいプロジェクトを作ります。

  • プロジェクトの名前
  • プロジェクトの説明
  • プロジェクトのタイプ
    • Classification(分類。インプット画像には何がいるのか?を判別する。)かObject Detection(物体検出。インプット画像のどこに何がいるのか?を判別する)を選びます。今回は牡馬と牝馬を判別したいので、Classificationにしました。
  • 分類のタイプ
    • Multilabel(1枚の画像に複数のタグをつける)かMulticlass(1枚の画像には1つのタグしかつけない)を選びます。今回は、Multiclassにしました。
  • 対象は、どんなものか
    • 一般的なものなのか、食べ物なのか、… 。今回は、馬なので、Generalにしました。

新しいプロジェクトの作成
プロジェクトを作成すると、次は、画像の追加を促されます。
イメージの追加
“Add Images”ボタンを押して、画像を追加していきましょう。
以下の例では、netkeiba.comからお借りしたエイシンフラッシュの画像を追加してみました。(エイシンフラッシュは私が一番好きな馬です。競馬ファンの間でもイケメン馬として有名です。)
画像の追加
My Tagsには、アップロードした画像を表すタグを入れます。
今回は、牡馬と牝馬の判別をしていきたいので、牡馬であるエイシンフラッシュには、牡馬を表すcoltというタグをつけていきます。
とりあえず、牡馬、牝馬ともに32枚の画像を追加してみました。
ダッシュボード
右上の”Train”ボタンを押すと、学習が始まります。
学習は、すぐ終わります。ちゃんと測ってはいないですが、10秒もかからなかったと思います。
学習が終わると、以下のような結果がでてきます。
学習結果
全体のパフォーマンスは、Precisionが64.5%、Recallが64.5%です。つまり、インプット画像に対する判別が正しい割合が64.5%、学習データとして使った画像に対して、正しく判別できたものが 64.5%ということになります。ちなみに、Thresholdを50%としているので、インプット画像に対して、牝馬である確率が51%、牡馬である確率が49%という予測が出てきたとき、本当に牝馬であるならば、予測は正しい、牡馬であるならば予測は間違っていたとなります。(Thresholdは、左上にあるスライダーから変更できます。)
あとは、画像を32枚ずつしかいれなかったので、画像が少ないと怒っています。(通常は、ImageCountの所のバーが灰色です。)
それでは、実際に予測を出してみましょう。
上の方にある”Prediction URL”というボタンを押すと、APIが自動で生成され、URLとリクエストの方法を教えてくれます。

API

netkeiba.comにあるメイショウベルーガの画像(https://cdn.netkeiba.com/img.db/v1.1/show_photo.php?horse_id=2005106472&no=3060&tn=yes&tmp=no)を使ってAPIにリクエストを投げてみました。
すると、以下のような結果が返ってきました。

{
    "id": "xxx",
    "project": "xxx",
    "iteration": "e0ebd7a4-b4b8-4d30-9375-da340ab0917d",
    "created": "2018-12-21T06:51:01.7679986Z",
    "predictions": [
        {
             "probability": 0.979095161,
             "tagId": "59b46610-297e-4405-9a25-8d0dcc84180f",
             "tagName": "filly"
        },
        {
             "probability": 0.02090486,
             "tagId": "acee6b9d-7b6a-43b5-aa84-640277f5f886",
             "tagName": "colt"
        }
    ]
}

filly(牝馬)である確率が約98%、colt(牡馬)である確率が約2%です。メイショウベルーガは牝馬なので、当たっていると言っていいでしょう。
Custom Visionでは、この結果を残したまま、イテレーションを増やすこともできます。
牡馬324枚、牝馬326枚にして試してみたところ、Iteration1よりも悪い結果が出ました。
イテレーション2
PrecisionとRecallが64.5%から58.8%に下がっています。
原因として、同僚からは、牡馬と牝馬に微妙な差異しかなかったことや、学習用の画像が小さすぎたことを指摘されました。私が見ると、牝馬と牡馬では目の雰囲気などが違うのですが、同僚に説明してもあまり牡馬と牝馬の違いが伝わらなかったので、牡馬と牝馬を見分けるのは難しいのかもしれません。次回CustomVisionを使う時には、ちゃんとタグ間の差異がわかりやすい写真を選んでから、学習データに入れていこうと思います。
今回は、気合が足りず、良い結果を出せませんでしたが、それでも十分楽しかったので、みなさんもぜひCustom Visionで遊んでみてください!