プログラミング

【機械学習】CNNを使って神獣ベコたちを分類してみた




最近、仕事でもちょこちょこ機械学習をいじることが増えてきて、家でも書いてます。

神獣ベコたちを分類しようと思った

先日のことです。

ということで、うっかり5種をコンプリートしてしまいました。

いやね、コンプする予定はなかったんですよ。

っていうロジックだったんですけど。
プログラム実行すると、大体3000円くらいでケルベコス引き当てるか、3連続同じの引いて処理止まるんですけど。
現実がこれ↓

ちょっと引きすぎたw
最初にケルベコス以外がストレートで4種揃ったのがいけなかったよね。
やめられなくなるパターン。
(このうち4種1ベコずつは里親様のもとに旅立ちました)

で。
せっかく集めたのに使わないともったいないので、機械学習で神獣ベコたちを分類してみました。

学習用の画像を撮影する

960×960でそれぞれ50枚plus α撮りました。
本当はもっと撮る予定だったんですが、角度を変えて撮り続けるというのが意外と辛く。。。
50枚を学習用に、余った分は学習後に分類する用としました。

コードを書いていく

と言っても、今回はいろんなところのソースを参考にしたので、あまりガリガリ書いてはいません。

画像を水増しする

先述の通り学習画像を各50枚、合計250枚しか用意していません。
これでも一応60%くらいは認識するのですが、さすがに少ないので、kerasのImageDataGeneratorを使って画像を増やします。

こちらを参考に、水増し用のコードを作成。

で、できたのがこちら

実行すると…

元の画像に対して

こんなのとか

こんなのができます。

写真って、光の加減で色が変わったりするよね。
角度も毎回同じとは限らないよね。
ってことで、学習精度が上がるんだと思いますたぶん。
(水増ししすぎると過学習の原因になるので注意)

画像を読み込んで学習させる

学習用の画像ができたら、今度はモデルを使って学習させていきます。
ベースはこれを使ってます。

画像を読み込んでラベルを付ける

こちらを参考に、データセットを用意する処理を書きます。

cifar10_deep_with_aug.pyのclass CIFAR10Dataset(): get_batchを修正。

モデルを作成して学習する

ほとんど元の処理のままですが、一部変更。

fit_generatorの引数workersを、何となく4→5に上げてみました。
ここに1以上の数字を設定すると、その数だけ並列処理をしてくれるらしいです。

が、あとで調べたらWindowsは対象外とのこと。。。
macかLinuxでなら効果があると思われます。

学習にどれくらいかかるのかをログに出すコードも追加。

これで、学習終了後に

という感じで時間が出力されます。
古いCPUだけで処理してるので、画像が少ないのに11分以上かかりました。。。

できたコードを実行すると、学習結果(重み)とログファイルが出来上がります。
コンソールで

と実行すると、tensorboard が起動するはずですが…

モジュールがないと怒られました。
たぶんtensorflowをインストールすれば動くと思うんですが、今は使わないので

としてみると…

無事起動しました。
もしこのURLにアクセスしても表示されない場合は、http://localhost:6006にしてみてください。

それぞれの結果がグラフで見れます。

学習結果を使って画像を分類する

最後に、作成した重みを使って、画像を分類してみます。
こちらをベースに作成します。

最後の結果表示部分を書き換え。

作ったコードを実行してみると…

正解率83%でした。
ミノタウベコは明らかに色が違うのでわかるとして、角しか特徴がないユニベコーンも全部合ってますね。
キマイラベコは特徴が多いのでいけそうな気がしてましたが、あまり良い結果になりませんでした。

画像が少なくても意外と当たる

今回、各50枚ずつという少ない画像で分類を行いました。
実は1つミスをしていたんですが、思っていたよりは精度が出たんじゃないかと思います。
(水増しした画像は、学習データの検証(x_test)に使ったらだめらしいです。。。)

あとは学習用の画像を増やしたり、できるだけベコだけ写っているようトリミングしたりすれば、精度90%越えもできるはず。
時間ができたらもう少しいじってみようと思います。

-プログラミング
-, ,

© 2024 そんなこと猫でもできる Powered by AFFINGER5