見出し画像

スキー✖機械学習

こんにちは!記事を読んでいただきありがとうございます!!

スキーと機械学習を組み合わせたら面白そうではありませんか?今回はが画像認識や画像識別の機能をスキー応用することについて紹介していきます!

やろうとした理由

画像識別機を実際に作って動かしてみたかったという理由と、スキーの上手い下手を画像を読み込ませただけでわかるようにしたら面白そうだなと思ったという理由があります。
一つ目の理由については単純でpythonを使っていろいろなものを作っていく中で画像認識などの機械学習について興味がわきました。
二つ目の理由なのですが、私は大学で基礎スキーという競技をしていてそこで感じたことがもとになっています。
基礎スキー(デモスキー)は決められた演目の中で滑りの正確性や美しさ、合理性を基準に行われる採点競技です。学生の大会や全日本の大会があります。
とても楽しい競技なのですがいかんせん採点基準が難しいのです…。大会を見てると、「あれ、この選手のほうがいい滑りしてるけど点が出てない」みたいなこともあります。このややこしい採点基準を画像認識を用いて少しでもわかりやすくできないかなと思いました。
理想的には滑りの写真または動画を読み込んで点数を出す、または「何点台の滑り」というように分類するなどのことができるようにしたいです。

今回やること

「谷回り or 山回り」判定機を作る
まず手始めに画像を二つのカテゴリーに分類するということをやります。
谷回り、山回りというのは滑ってる中の局面です。

画像1

上の図はターンの軌道を表していて矢印の方向に向かって滑っています。また、青矢印が最大傾斜線(ボールを斜面に置いたとき転がる方向)です。簡単に言うと谷回りは図の赤丸で囲った部分、山回りは図の青丸で囲った部分です(厳密には違う!というかもしれませんが)。各局面での滑っている人のシルエットは右の写真のようになります。上の写真が谷回りのシルエット、下の写真が山回りのシルエットです。この二つには次のような違いがあります。

画像4

この二つの写真を判別して、谷回りと山回りを見分けられるのか?というのが今回の課題です。

判別機を作ろう

参考にしたサイトはこれです。Classify Flowers with Transfer Learning
一応pythonを使ってデータの処理などをしたことがあるのでこのサイトのみを参考にしてなんとか形にすることができました。
単純な流れはこんな感じです!
1.画像収集
2.機械学習のためのモデルを作り学習させる
3.テスト

画像収集

このパートがめちゃめちゃ大変でした。
犬、猫や人の顔などの画像だったらGoogleから画像を一括でダウンロードできるツール「google-images-download」で自動的に集められるのですが、今回はスキーの局面のシルエットの画像というとてもマニアックなものなのでそのツールを使っても目的の画像が得られないからです。試しにgoogleの画像を見てみると、、、

画像2

こんな感じできれいにシルエットだけが写った画像は少ないです。ということで、どうやって画像を集めたのかというと、それはもう地道に手作業で集めました。。
幸い、基礎スキーの映像をたくさん持っていたので、スクリーンショットを使って谷回りと山回りのシルエットの写真を集めました。

画像3

こんな感じの画像を何枚も集めました。カメラのアングルにも気を付けました。横からとった映像や斜めからとった映像だとシルエットに違いが出てしまうのでなるべく正面からの映像を使って画像を集めました。
合計で680枚(谷回り340枚山回り340枚)の画像を集め、そのうちの544枚をトレーニング用、136枚を検証用に使いました。

テスト

各サイトを参考にして作った判別機がしっかりと機能するのかテストします。参考にしたサイトをいくつか載せておきます。
TsnsorFlowを使って顔面補正してる写真家してない写真か判定してみた
機械学習で非エンジニアが「カエルの卵」「タピオカ」を分類してみた
TensorFlow tutorials

トレーニング用のデータと検証用のデータを用いたときの判別機の正確性はこのようになりました。

画像5

間違っているかもしれませんが簡単に説明します。
左のグラフのTraining Accuracy というのはトレーニング用の画像を用いて作った判定装置の正確性です。
Validation Accuracy というのはその判定機が検証用の画像セットに対してどのくらいの精度を持っているのかという意味です。Validation Accuracyはトレーニングセットには使われていない画像をちゃんと判別できるのか確認している感じです。今回はValidation Accuracyが96%と高い数値になりました。
次に右の図について。Training loss というのは学習データに対する損失関数の値です。この値が小さくなればなるほど学習ができているということになります。損失関数とかなんかお堅い単語を使っていますが、学習ができているのかできていないのか判断する指標みたいなものです。また、Validation lossというのは検証用データに対する損失関数の値で、この値が小さくなればなるほど汎化性能が高くなります。汎化性能とは未知のデータに対する識別能力のことです。
このグラフから言えるのは精度が高く汎化能力の高い判別機を作ることができたということです。

実際に試してみる

今まで使ってなかった画像を使っていくつか試してみます。

画像6

上の図のようにしっかりと判別できているようです。ちなみにtaniは谷回り、yamaは山回りです。

画像7

また、このように谷回りでも「く」の字が強くて外手もあまり上げない滑りの写真だったり、少し内倒していて頭と板の距離が遠いい山回りであってもしっかりと判別することができるようです。

まとめ

今回は目標だった「谷回りor山回り判別機」を作ることができました。
今後は内倒しているのかしていないのか、何級合格レベルの滑りなのか判断できるものを作っていきたいなと思っています。

この記事が気に入ったらサポートをしてみませんか?