YOLO11とRF-DETR:物体検出技術のテキスト

概要

YOLO11はUltralyticsが公開した畳み込みニューラルネットワーク(CNN)系の物体検出モデルであり、C3k2ブロックとC2PSAブロックにより効率と精度を高めている。RF-DETRはRoboflowが公開したTransformer系の物体検出モデルであり、DINOv2で事前学習したバックボーンを用いて、NMS(重複検出の除去処理)を必要としない検出を行う。両者ともCOCOデータセットで学習済みのモデルが公開されており、80種類の物体を検出できる。

目次

第1章 基本用語と定義

物体検出(Object Detection)
画像内に存在する物体の位置(Bounding Box)とクラス(カテゴリ)を同時に特定する技術。

Bounding Box(バウンディングボックス)
物体を矩形で囲む座標情報。通常(x, y, w, h)または(x1, y1, x2, y2)で表現される。

IoU(Intersection over Union)
予測された矩形と正解矩形の重複度を示す指標。IoU = (重複面積) / (結合面積)で計算される。

mAP(mean Average Precision)
物体検出の標準的な精度評価指標。複数のIoU閾値における平均精度(AP)の平均値。COCOでは、IoU閾値を0.50から0.95まで0.05刻みで変えた場合の平均をAP50:95、IoU閾値0.50の場合の値をAP50と表記する。

NMS(Non-Maximum Suppression、非最大抑制)
重複する検出結果を除去する後処理技術。同一物体に対する複数の検出候補から最適なものを選択する。処理時間がかかるため、この処理を必要としない設計は推論の高速化につながる。

End-to-End学習
入力画像から最終的な検出結果まで、単一のニューラルネットワークで一貫して学習する手法。従来の多段階処理を統合し、中間的な後処理を不要にする。

Transformer
自然言語処理で開発された注意機構(Attention Mechanism)ベースのニューラルネットワーク。入力の重要な部分に注目を集中させる技術で、画像認識分野にも応用されている。

バックボーン(Backbone)
入力画像から特徴を取り出す、モデルの前段部分。ここで得られた特徴をもとに、後段が物体の位置とクラスを予測する。

事前学習(Pre-training)
目的の課題に取り組む前に、大量のデータでモデルを学習させておくこと。事前学習で得た知識を引き継ぐことで、少ない学習データでも精度が出やすくなる。

推論時間(レイテンシ)
1枚の画像を入力してから検出結果が得られるまでの時間。測定に用いるGPU、推論エンジン、数値精度、画像サイズによって値が変わるため、比較するときは測定条件をそろえる必要がある。

第2章 YOLO11

2.1 概要

YOLO11は2024年9月30日にUltralyticsから公開された物体検出モデルである[1]。本モデルはYOLOv8の後継として位置付けられ、アーキテクチャの改良による効率性向上を図っている。物体検出のほか、インスタンスセグメンテーション、画像分類、姿勢推定、回転を考慮した物体検出(OBB)に対応する。ライセンスはAGPL-3.0と商用向けのEnterpriseライセンスの二本立てである。

2.2 アーキテクチャ

2.2.1 C3k2ブロック

C3k2ブロックは、YOLOv8で使われていたC2fブロックに代わる構成要素であり、実装上もC2fを基にしている。名称の「C3k2」は、2つの畳み込みによるCSP(Cross Stage Partial)ボトルネックの高速な実装であることと、内部にC3kブロックを選んで使えることを表す。C3kブロックは、畳み込みのカーネルサイズを設定できるCSPボトルネックである。YOLO11では、バックボーンとヘッドの両方でC3k2ブロックが繰り返し使われている。

2.2.2 C2PSAブロック

C2PSAブロックは、YOLO11で新規導入された注意機構である。内部にPSABlock(Position-Sensitive Attention、位置に応じた注意機構)を並べ、マルチヘッド注意機構とフィードフォワード層を適用する。特徴マップ内の重要な領域に処理を集中させることで、検出精度の向上に寄与する。YOLO11では、バックボーン末尾のSPPFブロックの直後に置かれている。

2.2.3 SPPFブロック

SPPF(Spatial Pyramid Pooling-Fast)ブロックは、前バージョンから継承された構成要素であり、YOLO11においても多重スケール特徴の効率的な処理に活用されている。異なる大きさの領域をまとめて扱うことで、大きさの違う物体に対応しやすくする[2]。

2.3 性能

Ultralytics公式ドキュメントが公開しているCOCO val2017での性能は以下の通りである[1]。入力画像サイズは640ピクセル、推論時間はNVIDIA T4上のTensorRT10による測定値である。

パラメータ効率について、UltralyticsはYOLO11mがYOLOv8mより22%少ないパラメータ数で、より高いmAPを達成したとしている[1]。この22%という値は、YOLO11mとYOLOv8mを比べたときのものであり、特定のブロック単体の削減率ではない。

第3章 RF-DETR

3.1 概要

RF-DETRは2025年3月20日にRoboflowが公開した物体検出モデルである[3][4]。名称はRoboflow Detection Transformerに由来し、Transformerが物体の集合を直接予測するDETR系に属する。物体検出のほか、インスタンスセグメンテーション(RF-DETR Seg)とキーポイント検出(RF-DETR Keypoint)に対応する。

Nano、Small、Medium、Largeの各モデルはApache 2.0ライセンスで公開されており、COCOデータセットで学習済みの重みが利用できる。より大きなXLarge、2XLargeは拡張パッケージ(rfdetr_plus)で提供され、別のライセンス(PML 1.0)が適用される。関連する論文は arXiv:2511.09554 で公開され、ICLR 2026に採択されている[5]。

3.2 アーキテクチャ

RF-DETRは、Deformable DETR(変形可能な注意機構を用いたDETR)の構成を土台としている[6]。Deformable DETRが複数スケールの特徴を扱うのに対し、RF-DETRは単一スケールのバックボーンから特徴マップを取り出す点が異なる[4]。

設計の中心は、軽量なDETRであるLW-DETR[7]と、自己教師あり学習で事前学習されたDINOv2バックボーン[8]を組み合わせた点にある。DINOv2で獲得した汎用的な視覚特徴を引き継ぐため、学習データが少ない分野に対しても適応しやすい。

また、複数の解像度で学習しているため、再学習せずに実行時の解像度を変えて、精度と速度の兼ね合いを調整できる。公開されている各モデルサイズは、重みを共有したまま多数の構成を評価するニューラルアーキテクチャ探索(NAS:ネットワーク構造を自動で探索する手法)によって決められている[5]。

DETR系のモデルであるため、RF-DETRはNMSを必要としない。物体の集合をEnd-to-Endで予測するため、重複検出を除去する後処理の工程がない[4]。

3.3 性能

Roboflow公式リポジトリが公開している性能は以下の通りである[3]。推論時間はNVIDIA T4上のTensorRT、FP16、バッチサイズ1による測定値である。

RF-DETRは、COCOベンチマークで60を超える平均精度に到達した最初のリアルタイムモデルである[3]。また、実世界の多様なデータセットへの適応力を測るRF100-VLベンチマークでも高い成績を示している。

第4章 技術比較

YOLO11とRF-DETRを比べる。以下の数値は、Roboflow公式リポジトリが同一条件(NVIDIA T4、TensorRT、FP16、バッチサイズ1)で測定した結果である[3]。

ここで示したYOLO11の数値は、第2章でUltralyticsが公開している数値(39.5〜54.7)とは異なる。測定に使う推論エンジン、数値精度、後処理の扱いが違うと、同じモデルでも数値は変わる。異なる出典の数値をそのまま並べて比べないよう注意する。

設計面の違いは次の通りである。

用途に応じて選択する。パラメータ数を抑えて省メモリで動かしたい場合や、分類・OBBまで一つの体系で扱いたい場合はYOLO11が適する。同じ推論時間でより高い精度を求める場合、混雑した場面や重なりのある物体を扱う場合、Apache 2.0ライセンスが必要な場合はRF-DETRが適する。

第5章 COCOデータセット

COCO(Common Objects in Context)データセットは、日常的な場面を撮影した画像に物体の位置とクラスを付与したデータセットである。物体検出モデルの学習と精度評価に広く使われている。検出対象は以下の80種類である。

クラス名は英語で定義されている。プログラムの出力もこの英語名で表示される。

第6章 開発環境の準備

第7章と第8章のプログラムを実行するために、Python 3.12と開発環境を用意する。

6.1 Python 3.12 のインストール

Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。

[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]

Windows での Python 3.12 のインストール

以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。

方法 1:winget によるインストール

インストールコマンドの実行方法

管理者権限コマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。

REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"

REM 現在のセッションにも反映(システムPATHを再取得して連結)
for /f "usebackq tokens=2,*" %A in (`reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path`) do set "PATH=%B"

REM pip / wheel の更新
python -m pip install --no-user -U pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

方法 2:インストーラーによるインストール

  1. Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

6.2 Python の開発環境 Visual Studio Code のインストールと Python 用の設定

Python の開発環境Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を整える。

[Windows での Visual Studio Code のインストールと Python 用の設定手順を見るには、ここをクリック]

Windows での Visual Studio Code のインストールと Python 用の設定手順

1. VS Code と拡張機能のインストール

以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.

インストールコマンドの実行方法

管理者権限コマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド


REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM 全ユーザー共有の拡張機能フォルダ
if not exist "C:\ProgramData\vscode-extensions" mkdir "C:\ProgramData\vscode-extensions"
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code"
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"

REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f

REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"

REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions

REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'glm-4.7-flash'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM 自動更新の抑止ポリシー(settings.json に加えて、レジストリ側でも明示的にオフ)
reg add "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" /t REG_SZ /d "none" /f
echo === セットアップ完了 ===

2. Python インタプリタの選択

同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.

  1. コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(Ctrl+Shift+P
  2. Python: Select Interpreter と入力する
  3. 表示される一覧から,使用する Python(例:C:\Program Files\Python312\python.exe)を選択する.

第7章 YOLO11物体検出プログラムの実行と実験

7.1 概要

YOLO11(You Only Look Once version 11)は物体検出AIモデルである。本プログラムでは、画像内の物体を検出し、その種類と位置を特定する。80種類の物体(人、車、動物、家具など)を認識でき、検出精度と処理速度の兼ね合いが異なる5つのモデルから選べる。静止画像とWebカメラのリアルタイム検出の両方に対応する。

7.2 ライブラリのインストール

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

起動したコマンドプロンプトで次を実行する。

pip install --no-user ultralytics opencv-python

7.3 Pythonプログラム

from ultralytics import YOLO
import cv2
import tkinter as tk
from tkinter import filedialog

# 設定可能な定数
MODEL_NAME = 'yolo11n.pt'
CONF_THRESHOLD = 0.5
WINDOW_TITLE_IMAGE = "YOLO11物体検出"
WINDOW_TITLE_REALTIME = "YOLO11リアルタイム物体検出"
MENU_TITLE = "YOLO11物体検出プログラム"

print("モデルを読み込み中...")
model = YOLO(MODEL_NAME)

print(MENU_TITLE)
print("1: 画像ファイル検出")
print("2: リアルタイム検出(Webカメラ)")
choice = input("選択してください (1 or 2): ")

if choice == "1":
    root = tk.Tk()
    root.withdraw()
    image_path = filedialog.askopenfilename(
        title="画像ファイルを選択してください",
        filetypes=[("画像ファイル", "*.jpg *.jpeg *.png *.bmp *.gif"), ("すべてのファイル", "*.*")]
    )
    root.destroy()

    if image_path:
        print(f"画像を解析中: {image_path}")
        results = model(image_path, conf=CONF_THRESHOLD)

        print(f"検出された物体数: {len(results[0].boxes)}")
        for i, box in enumerate(results[0].boxes):
            class_name = model.names[int(box.cls.item())]
            confidence = box.conf.item()
            print(f"{i+1}. {class_name} (信頼度: {confidence:.2f})")

        annotated_image = results[0].plot()
        cv2.imshow(WINDOW_TITLE_IMAGE, annotated_image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        print("ファイルが選択されませんでした")

elif choice == "2":
    print("Webカメラを起動中...")
    cap = cv2.VideoCapture(0)

    if not cap.isOpened():
        print("エラー: Webカメラを開けませんでした")
        exit()

    print("リアルタイム検出を開始します。'q'キーで終了")

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        results = model(frame, conf=CONF_THRESHOLD)
        annotated_frame = results[0].plot()

        detection_count = len(results[0].boxes)
        cv2.putText(annotated_frame, f"Objects: {detection_count}",
                   (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        cv2.imshow(WINDOW_TITLE_REALTIME, annotated_frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

else:
    print("無効な選択です")

print("プログラムを終了します")

7.4 使用方法

  1. プログラムを実行すると、モデルの自動ダウンロードが開始される(初回のみ)
  2. メニューから選択:
    • 「1」:画像ファイルから物体検出
    • 「2」:Webカメラでリアルタイム検出
  3. 画像ファイル検出では、ファイル選択ダイアログから画像を選択
  4. リアルタイム検出では、「q」キーで終了

検出結果は画像上に矩形と物体名で表示される。コンソールには検出された物体の一覧と信頼度が出力される。

7.5 モデル選択と性能比較

プログラム内のMODEL_NAMEを変更することで、以下の5つのモデルから選択できる。数値はUltralytics公式ドキュメントによる、COCO val2017・入力640ピクセルでの値である[1]。

T4の値はNVIDIA T4上のTensorRT10、CPUの値はONNXでの測定である。手元の環境ではGPUの種類や設定によって処理時間が変わるため、上記は目安として扱う。

第8章 RF-DETR物体検出プログラムの実行と実験

8.1 概要

RF-DETR(Roboflow Detection Transformer)は、リアルタイムで動作する高精度な物体検出モデルである。本プログラムでは、静止画像とリアルタイム映像の両方で物体検出を行い、Transformer技術による検出性能を確認できる。異なるモデルサイズを比較することで、速度と精度の兼ね合いを確かめられる。

8.2 ライブラリのインストール

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

起動したコマンドプロンプトで次を実行する。rfdetrはPython 3.10以上で動作する。

pip install --no-user rfdetr supervision opencv-python

8.3 プログラムコード

import cv2
import numpy as np
import supervision as sv
from PIL import Image
from rfdetr import RFDETRMedium
import tkinter as tk
from tkinter import filedialog

# 設定可能な定数
CONF_THRESHOLD = 0.5
WINDOW_TITLE_IMAGE = "RF-DETR物体検出"
WINDOW_TITLE_REALTIME = "RF-DETRリアルタイム物体検出"
MENU_TITLE = "RF-DETR物体検出プログラム"

print("モデルを読み込み中...")
model = RFDETRMedium()

print(MENU_TITLE)
print("1: 画像ファイル検出")
print("2: リアルタイム検出(Webカメラ)")
choice = input("選択してください (1 or 2): ")

if choice == "1":
    root = tk.Tk()
    root.withdraw()
    image_path = filedialog.askopenfilename(
        title="画像ファイルを選択してください",
        filetypes=[("画像ファイル", "*.jpg *.jpeg *.png *.bmp *.gif"), ("すべてのファイル", "*.*")]
    )
    root.destroy()

    if image_path:
        print(f"画像を解析中: {image_path}")
        image = Image.open(image_path).convert("RGB")
        detections = model.predict(image, threshold=CONF_THRESHOLD)

        print(f"検出された物体数: {len(detections)}")
        for i, (class_name, confidence) in enumerate(
                zip(detections.data["class_name"], detections.confidence)):
            print(f"{i+1}. {class_name} (信頼度: {confidence:.2f})")

        labels = [f"{class_name} {confidence:.2f}"
                  for class_name, confidence in zip(detections.data["class_name"], detections.confidence)]
        annotated_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
        annotated_image = sv.BoxAnnotator().annotate(annotated_image, detections)
        annotated_image = sv.LabelAnnotator().annotate(annotated_image, detections, labels)

        cv2.imshow(WINDOW_TITLE_IMAGE, annotated_image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        print("ファイルが選択されませんでした")

elif choice == "2":
    print("Webカメラを起動中...")
    cap = cv2.VideoCapture(0)

    if not cap.isOpened():
        print("エラー: Webカメラを開けませんでした")
        exit()

    print("リアルタイム検出を開始します。'q'キーで終了")

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        detections = model.predict(frame_rgb, threshold=CONF_THRESHOLD)

        labels = [f"{class_name} {confidence:.2f}"
                  for class_name, confidence in zip(detections.data["class_name"], detections.confidence)]
        annotated_frame = sv.BoxAnnotator().annotate(frame, detections)
        annotated_frame = sv.LabelAnnotator().annotate(annotated_frame, detections, labels)

        detection_count = len(detections)
        cv2.putText(annotated_frame, f"Objects: {detection_count}",
                   (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        cv2.imshow(WINDOW_TITLE_REALTIME, annotated_frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

else:
    print("無効な選択です")

print("プログラムを終了します")

8.4 使用方法

  1. プログラムを実行すると、モデルの自動ダウンロードが開始される(初回のみ)
  2. メニューから選択:
    • 「1」:画像ファイルから物体検出
    • 「2」:Webカメラでリアルタイム検出
  3. 画像ファイル検出では、ファイル選択ダイアログから画像を選択
  4. リアルタイム検出では、「q」キーで終了

検出結果は画像上に矩形と物体名で表示される。コンソールには検出された物体の一覧と信頼度が出力される。

8.5 モデル選択と性能比較

RF-DETRでは、モデルサイズごとにクラスが用意されている。プログラム2行目付近のfrom rfdetr import RFDETRMediummodel = RFDETRMedium()のクラス名を書き換えることで、以下のモデルを利用できる。数値はRoboflow公式リポジトリによる、NVIDIA T4・TensorRT・FP16・バッチサイズ1での値である[3]。

上の4種類はApache 2.0ライセンスで提供される。さらに大きなRFDETRXLargeRFDETR2XLargeは、拡張パッケージ(pip install --no-user rfdetr[plus])で導入し、別のライセンス(PML 1.0)が適用される。

信頼度閾値(CONF_THRESHOLD)を0.1〜0.9の範囲で調整することで、検出感度の変化を観察できる。

第9章 演習

9.1 YOLO11の演習

  1. モデル比較実験:同一画像で異なるモデルを試し、検出精度と処理速度の違いを確認する。小さな物体や遠くの物体での検出能力の差が現れやすい。
  2. 信頼度閾値の調整:CONF_THRESHOLDを0.1から0.9まで変更し、検出結果の変化を観察する。低い値では誤検出が増え、高い値では見逃しが増える。
  3. 混雑シーンでの性能評価:多数の物体が重なる画像(駐車場、群衆など)で各モデルの検出能力を比較する。
  4. リアルタイム追跡実験:Webカメラモードで物体を動かし、検出の追従性を確認する。フレームレートと検出精度の兼ね合いを体感できる。
  5. 特定物体の検出実験:第5章の80種類の物体リストを確認し、身の回りの物体がどのように分類されるか実験する。予想外の分類結果から、AIの認識特性を理解できる。

9.2 RF-DETRの演習

モデル性能比較実験: 同一画像に対して4つのモデルサイズを順に適用し、検出速度と精度の違いを計測する。Nanoは軽量で高速だが細かな物体の見落としが発生する可能性があり、Largeは処理は重いが高精度な検出が期待できる。

リアルタイム性能検証: Webカメラでの検出において、各モデルのフレームレートを比較する。動きの激しいシーンや複数物体が存在する場面での追従性の違いを観察する。

閾値調整による検出特性変化: 信頼度閾値を段階的に変更し、誤検出と見落としのバランス変化を確認する。低い閾値では多くの候補を検出するが誤検出が増加し、高い閾値では確実な物体のみを検出するが見落としが発生する傾向を実験で確認できる。

複雑なシーンでの検出能力評価: 重複物体、部分遮蔽、異なる照明条件下での検出性能を比較し、RF-DETRの実用性を評価する。従来の物体検出手法では困難とされるシーンでの性能を確認できる。

9.3 YOLO11とRF-DETRの比較演習

同一画像での比較: 第7章と第8章のプログラムに同じ画像を入力し、検出された物体の数、種類、信頼度を比較する。第4章で述べたとおり、同じ推論時間で比べるとRF-DETRの方が精度が高い傾向にある。この違いが実際の画像でどのように現れるかを確認する。

第10章 参考文献

[1] Ultralytics. "Ultralytics YOLO11." Official Documentation. https://docs.ultralytics.com/models/yolo11/

[2] He, K., Zhang, X., Ren, S., & Sun, J. "Spatial pyramid pooling in deep convolutional networks for visual recognition." IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 37, no. 9, pp. 1904-1916, 2015.

[3] Roboflow. "RF-DETR: Real-Time SOTA Object Detection, Instance Segmentation, and Keypoint Detection." GitHub. https://github.com/roboflow/rf-detr

[4] Robicheaux, P., Gallagher, J., Nelson, J., & Robinson, I. "RF-DETR: A SOTA Real-Time Object Detection Model By Roboflow." Roboflow Blog, 2025. https://blog.roboflow.com/rf-detr/

[5] Robinson, I., Robicheaux, P., Popov, M., Ramanan, D., & Peri, N. "RF-DETR: Neural Architecture Search for Real-Time Detection Transformers." arXiv preprint arXiv:2511.09554, 2025. International Conference on Learning Representations (ICLR), 2026.

[6] Zhu, X., Su, W., Lu, L., Li, B., Wang, X., & Dai, J. "Deformable DETR: Deformable Transformers for End-to-End Object Detection." arXiv preprint arXiv:2010.04159, 2020.

[7] Chen, Q., Su, X., Zhang, X., Wang, J., Chen, J., Shen, Y., Han, C., Chen, Z., Xu, W., Li, F., et al. "LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection." arXiv preprint arXiv:2406.03459, 2024.

[8] Oquab, M., Darcet, T., Moutakanni, T., et al. "DINOv2: Learning Robust Visual Features without Supervision." arXiv preprint arXiv:2304.07193, 2023.

[9] Zhao, Y., Lv, W., Xu, S., Wei, J., Wang, G., Dang, Q., et al. "DETRs beat YOLOs on real-time object detection." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), pp. 16965-16974, 2024.

[10] Lv, W., Zhao, Y., Xu, S., Wei, J., Wang, G., Cui, C., et al. "RT-DETRv2: Improved Baseline with Bag-of-Freebies for Real-Time Detection Transformer." arXiv preprint arXiv:2407.17140, 2024.

[11] Kuhn, H. W. "The Hungarian method for the assignment problem." Naval Research Logistics Quarterly, vol. 2, no. 1-2, pp. 83-97, 1955.

[12] Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., et al. "An image is worth 16x16 words: Transformers for image recognition at scale." International Conference on Learning Representations, 2021.

[13] Zou, Z., Chen, K., Shi, Z., Guo, Y., & Ye, J. "Object detection in 20 years: A survey." Proceedings of the IEEE, vol. 111, no. 3, pp. 257-276, 2023.