ファッション画像をディープラーニングで判別してみた

 

こんにちは。のっくん(@yamagablog)です。

 

前回の記事でファッション画像が含まれたデータベース、Fashion-MNISTの紹介をしました。

 

87%ほどの精度でしたので、もう少し精度を上げたいと思いチャレンジしてみました。

 

以下の2つの方法を使ったところ、精度向上ができました。

  • 4層の畳み込みニューラルネットワーク
  • データ拡張

 

スポンサーリンク

データの前処理

 

読み込んだ訓練用データ(X_train,y_train)を、さらに80%の訓練用画像と20%の検証用画像に分割します。

 

次に画像データが(784)のint型(整数型)で読み込まれているので、

  • (28,28)の二次元配列に変換
  • 画素値を255で割って0〜1の範囲のfloat(浮動小数点数)に変換

をします。

 

次にラベルデータも0-9の数字ではそのまま使えないので、ワンホットベクトルにします。

ワンホットベクトルというのは、例えば、

  • 1 → [1,0,0,0,0,0,0,0,0,0]
  • 2 → [0,1,0,0,0,0,0,0,0,0]

のように、カテゴリ数の要素を持つ1次元配列のことですね。

今回は、ファッションのカテゴリが10個あるので10としています。

kerasのto_categoricalを使います。

 

学習

 

以下のような4層のCNNを作って学習します。

 

テストデータでの評価結果は以下の通り。

 

90%超えましたね。

 

次に、データ拡張をしてみました。データ拡張というのが画像の水増しのことでして、以下の記事に詳しく書いてありますのでよかったらどうぞ。

【Keras】ImageDataGeneratorで画像の水増しをしてみた

 

以下のようにジェネレータを使うと、実行するのに時間がかかりますのでGPUを使うのがオススメです。

 

テストデータでの評価結果は以下の通り。

 

さらに精度が向上しました。Googleが提出したベンチマークでは93%なので、まぁそこそこ良い値なのではないでしょうか。

学習結果を可視化すると以下のようになりました。

考察

 

いつもならここで終わりなのですが、今回はもう少し踏み込んだ考察をしてみます。

機械学習にはclassification_reportという便利な機能があり、これを使うとテストの段階で機械がどのカテゴリに分類したかをみることが出来ます。

 

class6(シャツ)の正解率が低いですね。(recallとf1-scoreって何やねん。)

試しに、不正解だった画像を見てみます。

右下の6(シャツ)を3(ドレス)と判別し誤判定となっているようですが、私が見てもこれはシャツではなくドレスに見えます。

9(アンクルブーツ)を7(スニーカー)と判別して誤判定となっていますが、アンクルブーツとスニーカーの違いって人が見ても分かりづらいな〜って思います。

 

おわり。

参考

Medium,

https://towardsdatascience.com/the-4-convolutional-neural-network-models-that-can-classify-your-fashion-images-9fe7f3e5399d