さまざまな機械学習フレームワークのサンプルには、殆どの場合画像認識のコードを含んでいます。それらで扱うデータセットは公開されているものを使うケースがほとんどです。
手書き文字認識のMNIST、10種類のカテゴリからなる画像CIFAR-10、大規模なデータセットのImageNetあたりがよく使われているようです。
自分でもデータさえ集められればそれなりの精度で画像分類はできるはずなので、実際にデータセットを作ってみました。
データソース
Instagramに投稿された画像のうち、以下のキーワードで検索したものを対象としました。
- ハンバーガー
- サンドイッチ
- ホットドッグ
- 餃子
- シュウマイ
検索した結果の画像をクローリングして、目視で不適切と思われる画像を取り除きました。大体以下のような指針で実施しました。
- ある程度の大きさで対象物が写っている
- 見切れすぎていない(8割ぐらい)
- 対象としている物体が複数種写り込んでいない
1種類の画像につき、6000~7000程度あります。
データ取得
作成したのは画像URLのリストなので、それを元にデータを取得する必要があります。wgetなどを使うと楽でしょう。
$ wget -i urllist_gyoza.txt --wait 60
Instagramは一応CDNを使っているようですが、あまりアグレッシブに取得しに行くのはどうかと思い、自分は1画像あたり60秒程度のウエイトを起きました。
実際に認識モデルを作る
Chainerであれば、PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)という記事が参考になります。
取得したファイルにラベルIDをふったCSVファイルを用意して、訓練画像の平均値をcompute_mean.pyで計算し、学習を始めるまでの手続きが書かれています。
注意
個々の画像の著作権は、それぞれの撮影者にあります。データ自体のライセンスについては確認しないで収集、分類したので、画像そのものの再配布は許諾が必要なものが含まれていると思われます。
その他のリソース
Food-101 101種類の食べ物の画像を集めたデータセット