種カウントシステム — 均一性指標 v3(校正済スケール+寄り減点)/2026-09-24 版
トレーに播いた種が「どれだけムラなく配置されているか」を0〜100の1つの数値で表します。
撮影した写真から検出された全粒の座標だけを使って計算するため、粒数のカウントと同時に自動で求められます。
種カウントアプリでは、撮影するとすぐに「検出粒数」の隣に均一性スコアとして表示され、保存・書き出しデータにも記録されます。
「均一」には実は2つの意味があり、片方だけでは不十分です。本スコアは両方を測って合成します。
| S_local(間隔の規則性) | S_cover(面のカバー) | |
|---|---|---|
| 何を見る | 粒どうしの間隔が揃っているか (ダブり・団子の検出) | トレー全面に行き渡っているか (空きパッチ・偏りの検出) |
| 計算法 | Clark–Evans 最近接距離指数 R (各粒から最も近い粒までの距離の平均を、同密度ランダム配置の期待値と比較。境界補正つき) | 推定領域を8×8マスに区切り、マスごとの粒数のバラつき(変動係数)を測定 |
| 高得点の条件 | どの粒も等間隔(R→2.149) | どのマスもほぼ同じ粒数 |
合成は幾何平均です:
raw = 100 × √( S_local × S_cover )
幾何平均にする理由:どちらか一方でも悪ければ総合点が大きく下がる性質があるためです。 「面は埋まっているが団子だらけ」「等間隔だが半面が空き」のどちらも高得点にはなれません。
| 配置の例 | S_local | S_cover | 総合 |
|---|---|---|---|
| 全面に等間隔(理想) | 高 | 高 | 高 |
| 半面だけに等間隔 | 高 | 低 | 低 |
| 全面にあるが団子だらけ | 低 | 高 | 低 |
| ランダム散布 | 中 | 中 | 中(=50点) |
上の2つだけでは、トレー全体が片側や隅に寄っている状態をほとんど捉えられませんでした。 面のカバーは8×8の細かいマス(1マス約8粒)で数えるため、全体の寄りが粒数の自然なゆらぎに埋もれてしまうからです (例:右下に大きく寄った千葉 0426_093050 が 67.4点、均一な千葉 0204_085249 が 68.2点)。 そこで、全体の寄りを別に測って減点します。
寄り% = 推定範囲の中心から全粒の重心までのずれ(範囲の半幅に対する%) 許容値 = 偶然でも起こる寄りの平均 × 2(約500粒で 6.5%。粒数が少ないほど大きい) 減点 = 3点 × (寄り% − 許容値) ※寄り%が許容値以下なら減点なし スコア = (間隔 × 面カバーの校正スコア) − 減点 ※0未満にはしない
上段は寄りが大きい4枚(10〜22点の減点)、下段は寄りが小さい4枚(減点なし)。
現場写真ではトレーの外側(縁や机)が写り込みます。画像全体を基準にすると、写り込みが多い写真ほど 「外周が空いている」と誤判定され、スコアが不当に下がります。そこで粒の座標そのものからトレー内側の領域を自動推定します (粒点群の最小外接回転矩形 + 粒半径ぶんの余白)。アプリでも推論後の写真に、この範囲が赤い点線で表示されます。実写真での推定例(赤枠):
この補正の導入前は、写り込みの多い北海道の写真が千葉より約10点低く出ていました(測定バイアス)。 導入後は両産地がほぼ同じ帯域になり、公平な比較が可能になりました。
粒数が少ないほど、ランダムでもマスごとの粒数はバラつきます。生の変動係数を「同じ粒数のランダム散布で期待されるバラつき」で 割ることで、100粒のトレーと500粒のトレーを同じ物差しで比較できるようにしています。
rawスコアには技術的な上限があります。400粒を完璧な六方格子に並べたシミュレーションでも、 8×8マス集計の離散化誤差(マス境界と格子周期のズレ)により raw は79.1点までしか届きません。
そこで、シミュレーションで実測した2つのアンカー(ランダム散布 raw=46.8、六方格子 raw=79.1)を使い、 表示用スコアを二段階の線形変換で校正します:
score = 50 × raw ÷ 46.8 (raw ≤ 46.8 のとき: 0〜50) score = 50 + 50 × (raw − 46.8) ÷ (79.1 − 46.8) (raw > 46.8 のとき: 50〜100)
これにより 0=完全凝集 / 50=ランダム / 100=物理的理想 という直感的な目盛りになり、マイナス値も発生しません。 参考として正方格子(20×20)は約90点に写像されます。
| 産地 | 平均 | 範囲 | 寄り減点あり |
|---|---|---|---|
| 千葉(31枚) | 69.1 | 51.4 〜 77.3 | 7枚 |
| 北海道(38枚) | 66.4 | 36.6 〜 74.5 | 10枚 |
寄り減点のないトレー(52枚)はすべて 64点以上で、ランダムよりはっきり均一です。寄りが目立つ17枚は減点され、特に寄りの大きいものは50点前後以下に下がります(最低 36.6点)。
点線は寄り減点前(v2)の分布で、v2 ではほぼ全てのトレーが 59〜77点の狭い範囲に収まり、寄りの有無を見分けられませんでした。
| スコア | 評価 | 状態の目安 |
|---|---|---|
| 75〜 | ◎ 非常に良い | 実データ上位。目視でもムラを感じない |
| 65〜75 | ○ 良い | 標準的な仕上がり |
| 55〜65 | △ ややムラ | 空きパッチ・粒だまり・軽い寄りが目につく |
| 〜55 | ✕ 要改善 | 寄りやかたまりが目立つ。矢印の反対側へ広げる等、播き方の見直しを |
※ 閾値は現時点の69枚に基づく暫定値。運用データが増えたら見直してください。
操作は不要です。撮影・画像選択のたびに端末内で自動計算されます(オフライン可)。結果は記録一覧の「均一性」列、summary.csv の uniformity・yori_pct・yori_dir 列、measurements.json の uniformity 項目(score / base / yori / yoriDir / penalty / raw / R / cvRel / sLocal / sCover)に入ります。
conda activate seedcount python uniformity_score.py --json_dirs photos/raw photos/hokkaido2 --out output_uniformity
入力はAnyLabeling形式の点JSON(label=seed)。出力は uniformity_v3.csv
(画像ごとの n / R / CV_rel / S_local / S_cover / raw / score_v2 / yori / yori_dir / yori_tol / penalty / score)。
実装は uniformity_score.py(約170行、依存は numpy / scipy / opencv のみ)。
アプリ側の実装 uniformity.js は同じ定義・同じアンカーで、Python版と一致することを確認済みです(69枚で差0.3点未満)。
種カウントシステム 均一性指標 v3 / v2定義 2026-08-10・寄り減点追加 2026-09-24 / アンカー: RAW_RANDOM=46.8, RAW_IDEAL=79.1(400粒シミュレーション実測)/ 寄り減点: 3点/1%、許容値=偶然の寄りの平均×2