汎用的な認識モデル(CLIP)を使ってダメージトマトを選別してみました
トクイテンの森です。
トクイテンでは、今週で今作のトマト収穫に区切りをつけて、一旦栽培をお休みします。一ヶ月ほど圃場を休ませて新しいトマトの苗を植えたのちに、11月頃に収穫・販売を再開する予定です。今週末はギリギリ買えるスーパーなどもあるかと思いますので、今作最後のトマトをお楽しみください。
今回の記事はトマトの品質を識別するシステムを試しに作ってみたという記事です。学習を必要とせずにテキストにより指示を出すだけで認識ができてしまうというCLIPモデルを取り上げます。
トマトの選果は大変!
トマトは収穫しただけでは出荷ができません。収穫したトマトは大きさや形の違いや傷のあるなしを判別する「選果」や、選果したトマトを袋詰めする「パッケージング」などの作業を経て、スーパーなどへ出荷されます。この作業は非常に大変で、慣れないと作業が遅くなり、出荷の時刻に間に合わないといったことが起こってしまいます。出荷までの作業の自動化はすでに色々な製品が出ていますが、画像認識で傷を見分けたりするシステムは精度や識別速度に課題があるようです。
上記のような課題感は持っていたのですが、傷のあるトマトを識別しようと思った時にトマト画像を学習する手間が大変だなと思っていました。そんな中、最近参加した第2回Genetavei AI勉強会という講演会での東大松尾研研究員の松嶋さんの講演で知ったCLIPモデルが使えるかもしれないと思い、試してみました。
CLIPについては以下の松嶋さんやジコログさんの記事を参考にしました。
CLIP:言語と画像のマルチモーダル基盤モデル(松嶋達也)
汎用画像分類モデルのOpenAI CLIPのインストール【Python】(ジコログ)
やってみたこと
CLIPには認識対象を自然言語のテキストで表現することができるため、以下のような2種類のテキストを用意して、識別できるかを試してみました。最初は1だけでやってみたのですが、"tomato"だけだと範囲が広すぎるかなと考えて"smooth tomato"と範囲を絞ることで性能が向上するのではないかと考えました。
"damaged tomato"か"tomato"の分類
"damaged tomato"か"smooth tomato"の分類
結果
ダメージトマトの識別結果
以下の数字は、上のダメージトマトの画像を入力した際の、それぞれのテキストへの確信度を表しています。
damaged tomato → 0.75337666
tomato → 0.24662334
"damaged tomato"と"tomato"のテキストのペアで"damaged tomato"の方が数値が高く、しっかり識別できているようです。
damaged tomato → 0.6591695
smooth tomato → 0.34083048
しかし、思惑に反してsmoothを追加した方が"damage tomato"の確信度が減ってしまっています。意外と"tomato"だけの方が目的に近い識別結果となるようです。
合格トマトの識別結果
次に合格したトマトの画像で識別をしてみました。
damaged tomato → 0.04886664
tomato → 0.9511333
合格トマトでは、"tomato"の確信度が0.95となり非常に確信度高く識別されています。
damaged tomato → 0.064535245
smooth tomato → 0.93546474
smoothを追加した場合では、ダメージトマトの識別と同様に少しですが確信度が下がってしまっています。
他の画像でも試しましたが、傾向は同様になっていました。
まとめ
CLIPを使ったダメージトマトの識別を試してみました。一つのトレーニングデータなしにトマトにダメージがあるかどうかを識別できたのは衝撃的でした。細かい特徴を捉える仕組みが結果として入っているのだと考えられますが、こんなマニアックな識別ができてしまうのは正直考えてなかったです。
今後このモデルを使うかどうかは、識別精度や識別速度などを考慮して総合的に判断することになりますが、少なくとも軽量モデルのためのトレーニングデータ作成の自動化には使えそうです。
今後もトマト栽培から出荷までの自動化に精力的に取り組んでいきます。