知見のアーカイブ

物体検知のモデル選定はどう決める?主要モデルを実際に動かして比較

記事

物体検知のモデル選定はどう決める?主要モデルを実際に動かして比較

画像から何かを見つける仕組みを作るとき、まずどのモデルを使うかで迷います。YOLOはもう古いのではないか、言葉で指示できるタイプのほうが柔軟なのではないか、といった話になりがちです。

主要なモデルを同じ40枚のデータで実際に回してみたところ、迷うべき場所は思っていたのと違う場所にありました。精度で悩んでいた固い検出器のほうは、5つ試して誤りの件数が13件から20件の間に収まり、実質的に差がつきません。 代わりに速度が10倍開きます。つまりここは速度で選べば終わります。

本当に厄介なのは、言葉で指示するタイプのほうでした。 こちらはモデルを選んでも出力が決まりません。同じ人を指す言葉に変えただけで、誤りが22件から77件に増えます。

この分野の解説記事を読んでいて気になったのは、論文の数字を引き写した記事はたくさんあるのに、自分で動かして測った結果を載せているものが見当たらないことでした。国内の記事の多くは情報量の厚さを理由にYOLOを推していますが、それは精度や速度とは別の軸の話です。この記事は、同じデータ、同じ指標で実際に回した結果をもとにした選定ガイドです。

検出器は、出力が何で決まるかで2種類に分かれる

物体検知が返すのはこういう出力です。画像のどこに何があるかを、四角い枠と確信度で返します。

物体検知の出力

ここまではどのモデルも同じです。分かれるのは、その枠が何によって決まるかです。

固い検出器は、探すものをあらかじめ決めて学習しておくタイプです。人と車と自転車を探す、と決めて訓練します。使うときに指示は要りません。出力を決めるのはモデルだけなので、モデルを選んだ時点で結果が決まります。DETR、RT-DETR、RF-DETR、YOLOがこれにあたります。

オープン語彙検出は、探すものを使うときに言葉で指示するタイプです。学習データを1枚も用意せずに動かせます。出力を決めるのはモデルと言葉の両方です。Grounding DINOやOWLv2がこれにあたります。

この違いが、そのまま選定の難しさの違いになります。以降はこの順に実測を見ていきます。

なお精度は、誤りの件数で書きます。取りこぼした数と、間違って拾った数を足したものです。正解は115個なので、誤り20件なら6件に1件ほど外していることになります。表ではF1も併記していますが、判断はすべて件数のほうでできます。

先に結論。用途別の選び方

やりたいこと 選ぶもの 理由
製品に組み込んで本番運用したい RF-DETRのNanoからMedium 精度は他と横並びで、速度が5倍から10倍速い。ライセンスも制約が少ない
現場の機械で常時動かしたい RF-DETR Nano 1枚35ミリ秒。今回いちばん軽く、誤りは18件で他と同等だった
まず解けるかどうか試したい Grounding DINO 学習データなしで動く。ただし言い方は必ず複数試す
学習データを作りたい Grounding DINOで下書きし、人が直す 手間が減り、本番の安定性は落ちない

YOLOを選ぶ理由があるとすれば、情報量の厚さと、姿勢推定などを同じ枠組みで扱える点です。ただし製品に組み込むなら有償の個別契約が前提になります。性能だけを理由にYOLOを選ぶ場面は、今回の実測を見るかぎり、もうあまりありません。

固い側:精度では差がつかない。差がつくのは速度だった

まず固い検出器です。5つのモデルを同じ40枚で回しました。

モデル 誤りの件数 内訳 F1 1枚あたり
RF-DETR Medium 13件 取りこぼし8・誤検出5 0.943 61ミリ秒
RF-DETR Small 15件 取りこぼし7・誤検出8 0.935 51ミリ秒
RF-DETR Nano 18件 取りこぼし15・誤検出3 0.917 35ミリ秒
RT-DETR R50 18件 取りこぼし14・誤検出4 0.918 284ミリ秒
DETR R50 20件 取りこぼし12・誤検出8 0.912 336ミリ秒

固い検出器は1点に決まる

正解115個に対して、5つとも誤りは13件から20件の間に収まりました。 40枚という規模では、この幅は差とは呼べません。順位表の上下を気にする意味はほとんどないということです。

一方で速度は35ミリ秒から336ミリ秒まで、約10倍開きます。 いちばん分かりやすいのがRF-DETR NanoとDETR R50の組み合わせで、誤りは18件と20件でほぼ同点なのに、Nanoのほうが約10倍速い。同じ時間で10倍の枚数をさばけます。

古い世代のモデルを重い設定で使うくらいなら、新しい世代の軽いモデルを使ってください。 精度は落ちず、速度だけが手に入ります。

もうひとつ、後で効いてくる性質があります。同じ画像を3回入れたところ、5モデルすべてで座標もスコアも1ビットも変わりませんでした。 固い検出器は、選んだ時点で結果が1点に決まります。だからこそ、選ぶという行為に意味があります。

柔らかい側:モデルを選んでも、出力が決まらない

次にオープン語彙検出です。同じ40枚に対して探す対象は人物のまま固定し、指示する言葉だけを10通りに変えました。閾値のせいで不利になる条件が出ないよう、それぞれに最良の閾値を与えて比べています。

言い方を変えるだけで検出性能が動く

Grounding DINOのtinyで見ると、personと書いたときの誤りは22件でした。固い検出器の18件から20件に迫る良い数字です。ところが同じ人を指しているだけのpeopleにすると、誤りは77件。3.5倍です。取りこぼしはほぼ変わらず、誤検出が9件から60件に増えました。

実際の写真で見ると、何が起きているか分かりやすいと思います。

同じ画像に3通りの言い方を与えた結果

personで13件、peopleで17件、日本語の人では2件です。peopleでは同じ人に枠が二重三重に付き、日本語では手前の2人しか拾えていません。

ここから、実務で踏みやすい落とし穴が3つ見えました。

日本語で指示すると、モデルによっては完全に止まる

日本語の人という指示に対して、Grounding DINOは誤り80件まで悪化するものの、いちおう動きます。ところがOWLv2は誤り240件でした。 正解115個に対して1個しか当てられず、126個の誤検出を出しています。ほぼ何も検出できていません。

OWLv2は英語で学習されたテキスト側の仕組みを使っているため、日本語がまったく通らないのだと思われます。日本語が使えるかどうかはモデルによって天と地ほど違います。 国内で使うなら、ここは最初に確かめてください。

丁寧に書いたほうが悪くなることがある

画像とテキストを結びつける分野では、a photo of a という前置きを付けるやり方が定番として知られています。ところがGrounding DINOでこれをやると、tinyで誤り78件、baseで94件まで悪化しました。personとだけ書いた場合の3倍から4倍です。

よかれと思って丁寧に書くと悪化する。しかも事前には分かりません。

モデルを大きくしても直らない

単なる性能不足なら、大きいモデルで改善するはずです。ところがGrounding DINOのbaseは、tinyとほぼ同じ形で崩れました。personで誤り23件、peopleで74件、日本語で71件です。崩れ方は今回試した3モデルすべてに共通していました。

容量の問題ではなく、構造的なものだと考えたほうがよさそうです。

なぜこれが本番に置けないのか

ここが今回いちばん大事なところです。固い検出器は選んだ時点で結果が決まりましたが、オープン語彙検出はモデルを選んでも出力が決まりません。 決めているのは言葉のほうです。

では良い言葉を探せばいいかというと、そこで詰まります。どの言い方が良いかは、正解ラベルと突き合わせて初めて分かります。 そして正解ラベルがあるなら、固い検出器を学習させたほうが速くて安定します。ラベルがないから言葉で指示しているのに、言葉を選ぶにはラベルが要る。この循環が、本番の判定に置けない理由です。

速度の面でも差は大きく、Grounding DINO tinyは1枚あたり約1.9秒でした。RF-DETR Nanoの50倍以上かかります。

属性の識別:絞り込めているように見えて、同じ人が高齢者でも若者でもある

ここまでは人物を探すだけの話でした。ただ実務で知りたいのは、たいていもっと細かいことです。同じ人物でも高齢者なのか、男性なのか。人を見つけるだけなら、どのモデルも大量に学習しているのでできて当たり前です。

そこで、人物という指示に属性語を足して測りました。

属性語を足すと何が起きるか

上の段では、an elderly personと指示したときの検出数が51個で、personの130個から半分以下に減っています。一見きちんと絞り込めているように見えます。

問題は下の段です。高齢者として検出された51人のうち、44人が若者としても同じ人物として検出されていました。割合にして86.3%です。 同じ人が高齢者でも若者でもある、ということはありません。男女の組み合わせでは53.1%、子供と大人では39.0%でした。

つまり検出数が減っているのは属性で絞り込んだからではなく、単にスコアが下がって下位が閾値から漏れただけです。減った数を見て絞り込めていると判断すると、間違えます。

この確かめ方は正解ラベルが要らないところが便利です。両立しないはずの属性を2回指示して、同じ枠が両方に出てきたら、それは属性を見ていない証拠になります。手元のデータでもそのまま試せます。

効かないのではなく、効く条件が狭い

ただし属性がまったく効かないわけではありませんでした。写り方によってはっきり分かれます。

条件によって属性の効き方が変わる

上の段は、3人が大きくはっきり写っている写真です。高齢者と指示すると右の2人が、若者と指示すると中央の子供が囲まれました。きちんと入れ替わっているので、この条件では属性を見ています。

下の段は人通りのある場所を撮った、現場に近い写真です。人物としては13人検出できるのに、高齢者と指示しても若者と指示しても、返ってきたのは肩車された同じ幼児2人だけでした。高齢者という指示に幼児を返している時点で、年齢を見ていないことは明らかです。

被写体が大きくはっきりしていれば効く。人数が増えて小さく写ると、大半を取りこぼしたうえ、残ったものも当てにならない。展示会のデモは通るのに現場に置くと動かない、という現象の中身がこれだと思います。

お役立ち資料
国内99件のAI・データ活用プロジェクトの成功事例をまとめた資料です。 関心のある業界や、気になる関連企業の成功事例の詳細な事例集をご覧にいただけます。
ダウンロードはこちら

だから工程を分ける。柔らかい側はラベル作りに、固い側を本番に

ここまでの実測をまとめると、使い分けは自動的に決まります。

オープン語彙検出には、学習データを1枚も用意せずに動かせるという他にない長所があります。一方で言い方で結果が動き、日本語が通るとは限らず、属性は条件がそろったときしか効かない。共通しているのは、出力を人が見ないと正しさが分からないという点です。

そこで、人が見る工程に置きます。

  1. オープン語彙検出に、大量の画像へ下書きのラベルを自動で付けさせる
  2. 人が明らかな間違いだけを直す
  3. 直したデータで、固い検出器を学習させる
  4. 本番は固い検出器だけで動かす

言い方への弱さは、2の段階で人が直せば消えます。本番に残るのは、何度回しても同じ答えを返す検出器だけです。ラベル付けの手間が下がり、運用の安定性は落ちません。

ただし最初に手を付けるべきは、実は検知したいものを言葉ではなく物理量で定義し直す作業のほうです。ここが決まっていないとラベルの基準がぶれるので、自動化しても品質が上がりません。

ライセンス:性能で決めたあとに作り直しになる落とし穴

性能で決めたあとにライセンスで作り直しになるのが、この分野でいちばんもったいない失敗です。一次情報を確認した結果をまとめます。なお法的な助言ではないので、採用前には原文の確認をおすすめします。

区分 該当するもの 注意点
そのまま商用可 DETR、RT-DETR、D-FINE、DEIM、Grounding DINO、OWLv2 Apache 2.0。表示義務も継承義務もない
条件付きで商用可 SAM 3、DINOv3 Metaの独自ライセンス。派生物にも同じ契約が付いてくる
実質的に有償 YOLO26、YOLO11、YOLOv8、YOLO-World、YOLOE コピーレフト。製品に組み込むなら個別契約が要る

見落としやすいものが3つあります。

RF-DETRは全部が同じライセンスではありません。 公式の説明では、パッケージ本体とApacheが指定された重みはApache 2.0ですが、拡張とXLおよび2XLの検出モデルは別のライセンスです。ベンチマークで見た数字が大きいモデルのものだった場合、そこはApacheではない可能性があります。

バックボーンのライセンスは製品まで伝わってきます。 DINOv3を土台にしたモデルは、本体のコードがApacheでもDINOv3側の条件が付いてきます。ややこしいのは、ひとつ前のDINOv2はApache 2.0だという点です。RF-DETRはDINOv2を使っているので、こちらは問題ありません。

YOLOという名前が付いていても出どころはばらばらです。 YOLO-Worldはテンセント、YOLOEは清華大学で、それぞれ別のコピーレフトです。オープン語彙検出でライセンスが緩いものを探すなら、Grounding DINOかOWLv2になります。

なおMetaの2つのライセンスは、原文を読むと派生物への契約の継承、研究発表時の謝辞、軍事や核や諜報といった用途の禁止、リバースエンジニアリングの禁止が主な中身でした。表示義務があるという解説を見かけますが、少なくとも原文にその条項は見当たりませんでした。

応用:状態を知りたいときは、状態を直接検知しない

実務で多いのが、物ではなく状態を知りたいという相談です。介護施設で入居者の様子を把握したい、工場で危ない作業を見つけたい、といったものです。

先ほどの属性の実測が、そのまま答えになっています。現場に近い写り方で高齢者かどうかすら怪しくなるモデルに、その人の状態まで判断させるのは無理があります。

もうひとつ理由があります。状態は1枚の絵に写りません。床に横たわっている写真は、転倒した直後かもしれないし昼寝かもしれない。直前の数秒との差を見て初めて区別が付きます。物を探すのは空間の問題ですが、状態は時間の問題なので、道具の種類が違います。

なので、こう組み替えます。

  1. 画像から骨格の座標を取り出す。画像処理はここまで
  2. 重心の高さ、体幹の傾き、ベッドの内か外か、動きのばらつきといった数値の時系列に変換する
  3. その先は時系列の分析や異常検知として解く

こうすると転倒は、重心が急に落ちて、体幹が水平になり、その状態が一定時間続くこと、と定義できます。状態を、観測できる物理量の関数として書き下すわけです。

この組み替えには実務上のうまみが3つあります。なぜ知らせたのかを説明できること。映像を保存せず骨格の座標だけを残せるので、撮られることへの抵抗が下がること。そして、めったに起きない事象を無理に学習させずに済むことです。転倒のようにまれで再現実験もできない事象は、正常な状態を学んでそこからの外れを見るほうが現実的です。

いちばん時間をかけるべきなのは、何をもってその状態とするかを現場と決める作業です。ここは機械学習ではなく設計の仕事で、飛ばすと後の工程が全部ぶれます。

まとめ

固い検出器は、精度表の順位で選ばないこと。 今回、5モデルすべてが誤り13件から20件に収まりました。差がついたのは速度だけで、そちらは10倍開きます。速度要件から先に決めて、そこに収まるいちばん新しい世代を選べば済みます。

言葉で指示する仕組みを、本番の判定に置かないこと。 同義語に言い換えるだけで誤りが3.5倍になり、日本語では止まるものもあり、モデルを大きくしても直りませんでした。しかも良い言い方を選ぶには正解ラベルが要り、ラベルがあるなら固い検出器を学習させたほうが速い。ラベルを作る側に置けば、この弱点は消えます。

細かい違いを見分けさせたいなら、まず条件を疑うこと。 両立しないはずの属性を2回指示して、同じ枠が両方に出るかを見れば、ラベルなしで確かめられます。今回は高齢者と若者で86.3%が重なりました。

性能で決めきる前にライセンスを見ること。 重みの出どころとバックボーンまでさかのぼると、思っていた条件と違うことがあります。

そして結局のところ、物体検知はモデルを選べば終わる話ではありません。何を検知したいのかを、機械が測れる形に翻訳できるかどうかでほとんど決まります。そこさえ決まっていれば、モデルの選択肢は最初の表くらいまで絞れます。


この記事の実測について

  • データ:COCOの検証用画像から40枚を抽出。人物の正解は115個。1画像に2人から6人が写り、極端に小さい対象は評価が不安定になるため除いています
  • 判定:予測と正解の重なりが半分以上あれば当たりとみなし、スコアの高い順に1対1で対応付け。誤りの件数は、取りこぼしと誤検出の合計です
  • 閾値:モデルや言い回しによって有利不利が出ないよう、条件ごとにスコアの閾値を掃引し、その条件が出せる最良の値で比較しています。同じ40枚で閾値を選んでいるので、絶対値はやや良く出ます。条件どうしの比較には影響しません
  • 属性の検証:閾値は0.30に固定。重なりが9割を超えたものを同じ人物として数えました
  • 固い検出器:DETR R50、RT-DETR R50、RF-DETRのNano、Small、Medium。それぞれ3回ずつ実行して出力の一致を確認
  • オープン語彙検出:Grounding DINOのtinyとbase、OWLv2 base
  • 実行環境:一般的なノートパソコン(画像処理装置なし、CPUのみ)。速度は相対比較として読んでください
  • 記事中の検出結果を描いた写真は、商用利用が認められているPixabayの素材を使っています。集計に使ったCOCOの画像は権利者がばらばらなので掲載していません
  • 40枚という規模なので、数値そのものは幅を持って読んでください。固い検出器5つの精度差はこの幅の中に収まりますが、言い回しによる差と属性の重なりは、幅を大きく超えて出ています

お問い合わせ

下記フォームよりお気軽にお問い合わせください。
担当者より折り返しご連絡いたします。

外観検査異常検知・予知保全システム開発