害虫検出AIが別の作物・拠点で精度を落とす理由:ドメインシフトの評価と追加学習の進め方

産業インサイト・課題解決//

害虫モニタリングに画像認識AIを導入し、ある施設で十分に使える精度を確認できたため、別の作物や別の拠点へ横展開したところ、人の目視と数字が合わなくなった。PoC(Proof of Concept:概念実証)から横展開へ進む段階では、こうした状況に直面する場合があります。

このとき最初に浮かぶ対応は、新しい現場の画像を集めて学習し直すことかもしれません。追加学習は有力な選択肢です。ただし、精度低下の原因が光なのか、トラップの色なのか、写っている虫の構成なのかが分からないまま学習データを足すと、効果を判断できないばかりか、元の現場で出ていた精度を損なう可能性もあります。

最初に決めたいのは、「どの手法で追加学習するか」ではなく、「どの条件で、何を基準に精度を測るか」です。評価の設計が先にあって初めて、追加学習が必要な範囲も見えてきます。

本記事では、トマト施設で作成した害虫検出・カウントモデルをイチゴ施設に適用する想定ケースを通して、ドメインシフトを背景・光・個体差と種構成・作型の4要因に分けて整理し、評価設計と追加学習の進め方を解説します。なお、AIは判断支援の道具であり、人による確認や現場の知見との併用を前提としています。

ドメインシフトとは:精度はモデルだけでなくデータの性質にも左右される

ドメインシフト(Domain shift:学習時と運用時でデータの性質が変わること)は、機械学習で広く知られた問題です。モデルは学習に使った画像の性質を前提に特徴を覚えるため、運用時の画像の性質が変わると、同じモデルでも精度が変わる場合があります(Moreno-Torres et al., 2012)。

ここで区別したいのは、「モデルの出来が悪い」ことと「データの性質が変わった」ことは別の問題だという点です。前者であれば元の現場でも精度が出ないはずですが、後者では元の現場では良好でも、別の現場でだけ崩れます。また、画像の見え方が変わる場合と、正解の付け方(アノテーション基準)が変わる場合も別であり、混同すると対策を誤りやすくなります。学習元と適用先の違いが大きいほど、学習元での性能が適用先に引き継がれにくいことは、理論面でも議論されています(Ben-David et al., 2010)。

ただし、これは「別の現場では使えない」という意味ではありません。違いの種類と大きさを測り、許容できる範囲かどうかを判断することが、横展開の出発点になります。

想定ケース:トマト施設のモデルをイチゴ施設へ適用する

以下は説明用の想定ケースであり、特定の顧客や地域、実際の数値に基づくものではありません。

トマト施設で、黄色粘着板に捕獲されたコナジラミ類を主な対象として、害虫の検出とカウントを行うモデルを作成し、このトマト施設では運用に使える精度が確認できたとします。次に、同じモデルをイチゴ施設へ適用しました。イチゴ施設では、アザミウマ類の把握のために青色粘着板も併用され、冬季は日照が弱く、電照が使われる時期もあります。結果として、目視で数えた個体数とAIの推定数が合わない画像が目立つようになりました。

ドメインシフトの概念図(想定ケース)学習元と適用先で、画像の性質が変わりうる4つの観点
背景
学習元:トマト施設黄色粘着板が中心で、背景の色や写り込みの傾向が一定。
適用先:イチゴ施設青色粘着板を併用する場合がある。葉や資材の写り込み、汚れ・ほこりの傾向が異なる。
光
学習元:トマト施設学習データに含まれた照明条件の範囲内で撮影されている。
適用先:イチゴ施設冬季の低照度、遮光、電照など、学習時に少なかった条件が加わる。撮影機器が異なる場合もある。
個体差・種構成
学習元:トマト施設主な対象はコナジラミ類。
適用先:イチゴ施設主要害虫が異なる場合がある。齢期・サイズの違い、天敵や非対象昆虫の捕獲が起こりうる。
作型
学習元:トマト施設発生ピークや捕獲密度が、学習時の範囲に収まっている。
適用先:イチゴ施設発生時期のずれや、高密度時の個体の重なりが生じうる。

本図は概念図であり、実際の画像分布や精度の大きさを示すものではありません。

この図が示すのは、精度低下の原因が1つとは限らず、複数の要因が同時に変わりうるという点です。原因を分けずに「イチゴでは精度が低い」とだけ捉えると、対策の方向を決められません。なお、この例から「トマトのモデルはイチゴに使えない」と結論づけることはできません。

精度低下の原因を4要因に分けて考える

原因は、背景・光・個体差と種構成・作型の4要因に分けると整理しやすくなります。まず全体像を表にまとめます。

要因起こりやすい変化精度への現れ方(例)最初の確認
背景トラップの色、葉・資材の写り込み、汚れ・ほこり汚れや影を虫と誤る。虫が背景に溶け込む誤検出画像を目視で分類する
光季節・時間帯、遮光、電照、撮影機器低照度での見逃し。反射や色味の変化による誤検出照明条件別の層別評価、輝度・色の分布比較
個体差・種構成主要害虫、齢期・サイズ、天敵・非対象昆虫種の取り違え、小型個体の見逃し、天敵の誤検出種別の混同の確認、対象種・対象外の定義の確認
作型発生ピークの時期、捕獲密度、個体の重なり高密度時の数え落としなどのカウント誤差密度帯別の層別評価

背景:トラップの色、写り込み、汚れ

黄色粘着板はコナジラミ類・アブラムシ類・ハモグリバエ類などに、青色粘着板はアザミウマ類によく用いられます。トラップの色が変わると、虫と背景のコントラストが変わるため、学習元で覚えた見え方が通用しにくくなる場合があります。また、葉や資材の写り込み、汚れやほこりが、虫に似た影として誤検出される場合もあります。

光:季節、時間帯、遮光・電照、撮影機器

冬季の低照度では、小型の虫が背景に埋もれて見逃されやすくなる可能性があります。一方、電照下では色味や反射が変わり、粘着面の凹凸や汚れを虫と取り違える場合があります。撮影機器が変われば、同じ条件でも色の再現や解像感が異なります。後述する疑似データでは、低照度は見逃し、電照下は誤検出として現れる例を置いています。

個体差・種構成:主要害虫、サイズ、天敵・非対象昆虫

主要な害虫が変われば、検出すべき形状やサイズも変わります。同じ種でも齢期やサイズに幅があり、学習元に少ない大きさの個体は見逃されやすくなります。また、天敵や対象外の昆虫がトラップに捕獲されると、害虫として誤検出される場合があります。なお、ハダニ類のように粘着トラップで捕獲されにくい害虫は、トラップ画像を使うAIの対象外になりやすく、「AIの出力がゼロ」であることと「発生していない」ことは別です。

作型:栽培時期、発生ピーク、捕獲密度

作型(栽培の時期や方法の組み合わせ)が違うと、発生ピークの時期や捕獲密度が変わります。高密度になると個体が重なり、数え落としが生じやすくなります。学習元に高密度の画像が少ない場合、この条件で誤差が大きくなる可能性があります。

評価設計を先に作る:適用先のテストデータと層別評価

追加学習の前に、まず現在のモデルが適用先でどのように間違えているかを測ります。基本となる観点は次の5つです。

  1. 適用先のテストデータを学習用と分けて用意する。同じトラップの連続撮影画像を学習側とテスト側に振り分けると、似た画像が両方に入り、精度を実際より高く見積もる可能性があります。撮影日やトラップ単位で分けます。
  2. 照明・時期・トラップ色・密度帯ごとに層別して評価する。全体平均だけでは、特定条件の崩れが見えなくなります。
  3. 見逃しと誤検出を分けて見る。いるのに数えない誤りと、いないのに数える誤りは、原因も対策も異なります。
  4. 種別の取り違えを確認する。たとえば、コナジラミ類をアザミウマ類として数えていないかを確認します。
  5. 防除判断に使う閾値付近の誤差を重視する。全体の平均誤差が小さくても、判断が切り替わる付近でずれていれば、意思決定に影響します。

すぐ試せる確認作業として、適用先の画像から、照明とトラップ色の組み合わせごとに数枚ずつ選び、目視で数えた個体数とAIの推定数を並べてみてください。完璧なテストデータを揃えてから始める必要はなく、小さい範囲で崩れ方の傾向をつかむことが、次の判断材料になります。ただし、これは全体の精度指標が不要という意味ではありません。層別の結果と全体の指標は併用します。

評価を数字で確認する:コード例

以下は評価の考え方を示す汎用的なサンプルであり、特定の検出モデルの実装ではありません。データはすべて説明用の架空値です。

全体平均に隠れる、条件別の崩れ

画像ごとの正解個体数とAI推定数から、ドメイン別・条件別に誤差を集計します。

import pandas as pd

# 以下はすべて説明用の架空データです。
records = [
    # image_id, domain, trap_color, lighting, season, true_count, pred_count
    ("T-001", "トマト", "黄", "晴天日中", "春", 24, 23),
    ("T-002", "トマト", "黄", "曇天", "春", 18, 17),
    ("S-001", "イチゴ", "青", "冬季低照度", "冬", 12, 5),
    ("S-002", "イチゴ", "青", "電照下", "冬", 9, 14),
    ("S-003", "イチゴ", "黄", "晴天日中", "春", 15, 13),
]
df = pd.DataFrame(
    records,
    columns=["image_id", "domain", "trap_color", "lighting",
             "season", "true_count", "pred_count"],
)

df["error"] = df["pred_count"] - df["true_count"]   # 符号付き誤差(推定 - 正解)
df["abs_error"] = df["error"].abs()
df["under"] = (-df["error"]).clip(lower=0)          # 少なく数えた個体数
df["over"] = df["error"].clip(lower=0)              # 多く数えた個体数


def summarize(frame, keys):
    out = frame.groupby(keys).agg(
        n_images=("image_id", "count"),
        mean_error=("error", "mean"),
        mae=("abs_error", "mean"),                  # 平均絶対誤差
        true_sum=("true_count", "sum"),
        under_sum=("under", "sum"),
        over_sum=("over", "sum"),
    )
    out["under_rate"] = out["under_sum"] / out["true_sum"]   # 過少計数率
    out["over_rate"] = out["over_sum"] / out["true_sum"]     # 過大計数率
    return out[["n_images", "mean_error", "mae", "under_rate", "over_rate"]]


print(summarize(df, ["domain"]))
print(summarize(df, ["domain", "trap_color", "lighting"]))
Python

この疑似データをドメイン別に集計すると、次のようになります。画像数が少ないため統計的な結論ではなく、見方の例です。

ドメイン画像数平均誤差(推定−正解)平均絶対誤差過少計数率過大計数率
トマト2−1.01.04.8%0.0%
イチゴ3−1.34.725.0%13.9%

平均誤差だけを見ると両者は近い値ですが、イチゴでは少なく数えた画像と多く数えた画像が相殺されており、平均絶対誤差や過少・過大計数率には明確な差が出ます。条件別に見ると、冬季低照度(正解12に対して推定5)では過少、電照下(正解9に対して推定14)では過大、晴天日中の黄色粘着板(正解15に対して推定13)では小さな差、というように、崩れ方が条件ごとに異なります。このように、全体平均では差が小さく見えても、特定条件で大きく崩れる場合があります。

なお、過少計数率・過大計数率は画像ごとの個数差から計算した指標で、検出位置の対応付けは行っていません。そのため、厳密な見逃しと誤検出の評価ではありません。物体検出として両者を分ける場合は、検出結果と正解の位置を対応付けて集計します。

画像の輝度・色のずれを、原因切り分けの手がかりにする

学習元と適用先の画像群で、平均輝度やトラップ領域の色相を比べると、光や背景の要因がどの程度効いていそうかの手がかりが得られます。

import pandas as pd

# すべて説明用の架空値です(画像ごとの平均輝度と、トラップ領域の平均色相[度])。
src = pd.DataFrame({                      # 学習元(トマト施設)
    "mean_brightness": [148, 152, 139, 160, 145],
    "trap_hue_deg":    [52, 54, 51, 55, 53],
})
tgt = pd.DataFrame({                      # 適用先(イチゴ施設)
    "mean_brightness": [96, 101, 88, 142, 120],
    "trap_hue_deg":    [215, 212, 210, 53, 50],
})


def shift_table(src, tgt):
    rows = []
    for col in src.columns:
        pooled = ((src[col].var(ddof=1) + tgt[col].var(ddof=1)) / 2) ** 0.5
        diff = (tgt[col].mean() - src[col].mean()) / pooled if pooled > 0 else float("nan")
        rows.append({
            "feature": col,
            "src_mean": src[col].mean(),
            "tgt_mean": tgt[col].mean(),
            "std_diff": diff,             # 平均の差をばらつきで割った値
        })
    return pd.DataFrame(rows)


print(shift_table(src, tgt))
Python

標準化差(平均の差を、ばらつきで割った値)が大きい特徴は、学習元と適用先で見え方が異なることを示唆します。ただし、数値の大小が必ず精度低下に直結するわけではありません。差が大きくても精度が保たれる場合もあれば、差が小さくても別の理由で崩れる場合もあります。誤差の型(見逃し・誤検出)や目視での確認と合わせ、原因の切り分けの手がかりとして使ってください。また、色相は角度のような円環の量であり、実務では扱いに注意が必要です。このコードは考え方の説明用です。

追加学習の前に:撮影条件の標準化と対象種定義の見直し

追加学習は、データの準備、ラベル付け、再評価に手間がかかります。その前に、学習なしで改善できる部分がないかを確認します。

  • 撮影条件の標準化:カメラの高さ・距離・角度、照明補助の有無、露出やホワイトバランスの設定、トラップの交換日を揃える
  • 対象種定義の見直し:何を数えるのか、天敵や非対象昆虫をどう扱うのか、サイズの下限や重なりの数え方を文書化する

ただし、これは撮影条件を揃えれば追加学習が不要になるという意味ではありません。「撮影を揃える」ことは現場の運用に手を入れる対策、「モデルを学習し直す」ことはモデル側に手を入れる対策で、両者は別です。現場の制約で撮影条件を変えられない場合は、その条件を前提に評価し、必要に応じて追加学習を検討します。

追加学習の進め方

追加学習には、既存モデルの重みを引き継いで新しいデータで調整するファインチューニング(Fine-tuning)や、ある領域で得た知識を別の領域に活用する転移学習(Transfer learning)があります(Pan and Yang, 2010)。ここでは手法の選択ではなく、進め方の原則を整理します。

  • 追加データは条件の偏りを避ける。冬季低照度の画像だけを足すと、その条件には対応できても、他の条件での挙動が変わる可能性があります。
  • 迷いやすい画像を優先する。誤差が大きかった画像、AIの判定が不安定な画像、担当者でも判断が分かれる画像が候補です。データ拡張(Data augmentation:明るさや向きを変えて学習データを増やす方法)は補助になりえますが、実画像の代わりにはなりません。
  • アノテーション基準を学習元と揃える。小さな個体、重なり、汚れの扱いが学習元と違うと、ドメインシフトとラベルの不一致を区別できなくなります。
  • 追加学習後は、学習元ドメインの精度劣化も確認する。新しいデータへの適応によって以前の性能が下がる現象は、破滅的忘却(Catastrophic forgetting)と呼ばれます(Kirkpatrick et al., 2017)。トマト施設でも使い続けるなら、両方のテストデータで再評価します。
  • 必要なデータ量は断定できない。条件の数、ばらつき、許容できる誤差によって変わります。小さく始め、層別の指標がどう動くかを見ながら増やします。

次のコードは、追加学習の前後の指標を、学習元テストと適用先テストの両方で並べる集計の例です。許容幅は事前にチームで決めた値を渡す想定で、ここでは具体的な値を示しません。

import pandas as pd


def compare_phases(results: pd.DataFrame, tolerance: float) -> pd.DataFrame:
    """追加学習の前後を、評価セットごとに比較する。

    results の列:
      eval_set   : "source"(学習元テスト)または "target"(適用先テスト)
      phase      : "before" または "after"
      true_count : 正解個体数
      pred_count : AI推定数
    tolerance    : 悪化とみなす平均絶対誤差の増加幅(事前に決めた値を渡す)
    """
    r = results.assign(abs_error=(results["pred_count"] - results["true_count"]).abs())
    table = r.pivot_table(
        index="eval_set", columns="phase", values="abs_error", aggfunc="mean"
    )[["before", "after"]]
    table["change"] = table["after"] - table["before"]
    table["degraded"] = table["change"] > tolerance   # 許容幅を超えて悪化したか
    return table
Python

作り直しか、追加学習か:判断軸

対応は、原因の切り分け結果によって変わります。次の表は判断の目安です。

判断軸撮影条件の標準化を優先追加学習が候補作り直しが候補
精度低下の現れ方撮影のばらつき(光・距離・色)に連動している特定の条件に偏って低下し、他の条件は保たれている多くの条件で全般的に低下している
対象種の定義学習元と同じ一部の追加・調整で足りる主な対象が別の種群、または検出の単位が異なる
撮影手順の変更現場で変更できる変更が難しい運用要件そのものが変わる
追加データとラベル少量の確認で足りる条件を網羅した画像とラベルを用意できる新規に十分な収集とラベル付けができる
学習元ドメインの扱い影響なし維持の確認が必要別モデルとして運用してよい

この表は一律の基準ではなく、複数の対応を組み合わせる場合もあります。また、追加学習も作り直しも行わず、当面は対象条件を限定して人による確認と併用するという判断も、条件付きで進める選択肢の一つです。

評価から運用監視までの流れ

評価から運用監視までの流れ
  1. 評価適用先のテストデータで条件別に評価する
    学習用と分け、照明・時期・トラップ色・密度帯で層別して見る。
  2. 評価原因を切り分ける
    見逃し・誤検出・種の取り違えの型から、4要因のどれに寄るかを見る。
  3. 改善撮影条件と対象種定義を見直す
    撮影手順の標準化、対象種・対象外の定義を整える。
  4. 改善追加データを収集する
    条件の偏りを避け、迷いやすい画像を優先する。アノテーション基準を学習元と揃える。
  5. 改善必要な部分に限って追加学習する
    原因の切り分け結果に対応する範囲にとどめる。
  6. 再評価両ドメインで再評価する
    適用先の改善と、学習元の劣化の有無の両方を確認する。
  7. 運用運用監視を続ける
    定期的な精度確認、ドリフト監視、人による確認を組み込む。条件が変われば手順1に戻る。

本図は進め方の概念図です。再評価の結果によっては、前の工程に戻って見直します。

運用段階では、次の4点を組み込みます。

  • 定期的な精度確認:一定期間ごとに少数の画像を抜き取り、目視と照合する
  • ドリフト監視:ドリフト(Drift:入力データの性質が時間とともに変わること)を、輝度分布や推定数の推移から把握する
  • 人による確認:閾値付近の画像や、判定が不安定な画像は担当者が確認する
  • 手順化:拠点や作物を増やすときに、同じ評価・切り分けの手順を使えるようにする

この考え方は、施設園芸に限りません。食品工場や倉庫などの防虫管理でも、拠点やトラップの設置環境、照明、捕獲される虫の構成が変われば、同じ種類の問題が起こりえます。

適用範囲と限界:AIは判断支援の道具

  • トラップ画像は捕獲された虫の情報であり、施設内の発生量そのものではありません。
  • ハダニ類など、粘着トラップで捕獲されにくい害虫は、別の観察方法との併用が必要です。
  • 追加学習で精度が回復するとは限りません。回復しない場合は、撮影条件の見直し、対象条件の限定、人による確認との併用を検討します。
  • 防除の判断は、AIの出力だけでなく、作物の状態や現場の知見、防除体系と合わせて行います。

本記事の内容は評価の考え方の整理であり、特定の検出モデルや評価閾値を推奨するものではありません。

横展開前チェックリスト

別の作物・拠点へ展開する前に、社内で確認できる10項目です。

No.確認項目確認する観点
1適用先のテストデータを用意したか学習用と分離されているか
2分割の単位は適切か撮影日・トラップ単位で分けているか
3層別評価を行ったか照明・時期・トラップ色・密度帯
4見逃しと誤検出を分けて見たか誤りの型ごとに原因を想定できるか
5種別の取り違えを確認したか対象種同士の混同、天敵・非対象昆虫の誤検出
6閾値付近の誤差を確認したか防除判断が切り替わる付近のずれ
7対象種と対象外の定義を文書化したかサイズの下限、重なりの数え方
8アノテーション基準を学習元と揃えたか基準の差がドメインシフトに混ざっていないか
9両ドメインでの再評価を計画したか学習元の精度劣化の確認方法
10運用の仕組みを決めたか定期確認、ドリフト監視、人による確認

まとめ:次に確認したいこと

害虫検出AIの精度は、モデル単体ではなく、モデルと撮影条件・対象種・作型の組み合わせで決まります。別の作物や拠点で精度が落ちたときは、いきなり学習し直すのではなく、評価設計を先に作り、原因を切り分けたうえで、必要な部分だけ追加学習するという順序が、実務では扱いやすいと考えられます。

次に確認することは、次の4点です。

  • 適用先のテストデータを分けて用意できているか
  • 条件別に、見逃しと誤検出を分けて評価できているか
  • 撮影条件と対象種定義の見直しを、追加学習より先に検討したか
  • 追加学習後に、両ドメインで再評価する計画があるか

横展開前の評価設計・検証計画について

害虫モニタリングAIは、作物・施設・時期が変われば再評価が前提となる仕組みです。評価の軸を決め、必要な範囲だけ追加し、運用で見守るという進め方は、施設園芸に限らず、食品工場や倉庫などの防虫管理でも、拠点やトラップの設置環境が変われば同様に必要になる場合があります。

SCI総合研究所では、G-SENSIA(施設衛生の意思決定支援コンサルティング)を通じて、害虫モニタリングデータを防除・衛生管理の判断に使える形に整理する支援、別拠点・別作物へ展開する前の検証計画づくり、実証実験の設計に関するご相談をお受けしています。技術面の初期的な整理はKAMUSHIRUBE(技術・DX相談)が窓口です。AIモデルの評価・運用に関する社内研修については、調査・研修講師でもご相談いただけます。まずは現在の課題やデータの状況をお聞かせください。

参考文献