【Python】ジェスチャー画像を分類してみた

こんにちは、のっくんです。

今日はKaggleにあったジェスチャー画像の分類を、ニューラルネットを使ってやっていきたいと思います。

Hand Gesture Recognition Databaseという、リープモーションで撮影した赤外線画像のデータベースを使います。

https://www.kaggle.com/gti-upm/leapgestrecog/version/1

データセットをダウンロードするには、Kaggleにログインする必要があります。

10種類のジェスチャー画像

スポンサーリンク

画像データの読み込み

まず最初に画像とラベルの読み込みをやっていきます。

画像データをX、ラベルをyとします。

画像枚数は2万枚ありますが、1枚ずつopencvで読み込んでリストに追加(append)していきます。

ラベルはファイル名についている、01~10の10種類のラベルを使用することにします。

こちらも1枚ずつ、ファイル名からリストに追加(append)していきます。

これで、Xとyが作成できました。

リストからnumpy配列に変換

Xとyが作成できましたが、今のままだとリストです。

ディープラーニングをする際には扱うデータはnumpyの配列が定石なので、numpy配列に変換しましょう。

さてここでyのラベルの数を数えてみます。

01~10のラベルがありますが、ワンホットベクトル(1次元ベクター)に変換する際に、10があるとエラーが発生しました。

np.whereを使って、10を00に変換します。

データの分割

学習用とテスト用にデータを分割します。

16000枚を学習用、4000枚をテスト用に分割しました。

学習の前処理

画像データの場合、ディープラーニングにかける前に1次元にしたり浮動小数点数にする必要があります。

ラベルデータはワンホットベクトルにするのが定石です。

このあたりの処理は、numpyとkerasを使うとすぐに変換できます。

学習

入力層(120*320)〜中間層(512)〜出力層(10)の3層から構成される多層パーセプトロン(ニューラルネット)を作ります。

実行結果は以下の通り。

EarlyStoppingを使っているので8エポックで終了し、精度は約99.7%でした。

実行速度はGeforce GTX1060を使って2分程度でした。

シンプルなネットワークでしたが、かなりの精度が出て驚きました。

というのも、前にcifar10データセットに多層パーセプトロン(MLP)を適用してあまり精度が出なかったからです。

精度が低かった場合には畳み込みニューラルネット(CNN)を試そうと思っていましたが、試さなくても良いかな。

おわり。

ABOUTこの記事をかいた人

のっくん

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog