

最近よく耳にする、「機械学習」といった言葉。機械学習を利用すれば、言語や画像を分析して自動的に分類するプログラムを作成することもできるようですが、正直コードを書いたことのない非エンジニアの私にとっては、魔法のような話です。もちろん面白そうで興味はあるのですが、自分にそんな高度な技術が使えるはずもなく、「やってみよう」と思ったことは一度もありません。
しかし先日、「プログラミング未経験者でも、機械学習で画像分類できる方法がある」との情報を耳にしました。どうやらGoogleによって開発された、「TensorFlow(テンソルフロー)」という機械学習のソフトウェアライブラリを使用するよう。TensorFlowはオープンソースで公開されており、個人・商用を問わず誰でも無料で使用することができるそうです。
“TensorFlow”.2017.Google LLC.
https://www.tensorflow.org/
正直「オープンソース」の意味すらググらないとわからなかったのですが、こんな私でも機械学習を体験できるということで、『TensorFlowを使って顔面補正してる写真かしてない写真かを判定してみた』を参照しながら、画像分類プログラムの作成に挑戦したいと思います!
ただし、私はプログラミング知識が全くないので、これまで『ニューラルネットワークを使ってLINEの相手が「おじさん」か「女の子」か見破ってみた』や『Tensorflow Object Detection APIを使って街中で人間を検出してみた』などの記事でお世話になっている、ranranさんにサポートをお願いしました!
機械学習による画像分類とは?
そもそも、機械学習による画像分類とは何なのでしょう?
機械学習とは、コンピューターがデータから反復的に学習を行うことで、パターン・特徴などを見つけ出し、未知のデータに対して予想できるようになる技術のことです。
今回TensorFlowを使用して行う「画像分類」では、複数のラベルに分けた画像データを学習させたコンピューターが、学習した各ラベルの特徴をもとに、ラベルのついていない画像を自動的に分類するという、機械学習の1つの手法を用います。
画像分類プログラムの作成に挑戦!
それでは、いよいよTensorFlowを使った画像分類に挑戦していきます!
今回分類するのは、巷で似ていると噂される「カエルの卵」と「タピオカ」、「チアジード」です。私はタピオカもチアシードも大好きなので、画像分析によって「カエルの卵」とは似ていないこと証明できると期待しています。
ちなみに、画像分類を行う際は、TensorFlowをWindows10で使える環境を準備しておく必要があります。環境構築については、こちらの記事を参考にしてみてください。
“TensorFlowを使って顔面補正してる写真かしてない写真かを判定してみた”
https://www.pc-koubou.jp/magazine/15856
学習用の画像データを準備する
環境が構築できたら、学習に使うデータを準備します。今回はGoogleから画像を一括でダウンロードできるツール「google-images-download」を使用しました。
「google-images-download」使用方法は、下記の記事の「データの準備>インターネットにある画像を使いたい場合」の項目を参照してみてください。
“TensorFlowを使って顔面補正してる写真かしてない写真かを判定してみた”
https://www.pc-koubou.jp/magazine/15856
このツールを使うと一回で100枚の画像を集められます。判定精度を上げるためにより多くのデータが欲しいので、今回は各ラベルを日本語と英語で入力し、それぞれ200枚ずつ学習用のデータを集めました。
この方法だと、1つのラベルに対してダウンロードファイルが2つある状態になってしまうので、ローマ字のファイルに同じラベルの画像を集めます。
「カエルの卵」「Frog eggs」
「タピオカ」 「tapioca 」
「チアシード」「Chia Seeds 」
集めた画像は目視で確認し、明らかに違うものは削除しました。そのため、実際に使用した学習データは各ラベル200枚以下です。
画像データを学習させる
次に、集めた画像を、TensorFlowの公式チュートリアル「TensorFlow Image Recoganization」を使って、学習させます。
学習させる方法は、下記の記事の「TensorFlowの公式チュートリアルを使って学習させる」の項目を参照してみてください。
“TensorFlowを使って顔面補正してる写真かしてない写真かを判定してみた”
https://www.pc-koubou.jp/magazine/15856
今回は、「frog_eggs」「tapioka」「chia_seed」のデータを、各4000回学習させて、画像分類プログラムを作成しました!
作成したプログラムで画像分類してみた!
ここからは、作成したプログラムが本当に画像を正しく分類できるのか、検証していきます。
①カエルの卵
まずは「カエルの卵」の画像から検証してみたいと思います。
判定結果は・・・
カエルの卵 99%
タピオカ 0.9%
チアシード 0.1%
お見事!「カエルの卵」に正しく分類されました!一応他の画像でも試してみましたが、
カエルの卵 90%
カエルの卵 98%
と、それぞれ正しく分類することができました。
②タピオカ
次は、「タピオカ」の画像で検証してみましょう。市販のタピオカミルクティーの、タピオカだけを紙コップにあけて撮影した画像です。判定結果は・・・
カエルの卵 45%
タピオカ 34%
チアシード 21%
なんと、「カエルの卵」だと判定されてしまいました!正解である「タピオカ」よりも9%だけ上回っています。惜しい。
③タピオカ入りドリンク
画像を変えて、もう一度「タピオカ」を分類させてみることに。今度はミルクティーに入れた状態で撮影しました。結果は…
タピオカ 79%
チアシード 19%
カエルの卵 2%
正しく「タピオカ」だと判定されました! 79%と、比率も高めです。
④チアシード
続いては、「チアシード」の画像で検証してみます。こちらも紙コップにあけて撮影した画像を使用しました。結果は…
チアシード 80%
カエルの卵 19%
タピオカ 1%
お見事!「チアシード」であると判定されました!
⑤チアシード入りドリンク
「チアシード」の画像が正しく分類されることは確認できましたが、先ほど「タピオカ入りドリンク」の画像を分類したので、「チアシード入りドリンク」の画像でも検証してみたいと思います。結果は…
タピオカ 80%
チアシード 18%
カエルの卵 2%
なんと、「タピオカ」であるとの判定に!
今回なぜこのような結果になったのか考えてみたところ、学習させる際に使った画像が、「タピオカ」→ドリンクに入った状態で撮られたものが多い、「チアシード」→ドリンクに入っていない状態で撮られたものが多い、と偏っているのが原因かと思いました。つまり、カップに入っていることで「タピオカ」と判定されているのかもしれないのです。より正確に分類を行いたければ、学習データの選び方にも気をつけるべきでしょう。
プログラミング未経験者でも機械学習を体験できた!
以上、プログラミング未経験者がTensorFlowを使って「タピオカ」「チアジード」「カエルの卵」の画像を分類してみました。正しく判定されないこともありましたが学習データの選び方を改善すればより精度を上げられそうですし、コードを書いたことのない私としては、今回の結果が出せただけでもかなり満足です。
自分が画像判定プログラムを作成できるなんて考えたこともなかったので、最低限の入力作業で手軽に機械学習を体験できるTensorFlowは、いい意味で衝撃的でした。エンジニアの方はもちろん、私のような非エンジニアの方も、ぜひTensorFlowでオリジナルの画像判定プログラムを作ってみてはいかがでしょうか!
[ネクスマグ] 編集部
パソコンでできるこんなことやあんなこと、便利な使い方など、様々なパソコン活用方法が「わかる!」「みつかる!」記事を書いています。