あさの畑

プログラミングが好きな大学生のブログ。統計学や機械学習の勉強記録と、SIGNATE/Kaggle/AtCoderのお話。

【Deep Learning実践編】ひたすら調べて自分でなんとかAIによる画像認識をしてみた

f:id:gadada:20180730214945p:plain

 

以前書いた記事の続編(後編)ということになります。

www.asanohatake.com

 

 

とりあえずディープラーニングの基本的なことは理解したつもりでした。

 

しかし、自分で作ろうと思っても全くどうしたらいいのかわからないことに気づき、勉強法を変えることにしました。

 

「動画を見たり、本を読んだりするのはもちろん大切だが、サンプルコードを写しているだけや、用意されたデータセットを使っているだけではいけない。とにかく自分でなにか作ってみて実践力をつけるしかない。」

 

そう思ったのです。

 

記事読み込み期

まず僕は、とにかく実際にディープラーニングを用いて画像認識をされている記事を読み漁りました。

 

その中で僕の「樹皮画像から樹種を同定したい」という思いと非常に近くて大変参考になったのが、こちらの記事です。

 

「ディープラーニング×きゅうり」の可能性に、たったひとりで取り組むエンジニア

 

かなり有名みたいですが、僕は初めて知りました。1ヵ月前まで全く興味がなかったので当然と言えば当然かもしれませんが…。

 

他にも参考になる記事がいくつもありました。ありがとうございます!

 

ディープラーニングでザッカーバーグの顔を識別するAIを作る①(学習データ準備編)

TensorFlowによるももクロメンバー顔認識(前編)

機械学習で乃木坂46を顏分類してみた - Aidemy Tech Blog

 

 

TensorFlowと奮闘、だが失敗。

どうやら「TensorFlow」というフレームワークが有名でいいらしいということなのでさっそくインストールして英語のチュートリアルに挑みました。

 

でも…

英語だし、難しいし、よくわからない。

 

とりあえず、MNISTチュートリアルの完成コードを実行してディープラーニングを体験してみることはできましたが、コードの書き方は依然としてわかりません。

 

いろいろ調べていると「Keras」というフレームワークがわかりやすいみたいだと知り、TensorFlowは諦めてKerasでやっていくことにしました。

 

Kerasだと日本語の詳しいページがある上にコードが短くて書きやすいので初心者にもおすすめだそうです(これは本当に感じました)。

 

Kerasでディープラーニング。気合で乗り切る1週間

とは言ってもそう簡単にコードが書けるようになるわけではないので、再び様々な記事を読み込むことに。ひたすら読んでいるとだんだんわかってきます。

 

こちらの記事が参考になりました。ありがとうございます!顔認識をしてみた記事が多い中、こちらは花の識別や物体認識なのでとても参考になりました。

 

keras(tensorflow)で花の画像から名前を特定

KerasでCIFAR-10の一般物体認識 - 人工知能に関する断創録

 

しかし、つまずいたポイントもいくつかありました。特に自分のデータセットを作るのが大変でした。

 

データセット作成の壁を乗り越えた!

一番難しいのは、やはり自分で画像のデータセットを作るところ。

 

MNISTは使いやすい形になっていますが、自分のデータを使って学習させたいなら、まずは画像データセットを作成しないといけません。ここがけっこう難しかったです。

 

画像を読み込んだり正解ラベルをつけたり配列にまとめたり。また、サイズなどデータの形や大きさにも注意を払わないといけないのが大変でした。

 

1週間ぐらい画像の読み取りのことしか考えていませんでした(笑)。ご飯食べてる時も、授業中も、歩いてる時も。何をしているときも画像の読み込みとデータセットの作成のことで頭がいっぱい。

 

そしてなんとか学習モデルに入力できる形に画像データを変換できました!

 

わい天才かもしれん!(←『弱虫ペダル』の鳴子章吉くん風)

 

よし、あとは写真を撮ってこればいいだけだ。

 

そうです、実際の画像はまだありません。画像があるとしてとりあえずデータセット作成のコードを書いていたのです。ですので画像さえ入手できればデータセットは完成します。

 

参考にさせていただいた記事はこちらです。ありがとうごさいます。

 

オリジナルのデータセットを読み込むための準備

機械学習(ディープラーニング)初心者のためのデータセットにまつわる話

TensorFlowとCNNで、自作データセットを画像分類する

Python, Pillowで画像を一括リサイズ(拡大・縮小) | / note.nkmk.me

・Pillowは画像編集ができるのですが、OpenCVよりも使いやすく感じました。

Pythonでのファイル操作

 

 

写真を集めてきて、モデルを適当に組んで、実行。モデルはいろんなところに書かれているので、それらを参考にして適当に組んでみました。

 

初めて自分のデータで学習が進んでいく。。。

 

あーーー!

 

ようやく長いトンネルを抜けたような気分。

 

もちろん精度はまだまだです。というか、うまく学習が進んでいません…。しかし、エラー画面ばかりだったので、認識精度(accuracy)が表示されるまでいったのがとてもうれしかったのです!!

 

今後の課題としては、モデルの構築をやり直して精度を上げることです。(その前にちゃんと学習が進むこと。)また、データ拡張をして画像データを増やす必要もあるかもしれません。

 

まだまだ、やるべきことが多くてようやくスタートラインに立てただかけかもしれませんが、少しずつ前に進んでいこうと思います。

 

ちなみに、今のところ正解率が40%なので恥ずかしくてコードを見せることもできません(笑)CNNモデルを適当に組み立てちゃったのでしょうがないのかもしれませんが…。

 

精度が上がればコードもお見せしたいと思います。しばしお待ちを。。。

 

 

【追記】

データ拡張と転移学習によりテストデータの正解率が97%を超えました。

 

こちらの記事で詳しくまとめましたので、よろしければどうぞ!

www.asanohatake.com