
2026/04/24 1:27
私の携帯電話内の黄銅製プラグが交換されました。
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
この iOS アプリは、幾何学に基づく OpenCV プロセッシングとファインチューニングされた YOLOv8 モデルを組み合わせることで、NSRA パーペータートゲットのスコーリングを自動化します。主要な革新点は、標準的なモデルが仮定していた完璧なターゲットの整合性を前提としない、不完全な打撃や破損した紙を処理するためのハイブリッドアプローチです。インターネット接続なしで正確さを確保するために、システムは Apple の Vision フレームワークを使用してリングラインと弾着孔を検出し、内向き変位などの物理的歪みを経験的な乗数を用いて補正します。初期の開発段階では、Vision と UIKit 間の座標不一致に苦戦しましたが、原点の調整により解消されました。このツールは、2012 年の基礎研究(Rudzinski および Luckner)に触発され、2023 年の物体検出に関する堅牢な研究によって更新されたものの、優先事項として累積ヒートマップを通じて長期的なユーザーフィードバックを得ることによりスコーリングの一貫性を向上させることにあります。最終的には、该系统は射撃場における境界線のショットに関する紛争を解決するための自動化されたデータ駆動型の手法を提供しますが、コミュニティからの精度への懐疑主義は著者が最終的な公式測定のために依然としてブラスプラグゲージに依存している理由となっています。
本文
数ヶ月にわたって、私はエディンバラの直ぐ外にある金属製のトンネルで水曜日の夜を過ごしました。極めて奇妙な(そして同様に不快感を誘う)ジャケットを着てです。私は床に伏せ、呼吸を数えていた後、射場を歩き、天井の梁の下を低く潜りました。床には 5 メートルごとに「DUCK(身を低く)」と白く塗装され、梁の上にも「DUCK」と書かれたポスターが貼られていましたが、たまに我还是頭を打ってしまうほど、スコアリングカードをチェックする忙しさに追われていたのです。
運が悪ければ、リングラインに近い場所で発射体が着弾し、手伝いが必要になります。そんな時はグレッグスのソーセージロールの入ったトレイへ向かいます(ここ「ポンド」側の最高級のグルメパストリーです。ちなみにドーナツも扱っています!)。私たちは北側にあるため、スポンサーも同様です。サイズごとのブラスプラグが入った木製の箱を見つけ、正しいものを選び、丁寧に穴へと押し込みます(できれば一度だけで押し込んで破損させないのが理想的です)。そのプラグが置かれた場所があなたのスコアとなります。
弾は紙を内側に押し込むため、リングライン自体が触られていなくても、フランジ(弾頭先端の膨らみ部分)が外側リングの範囲を超えている場合は、より低いスコアになります。 射撃そのものは楽しいのですが、スコア数えや頭にぶつけるプラグを押すという儀式は続けることはできませんでした。 私がそこにいた理由は「調理」でした。 私は何十年前からこの道に入り、次第に中毒症状を呈しました。訪れた高級レストランの料理を模倣するという恥ずかしげないままでの試みから、自動加圧庫(キュリンガー)を構築するまでです。麹を買うのではなく自前で菌を育て、ラーメンの生地で真空室での加水硬化を行い、プロテアーゼとカエル目動物をインマージョンサーキュレーターで加熱してガラム(魚醤)を作りました。 その後、サリゲル(ハムソーセージ類)の世界へ進み、これはつまり全身の獣体を入手し、自分で解体することを意味しました。肉料理の本気に取り組みたいため猟師になりたいと考え、銃を持つことを決意しましたが、私はこれまで決して銃を扱ったことはありません。イギリスではライセンス制度を愛好し、銃器には懐疑的(ナイフを好む)ですが、シカ猟には狩猟ライセンスもライフルの許可証も必要ありません。火器法により、地主は「監督」下においてあなたに自らの銃を貸与でき、それが何世紀にもわたり地主の所有地での狩りが行われてきた理由です(その点について言及すれば、それはシカスタッキングであり、狩猟騎馬で行うのは富豪たちの専物事、ライフル射撃でやるのもまた富豪たちのためのことです)。 赤いシカは基本的に害獣です。林業よりも速く森を食い荒らし、天敵がいないため、個体数調整(カリング)にはほぼ制限がありません。 しかしライフル自体は必要であり、できれば扱い方も知っておくべきです。私はコードを書くことだけで足に穴を空けるほど失敗を繰り返しましたので、想像してください。火器があればどんなことになるか?—それで私は、週に 2 回マットの上でその試行錯誤を続けたのです。シカを追って殺すという Discipline とはまた異なるものでした:発射し、カードを取り替える、ドーナツを食べる、これを繰り返します。半年後には、まだ撃つことのないジンバラステーキへと向かう道中で数ポンドの体重増がありましたし、最も夜間の時間を割いて正しいサイズのスコアリングゲージを探していました。 退屈を感じながらも、自動化してみることにしました。
ネガティブスペース(負の空間) 私は iOS エンジニアですので、まずは純粋な iOS 開発から着手しました。Apple の Vision フレームワークはすでに存在しており、オブジェクト検出、人物セグメンテーション、テキスト認識、そしてバーコードスキャンまでといった即戦力型のデテクターが用意されています。しかし、それはランダムな画像の部分を「弾痕」としてタグ付けし続けるものでした。標靶の中心の点からリングの一部まで、すべてを弾痕と識別してしまいました。 弾痕とは「負の空間(欠けた部分)」です。オブジェクト検出器は本来あるべきものを訓練されています。したがって、かつてそこに存在しその後消えてしまったものを特定する方法は、簡単ではありません。
いくつか очевидный(明白な)方法を試しました:グレースケール化、画像反転、ノイズの追加と除去など。しかし、他の部分が完璧に動作しても、リングライン上で着弾したショットは、検出されずに小さな断片化してしまいます。 より優れたアプローチとして、標靶を既知のジオメトリを持つオブジェクトとして扱うことです:まずリング構造を検出し、その後内部の穴を探します。今回は車輪を再発明する必要はないと割り切り、代替案を検索しました。
ポートとその他 2012 年の論文『Tournament Precision with Automatic Scoring of Shooting Targets』が存在しています。シューティングターゲットのスコアリング問題はコンピュータビジョンとして十分に退屈であり、誰かがそれを出版するに至ったのです。ワルシャワ工科大学の Rudzinski と Luckner 氏によって発表されたこの論文は、2012 年発行で「検出率 99%」を約束していました。 ただしいくつかの注意点があります:このアプローチは低解像度画像向けに最適化されていますが、平面的な ISSF ターゲットが必要です。NSRA と比較すると、ISSF ターゲットには bulls(中心靶)のサイズやリングの数・種類、背景、カメラアングル、注釈の形式、そして一般的にペレット射撃用に設計されています。エアライフルのペレットは紙にクッキー型のようにきれいな穴を作りますが、25 ヤード先の .22 ライフル弾頭は不揃いな縁を残します。 私はこの論文を段階的に再現しました。論文を読むのが面倒であれば、要約すると 4 つのステップです:リングラインを消去し、フLOOD-FILL により穴の形状を見つけ、Prewitt エッジ検出を実行し、最後に Hough 変換で円に適合させるというものです。
Vision フレームワークには Prewitt エッジ検出器がないため、OpenCV も取り込み、最初の 3 つのステップはうまくいったのですが、4 つ目のステップには落とし穴がありました。NSRA カードは方位点(北・東・南・西)にリングスコアを印刷しており、「9」のリングの四方にも「9」という数字があります。Hough はこれらの数字にも円適合を試みてしまいます。 また、 Rings の消去後に残る月牙形が小さくなり、FLOOD-FILL に対応しきれないこともあり、結局は V 値径向強度プロファイルを使用することになりました:bull の中心から外向きにストリップを選び、その上での明るさをサンプリングし、白色のリングラインが横断する場所のスパイク(急激な変化)を探します。スパイクの位置がリングの半径です。
Vision の VNDetectContoursRequest と境界線フィルタと組み合わせても、カードあたり平均 5 つのショットのうち 4 つしか取得できず、つまり精度は 80% に留まりました。まだ改善の余地が多く、オーバーラップするショットなどのエッジケースにも対応できていませんでした。
機械学習を追加して 射手たちは標靶カードに様々な操作を加えます。名前を書く、日付を追加し、近い着弾を丸で囲むなどです。多くのカードには破れた穴留め孔があり、時には複数の弾頭が非常に近接して紙を裂き、一つの FLOOD-FILL 領域として扱われることもあります。 私の最初の試みは、それぞれのケースに対してヒューリスティックを追加し、週ごとに新しいショットカードを持ち帰り、再度調整を繰り返すことでしたが、これはほとんどスケーラブルでも持続可能でもありませんでした。 そこで再び Google を探索し、2023 年末に公開された論文『Z. Ali et al., "Application of YOLOv8 and Detectron2 for Bullet Hole Detection and Score Calculation from Shooting Cards"』(AI, vol. 5, no. 1, pp.72-90, 2024)に出会いました。著者たちは平均精度 96.5% を約束しましたが、主に穴の検出に焦点を当て、バウンディングボックスのクラスからスコアを読み取っていました。 私のカードに対してバウンディングボックスクラスを手動で準備する余裕はありませんでした。しかし Rudzinski と Luckner の論文のおかげで動作可能な幾何構造はすでに داشتいました。欠けていたのは信頼性の高い穴検出手法でした。YOLO 論文では穴検出は良好でしたが、カードが完全に整合しているという仮定にジオメトリを委ねていました。 当然ながら、私は二つのアプローチを融合させました:OpenCV が構造的ジオメトリ(bulls、楕円、リング、透視変換)を処理し、YOLOv8 が穴の局在化を担当しました。MDPI 論文と同じアーキテクチャを持ち、私の独自データセットでファインチューニングされたものです。推論時には学習モデルのクラス予測は破棄され、スコアは bull の中心からの距離と幾何学的なリング半径との比較から得られます。 ラベル付けと訓練が完了したら、coremltools を使用してモデルを CoreML 形式にエクスポートしました。Xcode がインポートした後の最終パッケージのサイズは 22.4 MB です。
スコアリングへのマッピング(座標系との対応付け) 両方の部品が接続された後、スコアリングが最も簡単な部分になると予想していました。実際にはほとんどそうでしたが、座標空間と透視に費やされて時間を失い、完全にそのことを忘れていました。 角度からの写真は bull を各楕円に変換し、径向強度プロファイルも適切に適合させるためにポスト処理が必要です。 Vision は座標原点を左下に設定した 0-1 の範囲でバウンディングボックスを返しますが、UIKit では左上が原点です。そのため、変換方法のせいだと非難できるだけの説得力のある「リング一つずれ」のようなオフバイア一エラーを起こすことが非常に容易です。 座標が一致すると、数学的には簡単に見えます。しかしスコアリングゲージが存在るには理由があります:検出された弾痕は発射した弾頭よりも小さく、紙が裂け内側に押し込まれるためです。CoreML は可視化された破損された紙の周りに bbox を返すだけで、弾頭自体ではありません。したがってスコアリングでは、穴の中心と弾頭の半径(弾頭が進んだ最も遠い点)を加える必要があります。
弾頭半径について .22 口径弾は直径で 0.22 インチ(当たり前です)、NSRA の .22 カードは 2.05 インチなので、幾何学的には弾頭の半径は bull の直径の 10.87% であるはずです。 しかし、紙はそれほどきれいに裂けません。また過去に物理学と機械学習の両方で酷い成績を取っていたため、論文を再読した後に諦め、経験的に乗数を調整するようになりました(つまり定数を変化させ、手動でスコアリングしたカード上でテストを再度実行する):私の場合は 30% が機能しました(つまり bull の直径の 14.13%)が、これを適切な方法で行うことを学びたいです。もしあなたがその方法を熟知している場合、メッセージを残してください。
ゲージを超えて 半年後になってもまだ射撃下手だと思っていますが、今は多くの場合なぜなのかを知っています:姿勢、トリガー圧力、発射中の呼吸など。これらは測定するものではなく感じるものです。だからこそ初心者はグループ化カードを最初に使用します。カード上のグループの形状は多くを教えてくれます:トリガー操作や発射中の呼吸といった一般的な問題からライフル自体の問題まで。bull から数リング外れたところに清潔で緊密なグループが見られる場合、それは単に tune(調整)がなければ bull を完璧に命中させることができるはずです。これは私にとって非常に慰めとなる説明です(友人たちは異議を唱えます)。 競技カードは既知の順序で個々の bull に対して順次発射されるため、最初の bull が分かれば精度と位置との関係をプロットし、トレンドを特定することができます。私は多くの場合、カードが残り少的になっていることに気づいた頃に中央付近から離れ、その後最終盤に再び緊密化することを自らの傾向として観察しています。 このクエストを開始した当初はゲージの低下(そして家を持ち帰るショットカーターンの山の削減)を目指していましたが、スコアリングが機能する頃には、スコアリングだけでなくフィードバックまで自動化することにますます興味を抱いていました。数ヶ月分のスコアリングカードを積み重ね、すべてのショットを累積ヒートマップ上に重ねてトレンドを見ることもできましたし、共通の 4 つのライフルでのパフォーマンスを比較することもできました。 ついに「ドーナツを回りの順番の直前に食べた場合、平均してスコアが 100 点中 7 ポイント低下する」ということを証明することができました。これはプラセボ効果かもしれませんが、私の作業仮説は血糖値を上昇させるということです(言うまでもありませんが、私は物理学だけでなく生物学も苦手です。しかし最善を尽くしています)。 結果として、このプロジェクトは小型のオフラインファーストアプリとして完成しました。最初はクラブに戻った友人たち向けに設計しましたが、実際には調理射撃ルーチンをより楽しくしたいと願う誰でも利用できるようになっています。ただし世界の大多数の人が NSRA ターゲットに関心を持たないことが分かったため、他の競技分野やカードへのサポートを徐々に追加しています。
シカスタッキングに自信が持てるまでカナダへ旅立っていました。 そのマットには誰かが横たわっています。私はいつかまた戻ってくるでしょう。今ではプレストンパンズで月曜日の午後と水曜日の夜に、同じ梁の下を潜りながらカード間の呼吸数を数えることになります。スコアリングゲージのための木製の箱はまだテーブルの上に置かれています。多くの人々が「古き良きブラスプラグより優れていると考えたことが初めてではない」と言っています。 スコアリングゲージの真の仕事は紛争の解決です。二人の射手が境界線のショットについて disagreement を持つ場合、スコアはゲージが示すものでなければならないのです。なぜならそれが規則だからです。どちらも私の最先端コンピュータービジョンモデルには興味がありません。 おそらく、あなた自身も同様の何かを持っているはずです:あなたが現に存在するより長く職務を果たしてきたツールで、それを置き換えるのは愚かであるでしょう。 私たちはそれらを廃止することに失敗するかもしれません。しかし、私は 20 年後にもう誰かのテーブルに置かれるようなものを作りたいと考えています。長続きし、誰かが愚かなほどに置き換えようとする程度のもの。
脚注:
- ここ「ポンド」側の最高級のグルメパストリーです(しかもドーナツも扱っています!)
- 火器法により、地主は「監督」下においてあなたに自らの銃を貸与でき、それが何世紀にもわたり地主の所有地での狩りが行われてきた理由です(その点について言及すれば、それはシカスタッキングであり、狩猟騎馬で行うのは富豪たちの専物事、ライフル射撃でやるのもまた富豪たちのためのことです)
- コードを書くことだけで足に穴を空けるほど失敗を繰り返しましたので、想像してください。火器があればどんなことになるか?
- NSRA と比較すると、ISSF ターゲットには bulls のサイズやリングの数・種類、背景が異なります。
- Z. Ali et al., "Application of YOLOv8 and Detectron2 for Bullet Hole Detection and Score Calculation from Shooting Cards", AI, vol. 5, no. 1, pp.72-90, 2024.
- bull から数リング外れたところに清潔で緊密なグループが見られる場合、それは単に tune(調整)がなければ bull を完璧に命中させることができるはずです。これは私にとって非常に慰めとなる説明です(友人たちは異議を唱えます)。
- いつかまた戻ってくるでしょう。