花束の画像から花の本数を特定する手法

花束の画像から機械学習を用いて花の名前と本数を特定する手法について考えてみます。 機械学習に慣れていない方が実際にこのようなタスクを行う場合には、多くの画像認識の手法の中からどの手法を選ぶとよいのか悩んでいるかもしれません。 また、API等の利用を考えているかもしれません。 今回は画像認識の手法ごとの違いやAPIを利用する場合、しない場合の違いを考え、どのように手法を選ぶべきかというのをまとめています。

画像認識手法の分類

まずは、画像認識全体の手法について見ていきます。 近年のDeep Learningの盛り上がりによって多くの画像認識手法が生み出されていますが、それらは大きく以下の図のように分類することができます。 f:id:gri-blog:20200630154552p:plain Image Classificationとはクラス分類を行う手法です。 画像の中に何が写っているのかを導き出す手法です。 画像から"CAT"であると判断するようなモデルがこれになります。 もし画像のどこに猫が写っているのかを知りたいのであれば、Image Localizationを行います。 そして、"犬と猫"のように複数の物体の位置を知りたい場合にはObject Detectionを行います。 Image LocalizationやObject Detectionではどこに"Dog"がいるのかを矩形によって表現しましたが、ピクセル単位で知りたい場合にはImage Segmentationを行う必要があります。 Image Segmentationを行うと複数の物体の形まで認識することができます。

複数の花が写っている画像から花の名前と本数を知りたいのであれば、Object Detectionを行う必要があります。 複数の花が写っているためImage Localizationでは不十分です。 また本数が分かれば、位置を正確に知る必要はないため、Image Segmentationを行う必要はありません。

Object Detectionの実現手法

Object Detectionを行うための手法は3つあります。 これらの手法は実現までの早さ、作業量、実現できるタスクの細かさ(=自由度)に違いが現れます。

1つ目はAPIを利用する手法です。 仮に画像から花の位置と名前を正確に特定できるAPIが存在するのであれば、それを利用することを検討すべきです。 既存のAPIを利用すれば、早く、少ない作業量で目的を達成することができます。 ただし、その分自由度は低くなり、望んでいるラベルが存在しないことも考えられます。 f:id:gri-blog:20200701101439p:plain

2つ目はタスクを分割し、複数のAPIを利用する手法です。 今回のタスクの場合には、花の位置を特定するAPIと花の名前を特定するAPIによって実現することができます。 前者は花の名前が分からずとも、位置が認識できれば、花1本ずつの画像を切り出してくることができます。 後者はImage Classificationを行い、花の名前を特定します。 この手法の場合にも早く目的を達成することができます。 作業量は1つ目の手法よりは増えますが、その分自由度も高くなる可能性があります。 ただし、API次第であることには変わりないため、望んでいるラベルが存在しないことも十分に考えられます。 f:id:gri-blog:20200701101530p:plain

3つ目は自作のモデルを構築する手法です。 この場合には自由度が最も高くなり、望んでいるラベルを用意することができます。 ただし、大量の訓練データも用意する必要があります。 作業量が大きくなり、モデルを構築するまでに多くの時間がかかることも考えられます。 f:id:gri-blog:20200701101648p:plain

APIの調査

ここからはAPIが実際に存在しているのか、今回のタスクに利用できるのかを調べていきます。

まず、画像から花の位置と名前を特定するAPIですが、2020年7月1日時点では見つけることができませんでした。 そのため、1つ目の手法を選択することはできないと判断します。

次に、位置を特定するAPIと名前を特定するAPIについて調べてみました。 その結果、それぞれGoogle Cloud Vision APIとPlant.idというAPIが見つかりました。 それぞれを試してみます。

Google Cloud Vision APIにバラの画像を入力した結果は以下のようになります。 f:id:gri-blog:20200701104901p:plain 2本とも"Flower"であると正しく認識されています。

花束の画像でも試してみます。 f:id:gri-blog:20200701105339p:plain こちらは3本のみしか見つけることができませんでした。 今回のタスクでは花束の画像を扱うため、APIの利用を控えた方が良さそうです。

Plant.idについても見ていきます。コスモスの画像を入力します。 f:id:gri-blog:20200701111905j:plain コスモスであることが正しく認識されています。

次にシャクナゲを入力してみます。 f:id:gri-blog:20200701112028j:plain シャクナゲの場合には正しく認識することができませんでした。 実際に名前と本数を特定したい画像にシャクナゲの画像が入っている場合には注意が必要であることが分かります。

調査の結果、花束の画像に対してはAPIの利用が難しいことが分かりました。 そのため今回のタスクを行う場合には、自作のモデルを構築する必要があります。

終わりに

花束の画像から花の名前と本数を特定するための手法について考えてみました。 早さや作業量、自由度のどれを重要視するのかによってAPIを利用するかどうかを決めます。 ただし、APIを利用する場合には望んでいるように画像を認識できるかどうかを十分に調査する必要があります。