YOLOとSAM3: スイートコーンの株数と葉面積、葉色を画像から推定

スイートコーンの株数と葉面積、葉色を画像から推定

スイートコーンの生育調査で株数と葉面積を目視カウントするのは手間がかかる。そこで物体検出・セグメンテーションモデルで自動化できないか試したところ、COCOで学習された一般的なYOLOでは「corn」というクラス自体が存在せず検出不可能だったが、オープンボキャブラリなセグメンテーションモデルSAM3をテキストプロンプト「crop」で使うことで、実用レベルの株数検出と葉面積・葉色の同時推定ができた。ただし株の重なりに起因する過検出・過少検出、複数株の一体化検出という課題も残った。

背景: なぜ株数と葉面積を画像から推定したいのか

スイートコーンの生育調査では、圃場を歩いて株数を数え、葉の大きさを目視や定規で記録することが多い。この方法は正確だが、圃場が広くなるほど時間がかかり、複数の調査地点・複数の生育ステージを追跡しようとすると調査コストが跳ね上がる。

株数と葉面積(葉の茂り具合の面積換算値)が画像から推定できれば、スマートフォンやドローンで撮影した動画・写真だけで生育過程を定量的に追跡できる。さらに葉色(緑〜黄色の傾向)も同時に取得できれば、生育ステージや窒素状態の簡易的な指標としても使える可能性がある。これが今回の検証の出発点になった。

最初に試したYOLO: COCOクラスの壁

物体検出モデルとしてまず有名なYOLO(You Only Look Once)を試した。YOLOは推論速度が非常に速く、リアルタイム検出用途でよく使われるモデルだが、事前学習済みモデルはCOCOデータセット(人物・車・動物など80クラス)で学習されている。

COCOの80クラスには当然ながら「corn」や「crop」に相当するクラスは存在しない。そのため学習済みのYOLOモデルをそのまま使っても、コーンの株を検出することはできなかった。独自クラスで検出したい場合は自前のアノテーションデータで再学習(ファインチューニング)する必要があるが、今回はまず既存モデルでどこまでできるかを検証したかったため、この時点でYOLOでの検出は断念した。

YOLOがダメだったのはモデルの性能不足ではなく、学習データにコーンのクラスが含まれていないという語彙(vocabulary)の制約による。この制約を理解しておくと、次に試すべきモデルの方向性が見えてくる。

物体検出モデルの分類: なぜSAM3を試したのか

YOLOで詰まった後、物体検出・セグメンテーションモデルを大きく2つの軸で整理し直した。

軸1: 検出できる語彙(クラス)による分類

  • クローズドセット検出(closed-set detection): 学習時に固定されたクラスしか検出できないモデル。YOLOv8などCOCOで学習された一般的な物体検出モデルはこれにあたる。推論は速いが、未知のクラス(今回でいう「コーンの株」)は検出できない。
  • オープンボキャブラリ/ゼロショット検出(open-vocabulary detection): テキストプロンプトで「検出したい対象」を都度指定できるモデル。学習時に見たことのないクラス名でも、ある程度は検出を試みる。今回試したSAM3、YOLO-World、Grounding DINOはすべてこちらに属する。

軸2: 出力形式による分類

  • バウンディングボックス検出: 対象を矩形(bbox)で囲むだけのモデル。YOLO、YOLO-World、Grounding DINOはこちら。矩形なので背景や隣接する株を巻き込みやすく、面積を正確に測るのには不向き。
  • セグメンテーション: 対象をピクセル単位のマスクで抽出するモデル。SAM(Segment Anything Model)シリーズはこちらに属する。マスクが得られるため、背景を除いた植生部分の面積や色を直接計算できる。

今回のようにコーンという未知クラスを検出しつつ、葉面積というピクセル単位の情報も欲しい場合、「オープンボキャブラリ × セグメンテーション」の組み合わせが理にかなっている。この条件に合致するのがSAM3だった。

SAM3での検出: 実用レベルの精度が出た

SAM3(Segment Anything Model 3)はCOCOのような固定クラスで学習されたモデルではなく、テキストプロンプトを与えることで任意の概念をセグメンテーションできるモデルである。今回は corn plantcrop といった短い英単語のプロンプトを使い、静止画・動画の両方で検証した。

動画は縦向き720×1280、約30fpsで撮影したものだったが、fpsが高いと余計に計算量が必要になってしまうため、約10fpsに間引きながら処理した。
fpsを下げ過ぎてしまうと追跡性能が極端に落ちてしまうので注意が必要だ。
また、今回は自前のRTX5090を使用したが、一回の処理でOut Of Memoryにならないのが大体80frameだったので、動画を分割して複数かに分けて処理した。

検出結果はこちら。
20260828_sam.png

SAM3の課題: 株の重なりによる過検出・過少検出

一方で、SAM3の検出結果をそのまま使うには課題も残った。特に目立ったのが次の2つのパターンである。

  • 株同士が重なっている箇所での検出数のブレ: 葉が絡み合っている株が隣接していると、1株を2株として過検出したり、逆に2株を1つの塊として過少検出したりするケースがあった
  • 複数株の一体化検出: 特に生育が進んで葉が密集した状態では、隣接する2〜3株分の葉がまとめて1つのセグメントとして検出されることがあった

この問題に対しては、後処理側で連結成分(マスク内で物理的に分離している塊)を検出し、全体面積に対して十分大きい場合はマスクを分割し直す処理を追加した。ただし、葉が完全に重なり合っていて輪郭上つながっている場合は連結成分でも分離できず、この場合はどうしても人間による目視確認との併用が必要になる。

SAM3は未知クラスの検出そのものは強力だが、「株の境界」という意味的な判断(隣り合う葉がどちらの株に属するか)まで正確にはできない。密植状態の圃場ではこの点を前提に運用する必要がある。

重複候補として自動的に弾かれた件数は全体から見れば少数だったが、これは面積・色・マスク形状の類似度チェックによって明らかな重複だけを検出した結果であり、境界があいまいなケースまでは拾いきれていない可能性がある点には注意したい。

比較: YOLO-WorldとGrounding DINOも試したが

SAM3以外にも、COCO以外のクラスを検出できるオープンボキャブラリ系のバウンディングボックス検出モデルとして、YOLO-WorldとGrounding DINOを試した。どちらもテキストプロンプトで任意のクラスを指定できる点はSAM3と共通しているが、実際にコーンの株を検出させてみると、SAM3ほどの精度は出なかった。

YOLO-Worldの結果はこちら。
20260828_yoloworld.png

Grouding DINOの結果はこちら。

  • 20260828_groudingdino.jpg

原因として考えられるのは、YOLO-WorldとGrounding DINOはあくまでバウンディングボックス検出モデルであり、SAM3のようにピクセル単位のマスクを持たないため、隣接する株同士の境界があいまいな場面でbboxの重なりが大きくなりやすいことである。また、SAM3はSegment Anythingシリーズとして大規模かつ多様なセグメンテーションデータで学習されているため、農作物のような自然物・不定形な形状に対する汎化性能がバウンディングボックス系モデルより高い可能性がある。

いずれにせよ、今回の「株数を数えつつ、葉の面積・色まで欲しい」という要件に対しては、セグメンテーションベースであるSAM3が最も実用に近い結果を出した。

まとめ

COCOで学習された一般的なYOLOは、学習時に存在しないクラス(コーンの株)を検出できず、今回の用途には使えなかった。一方、オープンボキャブラリなセグメンテーションモデルであるSAM3は、テキストプロンプト「crop」だけで株の検出・追跡・葉面積・葉色の推定までを実用レベルでこなせることが確認できた。実際の動画では9割前後の検出が最終的に1株としてカウントできる状態まで整理でき、面積・葉色を数値として取得できた。

ただし株が重なっている場面での過検出・過少検出、複数株の一体化検出という課題は残っており、密植状態の圃場をそのまま完全自動でカウントするにはまだ工夫の余地がある。YOLO-WorldやGrounding DINOといった他のオープンボキャブラリ検出モデルも試したが、いずれもバウンディングボックスベースであるためSAM3ほどの精度は出なかった。次のステップとしては、重なり判定のロジック強化や、生育ステージごとのプロンプトチューニングを検証していきたい。

FAQ

Q: YOLOでコーンの株を検出できなかったのはなぜですか?
A: 一般的な学習済みYOLOモデルはCOCOデータセット(人物・車・動物など80クラス)で学習されており、「corn」や「crop」に相当するクラスが含まれていないためです。独自クラスを検出するには自前データでの再学習が必要です。

Q: SAM3とYOLOの違いは何ですか?
A: YOLOはクローズドセットのバウンディングボックス検出モデルで、学習済みクラスしか検出できません。SAM3はテキストプロンプトで任意の対象を指定できるオープンボキャブラリなセグメンテーションモデルで、ピクセル単位のマスクを出力するため未知の対象でも検出しやすく、面積計算にも直接使えます。

Q: SAM3で株数をカウントする際の注意点はありますか?
A: 株同士が重なっている箇所では過検出・過少検出や、複数株が1つのセグメントとして検出されるケースがあります。後処理でマスクの連結成分を見て分割する対策は可能ですが、葉が完全に重なっている場合は自動での分離が難しく、目視確認との併用が推奨されます。

Q: YOLO-WorldやGrounding DINOはSAM3の代わりに使えますか?
A: どちらもオープンボキャブラリな検出が可能ですが、バウンディングボックス出力のみでピクセル単位のマスクは持たないため、境界があいまいな株の検出精度や葉面積計算の点でSAM3に劣る結果となりました。

Q: 葉面積や葉色はどうやって計算していますか?
A: SAM3が出力したセグメントマスク内から、HSVとExG(2G-R-B)指数を使って緑〜黄色の植生画素のみを抽出し、その画素数を面積、画素値の面積加重平均を葉色として算出しています。

Contact

仕事の依頼などのお問い合わせはこちら

新規プロジェクトのご相談、開発のご依頼、協業のご相談などがあれば、お気軽にご連絡ください。

関連するブログ

この記事に近いテーマのブログをピックアップしています。