51代のしらすです。ここ二週間のことですが、機械学習をはじめました。以前から画像分類を機械にやらせてみたいなぁと思っていました。やったことをまとめます。初心者が勝手に書いたことなので間違っていることもあるかもしれません。ご指摘いただけると助かります。
機械学習での画像分類?(Image Classification)
漠然と機械学習をやってみたいと思ってたのですが、はじめから理論を勉強するのはモチベーションがないし、読んでもよく分からなかったので、まずは何か作ってみることにしました。そこで様々な画像が混在するデータセットから何の画像なのかを判定して画像分類をするものを作ってみたいと思いました。
ひとえに機械学習といっても様々なものがあります。こちらの記事にまとまっています。
インターネットを調べていると、画像分類をするにはどうやら機械学習の中でも畳み込みニューラルネットワーク(CNN: Convolutional Neural Network)と呼ばれるものを作るとできるようだということが分かりました。
機械学習のフレームワーク
このCNNを作ることができるフレームワークも世の中にはたくさんあるということが分かりました。
- Tensorflow
- Chainer
- Caffe
- Keras
などなどたくさんあります。どれを使うか迷ったのですがChainerは日本の企業が作ったものらしいのでそれを使うことにしました。
Chainerを使ってみる
ChainerはPythonで使うことができます。Windowsにanacondaを入れました。CNNについては何も分からないままでしたが、とりあえずインターネット上のサンプルコードを参照して画像分類のプログラムを作ることができました。以下の記事にまとめてあります。
みす51代 Advent Calendar 2017 (14日目) 機械学習でアホガールのさやかちゃんを判定してみる
結局CNNって?
一度実装を経験してから理論を勉強してみると理解がしやすくなりました。こちらの記事が参考になります。
Convolutional Neural Networkって?
読んでわかったような気にはなりました。
もう少し手軽に機械学習をする方法がないのか(Docker+Digits)
環境構築もプログラミングも面倒すぎたのでもう少し手軽にする方法がないのか調べていました。そうするとブラウザ上で操作ができるDigitsというフレームワークがあることを知りました。グラフィックボードで有名なNVIDIAが作っているそうです。環境構築もDockerと呼ばれるものを使うととても簡単です。Docker Hubにはnvidiaの公式が出している「nvidia/digits」とCPU onlyで実行できるようにしてくれている「kaixhin/digits」がありました。使っているWindows PCはグラフィックボードが載っていましたが、残念ながらWindows版のDockerはグラフィックボードに対応していないので「kaixhin/digits」を使いました。
初回のみは以下のようなコマンドをコマンドプロンプトで打ちます。
docker pull kaixhin/digits
docker run --name digits6 -d -p 5000:5000 kaixhin/digits
これでlocalhost:5000にアクセスします。Digitsが起動しています。
次回以降は以下のように起動したり停止します。
docker start digits6
docker stop digits6
exampleとしてMNIST(手書き文字のデータセット)の分類があります。
https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md
Digitsを使ったImage Classification
実際にDigitsでImage Classificationをやってみました。データセットとして「Caltech 101」と呼ばれるものを使いました。飛行機や椅子や人の顔などの画像が分類された状態でたくさん入っています。
CNNはAlexNetを使いました。トレーニング結果です。
Job Statusを見ていただけると分かるのですが、実に1日と1時間もかかりました(これはひどい)。ちなみにGTX 1080 Tiを積んだUbuntuのDockerで、Digitsを動かして同じことをやったらたったの5分弱で終わりました...Ubuntuに移行しようと思いました。
ともかく学習したモデルを使って画像が何の画像なのか判定させてみます。Google検索などで画像を引っ張ってきました。一応全てCaltech 101に含まれているものです。
①いす
一応椅子の確率が一番高いと出ましたが同じくらいでヒトデと判定されていますね...
②銃
98.22%で銃と出ました。
③トラ
!?盆栽ではない...
④自分の部屋の椅子
!!?!?!?フラミンゴではない...
学習させていないような類の画像を与えたらどういうことが起こるかよくわかりました。
終わりです。ありがとうございました。