佐田です。 本記事は、ITOCが主催した平成27年度機械学習勉強会に参加した時に、私が感じたことについてまとめたものです。 上記のリンク先にも書いてあるとおり、平成27年12月から平成28年3月10日まで毎週開催された勉強会です。 参加者は、データサイエンティスト養成読本 機械学習入門編 (Software Design plus)を教科書にして学習していました。

機械学習勉強会の大まかな流れとしては、チームごとに分かれ、それぞれのチームで目標を決めて発表会で発表するという流れでした。 その発表までの流れに沿って本記事は書きました。

インターネット上の記事による学習

機械学習勉強会ではPythonを使用するとのことなので、配られたプリントに沿ってpyenvでインストールしました。 Pythonのインストールを終えてからチームごとに分かれて作業することになり、私が参加していたチームでは最初に機械学習のインターネット上の記事をやってみようということになりましたので、私は画風を変換するアルゴリズムの記事をやってみました。

インストールしていたのがPython 3でしたので、Python 3で動作させようとしましたが、chainer-goghが正常に動作してくれませんでした。 どうして正常に動作しなかったのか確認したところ、Chainerのドキュメントに以下のように書かれており、chainer-gogh内で使用しているchainer.functions.caffe.CaffeFunctionがPython 3に未対応のためでした。

This class only supports Python 2.7, since the compiled module for protocol buffers only supports Python 2. The init function raises an exception in Python 3.

Python 2.7をインストールし直してから動作させることに成功しました。

元記事に書いてありますが、chainer-goghは二枚の画像を用意します。 元記事の呼び方に従い、それぞれ画風を取得したい画像をスタイル画像、その画風を当てたい画像のことをコンテンツ画像とします。

chainer-goghはコンテンツ画像にある物体をそのままに、スタイル画像の画風に変換した画像を生成します。 元記事のように猫の画像の画風が変わるのは面白かったです。

Google画像検索からのダウンロード

次に発表会の目標を考えることになり、教科書に猫を画像認識する内容がありましたので、それを猫から特定の人物を画像認識するように変更してみることになりました。 教科書のプログラムは、あらかじめ用意した猫画像と猫ではない画像を使用し、プログラムに猫を学習させます。

そのプログラムを猫から人を画像認識するように変更するため、人の画像を集めることになりました。 さらに特定の人物を判定したいということになったので、同じ人物の画像を集めて正解の画像としてプログラムに学習させる必要がありました。

特定の人物の画像を集めた画像を正解としてプログラムに学習させることで、プログラムが判定する時にその人物であるとする正解率が高くなるからです。 その画像収集ですが、Google画像検索の検索結果から画像をダウンロードするスクリプトを作成して使用しました。

特定の人物の顔画像を作成

さらに収集した画像を顔部分に切り抜いた画像へ変換しました。 顔認識用のデータをOpenCLが公開していますので、その顔認識用のデータを使用して画像の顔がある部分の座標を取得してから切り抜くスクリプトを作成しました。

機械学習勉強会ではPythonでOpenCVを使用していました。 Rubyではruby-opencvを使うことで以下のように顔部分を切り抜くスクリプトを作成できるようです。 以下のスクリプトは、リンク先の記事を参考にしました。

require 'opencv'
include OpenCV

path = './haarcascade_frontalface_alt.xml'
detector = CvHaarClassifierCascade::load(path)
image = IplImage.load(ARGV[0])
detector.detect_objects(image).each do |rect|
  image.set_roi(rect)
end
image.save_image(ARGV[1])

スクリプト中で使用しているファイルのhaarcascade_frontalface_alt.xmlは、GitHubのopencvリポジトリのhaarcascades_cudaディレクトリ以下にあるファイルをダウンロードして使用しました。

そのスクリプトを使用して顔画像への変換はできましたが、画像の顔ではない箇所を顔と判定されて切り抜いてしまっている画像も含まれてしまい、手作業で取り除く作業をする必要がありました。 そのような振り分け作業を手作業で行ったので、機械学習の学習用データの振り分けに時間が掛かってしまいました。

画像認識による特定の人物の正解率の取得

最後にそれらの画像を使用して特定の人物を画像認識できるようにしました。 発表会ではチームのメンバが各自で収集した画像を元に、与えられた画像に写っている人にどれぐらい近いかの正解率をコンソール上に出力するプログラムを作成しました。

この作成したプログラムは、教科書の猫を画像認識するプログラムを人に認識させるように変更したものなので、ここでは特に紹介しません。

まとめ

私は機械学習についてはインターネット上の記事や雑誌などで言葉のみ知っているような状態でしたし、勉強会で使用したPythonも初めて使用しました。 そのような機械学習を知らない初心者も対象の勉強会とのことでしたので、楽しく参加できましたし、今後とも機械学習について学習していこうという気持ちになりました。

機械学習は難しいという印象でしたが、Pythonのライブラリのおかげで機械学習を使用するプログラムを作成することができました。 動作するプログラムが手元にあると、そのプログラムから機械学習について学習できるのが良かったです。

機械学習勉強会で作成したPythonのプログラムのコード量も少ないので、学習しながらでもプログラムを作成できたのが良かったです。

あと本記事で私が参加していた機械学習勉強会の平成28年度版が平成28年度ITOC機械学習勉強会1stとして開催されているようです。

参考情報

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

平成27年度機械学習勉強会

chainer-gogh

chainerのドキュメント

画風を変換するアルゴリズム

さんじゃらっと ruby + OpenCV で顔認識してトリミングするお

opencv

平成28年度ITOC機械学習勉強会1st