Rust向けUltralytics Inference#
Ultralytics Inferenceは、Rustで記述された高性能なYOLO推論ライブラリおよびコマンドラインツールです。ONNX Runtimeを介してエクスポート済みのONNXモデルを実行し、推論時にPythonランタイムを必要とせず、画像、動画、Webカメラ、ストリームに対して高速でメモリ安全な予測を実行します。
このプロジェクトはultralytics-inferenceという単一のクレートとして提供され、2通りの方法で使用できます。すばやい予測やバッチジョブ用のCLIとして使う方法と、Rustアプリケーションに直接組み込むライブラリとして使う方法です。すべてのUltralytics タスクと、統一されたデバイスインターフェースを介した幅広いハードウェアバックエンドに対応しています。ブラウザーでの推論向けに、同じリポジトリから@ultralytics/yolo npmパッケージも公開されています。セットアップガイドをご覧ください。
Rustで推論する理由#
- ネイティブの速度と小さなフットプリント。インタープリター不要のネイティブバイナリにコンパイルされるため、サーバー、コンテナ、エッジデバイスに最適です。
- メモリ安全性。Rustの所有権モデルにより、ガベージコレクターを使わずに、実行時エラーの多くの種類を防止できます。
- すべてのYOLOタスク。1つのAPIで、検出、セグメント化、セマンティックセグメンテーション、深度推定、分類、ポーズ、OBBに対応します。
- 幅広いハードウェアサポート。ビルド時に選択する実行プロバイダーを通じて、CPUに加え、CUDA、TensorRT、CoreML、OpenVINO、DirectML、ROCm、XNNPACKに対応します。
- GPU側の前処理。オプションの融合CUDAカーネルがGPU上でレターボックス処理、正規化、レイアウト変換を実行し、デバイスから離れることなく結果をモデルに渡します。
- 自動ダウンロード。既知のYOLOモデル名とサンプルアセットは、初回使用時に自動的にダウンロードされます。
このページではスタンドアロンのRustクレートを扱います。Pythonワークフロー(トレーニング、検証、エクスポート、予測)については、メインのクイックスタートとPredictモードをご覧ください。ONNX連携を使って任意のUltralyticsモデルをONNXにエクスポートし、ここで実行できます。
インストール#
Rust 1.89以降が必要です。動画機能を使用するには、システムにFFmpeg 6~9もインストールする必要があります。
# Install the command-line tool from crates.io
cargo install ultralytics-inference
# Or with GPU support compiled in
cargo install ultralytics-inference --features cuda,tensorrtバイナリは~/.cargo/bin/ultralytics-inference(LinuxおよびmacOS)またはWindows上の%USERPROFILE%\.cargo\bin\に配置されます。
CLIクイックスタート#
CLIにはpredictサブコマンドがあります。引数を指定しない場合、nano検出モデルとサンプル画像をダウンロードして推論を実行し、注釈付きの結果をruns/detect/predictに保存します。
# Detect on the built-in samples (downloads model and images)
ultralytics-inference predict
# Detect on your own image
ultralytics-inference predict --model yolo26n.onnx --source image.jpg
# Segmentation (auto-downloads yolo26n-seg.onnx)
ultralytics-inference predict --task segment --source image.jpg
# Pose on a video, shown live in a window
ultralytics-inference predict --task pose --source video.mp4 --show
# Depth estimation (auto-downloads yolo26n-depth.onnx)
ultralytics-inference predict --task depth --source image.jpg
# Tune thresholds and filter to specific classes
ultralytics-inference predict --source image.jpg --conf 0.5 --iou 0.45 --classes "0,1,2"
# Run a whole folder on the GPU in half precision
ultralytics-inference predict --source images/ --device cuda:0 --quantize 16共通フラグ:
| フラグ | デフォルト | 説明 |
|---|---|---|
--model, -m | yolo26n.onnx | ONNXモデルへのパス。既知のYOLO名は自動的にダウンロードされます。 |
--task | detect | detect、segment、semantic、depth、classify、pose、obbのいずれか。 |
--source, -s | サンプル | 画像、ディレクトリ、glob、動画、ウェブカメラのインデックス、またはURL。 |
--conf | 0.25 | 信頼度のしきい値。 |
--iou | 0.7 | 非極大値抑制のIoUしきい値。 |
--imgsz | モデルのメタデータ | 推論時の画像サイズ。 |
--device | auto | 実行デバイス。例: cuda:0、coreml、tensorrt:0。 |
--max-det | 300 | 画像ごとの検出数の上限。 |
--rect | true | パディングを最小限に抑えた矩形推論。 |
--batch | 1 | 推論のバッチサイズ。 |
--quantize | モデルのデフォルト | 推論精度: 8/int8、16/fp16、32/fp32、w8a16、またはw8a32。 |
--save | true | アノテーション済みの結果をruns/<task>/predictに保存します。 |
--save-frames | false | 動画ファイルの代わりに、動画入力の個々のフレームを保存します。 |
--save-json | false | セマンティックセグメンテーションのクラスマップをPNGで保存します。 |
--show | false | 結果をウィンドウに表示します。 |
--verbose | true | 画像ごとの結果と処理時間を出力します。 |
--classes | すべて | クラスIDで検出結果をフィルタリングします。例: "0,1,2"。 |
ライブラリのクイックスタート#
モデルを読み込んで予測を実行します。クラス名、タスクの種類、画像サイズなどのモデルメタデータは、ONNXファイルから自動的に読み込まれます。
use ultralytics_inference::YOLOModel;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Metadata (classes, task, imgsz) is parsed from the model.
let mut model = YOLOModel::load("yolo26n.onnx")?;
let results = model.predict("image.jpg")?;
for result in &results {
if let Some(boxes) = &result.boxes {
for i in 0..boxes.len() {
let class_id = boxes.cls()[i] as usize;
let conf = boxes.conf()[i];
let name = result.names.get(&class_id).map_or("unknown", |s| s.as_str());
println!("{name} {conf:.2}");
}
}
}
Ok(())
}ビルダーAPIを使用して、InferenceConfigでしきい値、画像サイズ、精度、デバイスを設定します:
use ultralytics_inference::{Device, InferenceConfig, Quantization, YOLOModel};
let config = InferenceConfig::new()
.with_confidence(0.5)
.with_iou(0.45)
.with_imgsz(640, 640)
.with_device(Device::Cuda(0))
.with_quantize(Quantization::Fp16);
let mut model = YOLOModel::load_with_config("yolo26n.onnx", config)?;
let results = model.predict("image.jpg")?;タスクごとに、Resultsの異なるフィールドに値が設定されます。以下の各タブは、単独で実行可能な完全なプログラムです。モデルとサンプル入力は初回実行時に自動的にダウンロードされます。独自のファイルを使って実行するには、predict_default()をpredict("image.jpg")に置き換えます。
use ultralytics_inference::YOLOModel;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut model = YOLOModel::load("yolo26n.onnx")?;
let results = model.predict_default()?;
for result in &results {
if let Some(boxes) = &result.boxes {
println!("{} detections", boxes.len());
let xyxy = boxes.xyxy(); // rows of [x1, y1, x2, y2]
for i in 0..boxes.len() {
let class_id = boxes.cls()[i] as usize;
let name = result.names.get(&class_id).map_or("unknown", |s| s.as_str());
println!(" {name} {:.2} {:?}", boxes.conf()[i], xyxy.row(i).to_vec());
}
}
}
Ok(())
}サポート対象のタスク#
Ultralyticsのタスクはすべてサポートされています。--modelを省略すると、選択したタスクに対応するnanoモデルが自動的にダウンロードされます。
| タスク | --task | 出力 | デフォルトモデル |
|---|---|---|---|
| 検出 | detect | バウンディングボックスとクラス | yolo26n.onnx |
| インスタンスセグメンテーション | segment | ボックスとインスタンスごとのマスク | yolo26n-seg.onnx |
| セマンティックセグメンテーション | semantic | ピクセル単位のクラスマップ | yolo26n-sem.onnx |
| 深度推定 | depth | メートル単位のピクセルごとの深度マップ | yolo26n-depth.onnx |
| 分類 | classify | クラス確率 | yolo26n-cls.onnx |
| 姿勢推定 | pose | ボックスとキーポイント | yolo26n-pose.onnx |
| 方向付きボックス | obb | 回転バウンディングボックス | yolo26n-obb.onnx |
モデルの互換性#
ONNXにエクスポートされたUltralyticsモデルは、いずれもローカルファイルから読み込めます。YOLO26、YOLO11、YOLOv8の標準的なモデル名は、サイズn、s、m、l、xであれば自動ダウンロードできます:
| モデルファミリー | 自動ダウンロード可能なバリアント |
|---|---|
| YOLO26 | yolo26{n,s,m,l,x}.onnx、-seg、-pose、-obb、-cls、-sem、-depth |
| YOLO11 | yolo11{n,s,m,l,x}.onnx、-seg、-pose、-obb、-cls |
| YOLOv8 | yolov8{n,s,m,l,x}.onnx、-seg、-pose、-obb、-cls |
セマンティックセグメンテーション(-sem)と深度推定(-depth)はYOLO26のみで利用できます。RT-DETRの検出モデルも実行できますが、自動ダウンロードには対応していません。先にONNXにエクスポートしてください。
入力ソース#
--source引数(およびライブラリのSource型)は、文字列から自動判定されるさまざまな種類の入力を受け付けます:
| ソース | 例 | 備考 |
|---|---|---|
| 画像 | image.jpg | 単一ファイル。 |
| ディレクトリ | images/ | フォルダー内のすべての画像。 |
| Glob | images/*.jpg | シェル形式のパターン。 |
| 動画 | video.mp4 | video機能が必要です。 |
| ウェブカメラ | 0 | video機能が必要です。 |
| ストリーム | rtsp://... | video機能が必要です。 |
| URL | https://example.com/image.jpg | リモート画像のダウンロード。 |
デバイスと実行プロバイダー#
GPUおよびアクセラレータのバックエンドはCargo機能としてコンパイルされ、--device(CLI)またはDevice(ライブラリ)を使って実行時に選択します。デバイスを指定しない場合、ビルドに組み込まれたプロバイダーは固定の優先順位(TensorRT、CUDAの順など)で登録されるため、デフォルト機能のみのビルドではCPUで実行されます。
| デバイス文字列 | Deviceバリアント | ビルド機能 | ハードウェア |
|---|---|---|---|
cpu | Device::Cpu | 組み込み | 任意のCPU |
cuda:0 | Device::Cuda(0) | cuda | NVIDIA GPU |
tensorrt:0 | Device::TensorRt(0) | tensorrt | NVIDIA GPU、最適化済み |
coreml | Device::CoreMl | coreml | Apple Silicon / macOS |
intel:cpu | Device::IntelCpu | openvino | Intel CPU |
intel:gpu | Device::IntelGpu | openvino | Intel GPU |
intel:npu | Device::IntelNpu | openvino | Intel NPU |
directml:0 | Device::DirectMl(0) | directml | Windows GPU |
rocm:0 | Device::Rocm(0) | rocm | AMD GPU |
xnnpack | Device::Xnnpack | xnnpack | 最適化済みCPU |
# Build the CLI with the providers you need
cargo install ultralytics-inference --features cuda,tensorrtGPUアクセラレーションとCUDA前処理#
NVIDIAハードウェアでは、cuda機能によりCUDA実行プロバイダーが有効になり、tensorrtを追加すると、さらなる最適化のためにTensorRTプロバイダーが有効になります。可能な限り低いレイテンシを実現するには、cuda-preprocess機能を使用して前処理をGPU上で実行します。
cuda-preprocessは、レターボックスリサイズ、正規化、HWCからCHWへのレイアウト変換を、単一の融合CUDAカーネルとして実行し、その結果をゼロコピーのデバイステンソルとしてモデルに渡します。生の8ビットフレームは引き続きGPUにアップロードされ、ディスクリートGPUではピン留めされたステージングバッファーを経由します。このカーネルによって省かれるのは、CPUでのリサイズ、正規化、レイアウト変換、および前処理済みテンソルの個別アップロードです。これらの効果は、高スループットのバッチやリアルタイムストリームで特に大きくなります。
# Build with fused GPU preprocessing (implies cuda + tensorrt)
cargo build --release --features cuda-preprocess次の条件をすべて満たす場合、高速パスがAPIの変更なしで自動的に使用されます。機能がビルドに組み込まれていること、デバイスがCUDAまたはTensorRTであること、タスクがdetect、segment、pose、OBB、セマンティックセグメンテーション(単一画像のみ)、または深度推定であること、そしてモデルの入力がFP32であることです。デフォルトで有効になっており、モデルごとに無効化できます:
use ultralytics_inference::{Device, InferenceConfig};
let config = InferenceConfig::new()
.with_device(Device::TensorRt(0))
.with_cuda_preprocess(false); // force CPU preprocessingcuda-preprocessはビルド時に対応するCUDAツールキットを必要とし、実行時には融合前処理カーネルにNVRTCを使用します。バージョン要件とトラブルシューティングについては、CUDAとTensorRTのアクセラレーションガイドを参照してください。
Cargo機能#
機能はビルド時に有効にします。デフォルトでは、アノテーションとライブ表示に対応しています。
| 機能 | デフォルト | 用途 |
|---|---|---|
annotate | はい | ボックス、マスク、キーポイント、ラベルを描画します。--saveに必要です。 |
visualize | はい | --showのリアルタイムウィンドウ表示。 |
video | いいえ | 動画ファイルの読み込みと書き込み(FFmpeg 6~9が必要です)。 |
cuda | いいえ | NVIDIA CUDA実行プロバイダー。 |
tensorrt | いいえ | NVIDIA TensorRT実行プロバイダー。 |
cuda-preprocess | いいえ | GPU融合前処理(cuda、tensorrtを含みます)。 |
coreml | いいえ | Apple CoreML実行プロバイダー。 |
openvino | いいえ | Intel OpenVINO実行プロバイダー。 |
rocm | いいえ | AMD ROCm実行プロバイダー。 |
directml | いいえ | Windows DirectML実行プロバイダー。 |
関連するプロバイダーをまとめた便利なグループ: nvidia(cuda、tensorrt)、amd(rocm、migraphx)、intel(openvino、onednn)、mobile(nnapi、coreml、qnn)、all(annotate、visualize、video)。nnapi、qnn、xnnpack、webgpuなど、ほかのプロバイダーも利用できます。
CLIのインストール時またはライブラリの追加時に機能を有効にします:
cargo install ultralytics-inference --features video
cargo install ultralytics-inference --features cuda,tensorrt[dependencies]
ultralytics-inference = { version = "0.0.50", features = ["video"] }出力と保存#
デフォルトでは、予測結果にアノテーションが付けられ、連番の実行ディレクトリに保存されます:
runs/
└── detect/
└── predict/ # then predict2, predict3, ...
└── image.jpg # annotated resultサブフォルダー名はタスク(runs/segment/、runs/pose/など)に対応します。動画ソースの場合、アノテーション済みの出力は動画ファイルとして書き込まれます。個々のフレームを書き込むには、--save-framesを渡します。semanticタスクでは、--save-jsonにより、ピクセル単位のクラスマップがresults/サブフォルダーにPNGとして書き込まれます。depthタスクでは、色付けされた深度マップがソース画像に重ね合わされ、Ultralytics Pythonのplot()出力と同じ形式になります。アノテーション済み画像と動画の保存にはannotate機能が必要ですが、セマンティッククラスマップのPNGエクスポートには必要ありません。動画の入力と出力にはvideo機能が必要です。
よくある質問#
いいえ。このクレートは、ONNX Runtimeを通じてエクスポート済みのONNXモデルを直接実行します。事前にUltralyticsパッケージでモデルをトレーニングまたはエクスポートする場合にのみ、Pythonが必要です。
Pythonパッケージから、たとえばONNXインテグレーションを使ってエクスポートするか、初回実行時にCLIで選択したタスクに対応する標準nanoモデルをダウンロードできます。
システムに FFmpeg 6~9 がインストールされ、
video機能が有効になっていれば可能です。動画ファイル、ウェブカメラ、RTSP/RTMP/HTTP ストリームに対応しています。どちらもデフォルトで有効になっています。
annotateは画像にボックス、マスク、キーポイント、クラスラベルを描画し、--saveで注釈付きの結果を書き出すために必要です。visualizeは--show用のライブウィンドウを開きます。プログラムから結果を返すだけの小規模なヘッドレスビルドにするには、cargo build --no-default-featuresで無効にしてください(必要に応じて個別の機能を再度有効にできます)。このページでは概要を説明しています。公開されているすべての構造体、メソッド、設定オプションを網羅した、型ごとの完全な API リファレンスは、ソースから直接生成され、docs.rs で公開されています。