CULTA Tech Blog

株式会社CULTAのテックブログです。

深層学習と物体追跡の手法を用いた梨の果実個数カウンティング

※本研究は、東京大学との共同研究により生まれた成果です。

1. はじめに

本稿では、果実の個数のカウンティングと、そのおおまかな流れについて述べます。紹介する技術は、深層学習を利用しています。

  • 農業の現場で、深層学習(AI)を利用したい
  • 深層学習(AI)の応用事例を知りたい
  • 深層学習を用いた物体の検出のおおまかな流れを知りたい

といった方々のためになれば幸いです。

1.1. この記事で取り扱う内容

この記事では、樹上の果実の個数を自動的にカウントする(以下、カウンティングとする)方法について述べます。対象となる果実などの動画を撮影し、その動画から、対象の果実のカウンティングを行います。その結果の例が以下の画像です。それぞれの果実は、異なる長方形の箱(バウンディングボックス)で囲われていることがわかります。同一の果実は、動画を通して、同じ色のバウンディングボックスで示されており、うまく果実をカウンティングできていることがわかります。

この結果を利用すると、例えば、その果樹園に存在する果実の個数を予測することができます。これにより、そのシーズンに出荷できる果実の個数の推定や、より正確な収穫作業の人員確保の計画につながりそうです。

 さらに、バウンディングボックスの大きさをもとに、果実の大きさを大まかに知ることができます。また、そのバウンディングボックスの大きさから、果実の重量を知ることができれば、その重量のバラツキ具合、つまり、重量の分布を以下のようにヒストグラムで可視化することができます。例えば、以下は、ある重量を有する果実がどれくらい存在するかという分布を示すイメージ図です。このように、重量の分布を知ることができたら、今シーズンの予測される出荷額や、それぞれの場所ごとによる生育の差を定量的に知ることにつながります。

今回は、果実(梨)を例にお話ししましたが、別の果実や、作物でも適用が可能です。さらに、動物を対象に行うことも可能です。梨を例にとった理由としては、背景が緑(葉っぱの色)であり、さらに、対象も緑色をしており、カウンティングが難しいと思われるからです。このような対象に対しても精度よくカウンティングを行うことができたら、他の対象にも広域に展開できそうです。それぞれの対象となるデータや現場での気づきをもとに、最適な手法の選択や、前処理の工夫を行うことで、良好なカウンティング結果を得ることを目指します。

1.2. この記事の目的

この記事では、深層学習を用いた物体のカウンティングによって実現できることや、そのおおまかなステップについて説明することを目的にします。専門用語や、難しい言い回しをできるだけ避けるよう努めており、分野外の方にも役立てば幸いです。

 なお、本研究は、東京大学との共同研究により生まれた成果です。実際に、実験やプログラミングを行った学生(当時)による論文のリンクを以下に掲載します。

https://opg.optica.org/osac/fulltext.cfm?uri=osac-4-5-1688&id=451117opg.optica.org

2. 大まかなステップ

2章では、1章で説明したカウンティングのための、大まかなステップを紹介します。必要なステップとしては、

  1. 学習のための訓練データを作る
  2. 物体検出のための深層学習のネットワークを学習する
  3. 物体の検出をする
  4. 物体を追跡する

となります。

2.1. ステップ1:学習のための訓練データを作る について

今回は、深層学習を用いて物体を検出させます。ここでは、深層学習(AI)を学習させるためのデータ(訓練データと呼ぶ)が必要になります。この訓練データを深層学習のネットワークに覚えこませることで、物体の検出が行えるようになります。以下の図は、訓練データに対して、どの位置に梨が存在するかを示した(ラベリングと呼ぶ)ときの例です。このラベリングの作業は、基本的に人間の手で行います。

2.2. ステップ2:物体検出のための深層学習のネットワークを学習する について

2.1. で作成した訓練データを用いて、実際に深層学習のネットワークに訓練させます。ステップ1で、「画像のこの箇所が梨ですよ」といったことを示しているため、その情報をもとに学習を行うことができます。

2.3. ステップ3:物体の検出をする について

2で訓練させた、深層学習のネットワークを用いて、物体の検出を行います。ここでは、テストしたい画像や動画に対して、物体の検出を行い、画像のどの位置に、どの物体が存在するかを知ることができます。以下の動画は、梨を自動的に検出したときの結果の例です。それぞれ梨に対して、バウンディングボックスが生成され、梨の位置を確認することができます。

2.4. ステップ4:物体を追跡する について

2.3の動画を見ると、すでに梨のカウンティングは完了しているように見えます。しかし、カウンティングを行うには、追跡というステップが必要です。

 以下の図を見てください。左右の画像は、同じ場所を歩きながら撮影しています。赤丸で囲われている梨は、同一のものです。そのため、2.3のように検出をしたのちに、「この梨はすでに見つけているよ」という情報を得る必要があります。このステップのことは、ここでは追跡と呼びます。この追跡と2.3の検出をセットで行うことで、カウンティングを行うことができます。

3. 各ステップのより詳しい内容

3章では、2章で述べた各ステップの内容をより詳しく記述していきます。なお、詳しいやり方について知る必要のない方は4章まで読み飛ばしていただいて構いません。

3.1. 学習のための訓練データを作る

今回は、梨の木の下を歩いて動画を撮影し、そのデータを訓練データとしました。以下の動画は、歩きながら取得したときの例です。特別なカメラは不要で、この動画は、スマートフォンのカメラを用いて撮影しています。動画の撮影に関しては、台車やドローンに設置したカメラからの撮影でも可能ですし、ロボットに撮影してもらうことも可能かもしれません。また、カメラではなく、対象が動く場合も考えられます。例えば、ベルトコンベア上に流れる商品に対して、動画の撮影を行うことも可能です。

以下に、ラベリングの様子を示す画像を再掲します。今回は、MATLABというソフトウェア (MathWorks, USA)のビデオラベラーという機能を用いてラベリングしています。簡単にいうと、ラベリング専用のアプリのようなもので、このアプリ上で、ラベリングを行います。このアプリ上で、クリックやマウス移動を通して、このバウンディングボックスを作成します。この訓練データは画像枚数では数百枚以上、対象の物体(インスタンス)のバウンディングボックスの個数では、数千以上が必要になります。また、今回は梨のみを対象としていますが、複数の種類の物体を検出したい場合や、いろいろな背景に対応させたい場合は、より多い訓練データが必要です。このデータ数に関しては、ケースバイケースだと思います。

この他にも、pythonというプログラミング言語を用いる場合の、labelImgや、roboflowというツールなどがあり、ラベリングのために利用可能です。ラベリングのためのツールは、多くの種類が存在するため、それぞれ使いやすいものを選択すると良いと思います。

github.com

docs.roboflow.com

3.2. 物体検出の学習を行う

ラベリングが終了すると、物体検出のための学習を行います。物体検出のためには、深層学習と呼ばれる技術を用います。今回は、この深層学習の中でも、物体検出のための技術を用います。物体検出を行うための手法(ネットワーク)は複数知られており、物体検出において強力であると知られているネットワークを参考に開発を行っていきます。有名なネットワークとしては、YOLO (You Only Look Onceの略)やSSD (Single Shot multi-box Detector)と呼ばれるものがあります。これらを利用し、さらにそのネットワークの中身を適宜カスタマイズしながら学習を行っていきます。

 また、以下の図を見てください。以下の図は、ラベリングしたデータを訓練・検証・テストデータに分割したときのイメージを示しています。ちょうど、私たちが勉強を行うときのように、訓練(自学自習)のデータ、検証(自学自習の時の定着度のチェック)のデータ、テスト(試験)のデータに分けます。訓練とテストは別のデータです。また、訓練のときには、その訓練がどれほどうまく行っているかわからない(どれくらいその試験範囲が理解できるかわからない)ので、検証データを用いてチェックします。この検証データにてチェックしたときの結果が微妙であれば、さらに訓練するときの条件を見直したり、訓練データを増やして学習の改善を図ります。そして、テストデータにて、最終的な性能の評価をします。テストデータの性能の評価については、平均適合率という指標がよく用いられます。これは、0から1の値をとり、1に近いほど、望ましいです。この平均適合率の詳細については以下の記事などをご覧ください。

kentapt.hatenablog.com

3.3. 物体検出を行う

3.2で、よい物体検出のためのネットワークを構築できた場合、次は、対象の動画に対して、物体検出を行っていきます。以下に、2.3で示したものを再掲いたします。見た目では、うまくできているように見えます。この検出の結果について詳しく見ていきます。

以下の図を見てください。検出の結果の例を示しています。画像の上部の赤丸で囲われている部分は、2つの梨が重なって見えています。さらに、左側の梨は、葉に一部が隠されていることがわかります。このようなケースでもうまく検出できていることがわかります。この画像は背景が葉の緑で、対象の梨も緑色であるため、人間の目でも見にくいですね。このような場合でも検出ができていて、他のシーンでも同様の手法を用いて展開できるかもしれません。

3.4. 物体追跡を行う

最後のステップとして、物体のカウンティングを行います。3.3ではうまく検出ができてるように見えますが、少なからずミスも存在します。以下の動画を見てください。途中で、逆光のため、明るさが急激に変化しています。それにより、途中で物体の検出に失敗しています。この結果をもとにそのまま追跡を行おうとすると、再び検出した梨は新たな個体と判断され、同一の梨を2度カウンティングすることになります。

特に農業分野において、画像(動画)撮影をする際は、周辺の光環境などが急激に、かつ不規則に変化することも少なくありません。そのため、このような状況にも対応できる必要があります。そこで、今回はカルマンフィルタと呼ばれる手法を用いて、そのような外乱の下でも対応できる方法を考えます。

 以下の動画を見てください。ここでは、動くボールを検出し、追跡しています。黒色の床の上を物体が移動していて、その追跡も行っています。しかし、一度、その物体はダンボールで隠れてしまいます。しかし、カルマンフィルタを用いて追跡を行うことで、ダンボールの下の物体も追跡できていることがわかります。ここでは、これまでの動きの履歴をもとに、次の位置を予測し、その情報をもとに、数フレーム程度であれば、物体が隠れてしまっていても、位置を予測しながら追跡を続けることができます。

なお、こちらの動画作成においては、以下のMATLABのドキュメントを参照いたしました。

jp.mathworks.com

この技術を今回の梨の例に適用します。その結果が以下の動画になります。さきほどの逆光で追跡に失敗してる動画を思い出してください。動画の途中で検出に失敗していました。しかし、今回は、カルマンフィルタを用いており、黄色のバウンディングボックスで示される梨をうまく追跡できていることがわかります。この例では、テストした動画に含まれる234個の梨のうち、226個を正しくカウンティングすることができました。少数の検出漏れやダブルカウントがあり、最終的に231個であると予測しました。このように、非常に高精度に動画に含まれる梨をカウンティングすることができました。

4. まとめ

 この記事では、物体を検出し、個数を数える(カウンティング)方法について、紹介しました。冒頭で述べた通り、収穫量の推定や、生育状況の把握に応用できると考えられます。また、バウンディングボックス内の情報(例:明るさや色味など)を用いることで、その果実の熟度や、収穫までの期間を予測できる可能性があります。ベルトコンベア上の農作物に適用することで、出荷できないものの検出に応用できるかもしれません。今後も本手法の利用できる課題を探し、広い分野にて貢献したいと考えています。

 ここまで、読み進めていただき、ありがとうございました。この内容について、質問やコメント、また、お仕事の相談などございましたら、お気軽にご連絡ください。株式会社CULTA、または、この記事の筆者まで直接ご連絡ください。

メンバーを募集しています

CULTAでは、現在メンバーを募集しています!

今回の記事の内容のようなさまざまな植物の測定自動化技術を開発し、主に育種(品種改良)の分野に応用しています。ご興味のある方はぜひお気軽にご連絡ください。「話を聞いてみたい」程度でも構いません。

詳しくは、以下のページをご覧ください。

www.notion.so

共同研究先の研究室ホームページはこちらです。

東京大学大学院農学生命科学研究科 生物・環境工学専攻 生物環境情報工学研究室 park.itc.u-tokyo.ac.jp