How to Export RF-DETR Model to ONNX Format
RF-DETR provides a dedicated export pipeline that converts PyTorch inference graphs into portable ONNX models using the export_onnx function in src/rfdetr/export/_onnx/exporter.py.
Exporting an RF-DETR model to ONNX format enables deployment across diverse hardware platforms and inference engines. The Roboflow RF-DETR repository ships with a complete export toolkit that handles graph tracing, optimization, and metadata embedding. This guide covers both programmatic Python API usage and command-line workflows for generating production-ready ONNX files.
Prerequisites and Installation
ONNX export functionality is packaged as an optional extra to keep the base installation lightweight. Install the required dependencies using the [onnx] specifier:
pip install "rfdetr[onnx]"
This command pulls in onnx, onnx-graphsurgeon, and polygraphy, enabling automatic graph simplification and constant-folding optimizations during export.
Understanding the ONNX Export Architecture
The core export logic resides in src/rfdetr/export/_onnx/exporter.py, specifically within the export_onnx function (lines 61-73). This wrapper around torch.onnx.export manages the full conversion pipeline:
- Tracing the PyTorch model using dummy input tensors
- Writing the raw ONNX graph to disk
- Optimizing via shape-inference and graph-surgeon (when extras are installed)
- Embedding metadata under the
rfdetr_notesfield
For custom operator handling, the system references src/rfdetr/export/_onnx/symbolic.py, which registers RF-DETR-specific symbolic definitions required for ONNX compatibility.
Method 1: Programmatic Export (Python API)
For integration into training workflows or custom deployment pipelines, use the Python API directly.
Loading the Pretrained Model
First, instantiate the desired RF-DETR variant and set it to evaluation mode:
from rfdetr import get_model
model = get_model("rfdetr-small", pretrained=True).eval()
Available variants include rfdetr-small, rfdetr-medium, and other configurations supported by the repository.
Preparing Dummy Input Tensors
Create a tensor matching the model's training resolution for tracing purposes. This tensor is not embedded in the final graph but guides the export process:
import torch
dummy_input = torch.randn(1, 3, 640, 640) # batch=1, channels=3, height=640, width=640
Executing the Export
Call export_onnx with explicit parameter configuration:
from rfdetr.export._onnx.exporter import export_onnx
export_onnx(
output_dir="onnx_models",
model=model,
input_names=["images"],
input_tensors=[dummy_input],
output_names=["boxes", "scores", "labels"],
dynamic_axes={
"images": {0: "batch"},
"boxes": {0: "batch"},
"scores": {0: "batch"},
"labels": {0: "batch"},
},
backbone_only=False,
opset_version=17,
variant_name="rfdetr-small",
)
Key parameters:
output_dir: Destination directory for the.onnxfileinput_tensors: List of example tensors for tracingdynamic_axes: Dictionary mapping input/output names to dynamic dimension indices (commonly used for variable batch sizes)backbone_only: Boolean flag; set toTrueto export only the feature extractor,Falsefor the full detection headopset_version: ONNX opset version (default is 17)variant_name: Determines the output filename ({variant_name}.onnx)
Method 2: Command-Line Interface
For automation and CI/CD pipelines, use the CLI entry point in src/rfdetr/export/main.py:
python -m rfdetr.export.main \
--model rfdetr-small \
--output-dir ./onnx_models \
--input-size 640 \
--dynamic-axes \
--opset 17
CLI-to-API mapping:
--modelmaps tovariant_name(model identifier to load)--output-dirmaps tooutput_dir--input-sizegenerates the dummy tensortorch.randn(1, 3, <size>, <size>)--dynamic-axesenables batch-dimension flexibility--opsetsets theopset_version
Customizing the ONNX Graph
Dynamic Axes for Batch Processing
To support variable batch sizes in production environments, configure the dynamic_axes parameter. This prevents the ONNX exporter from hardcoding the batch dimension to 1:
dynamic_axes={
"images": {0: "batch_size"},
"boxes": {0: "batch_size"},
"scores": {0: "batch_size"},
"labels": {0: "batch_size"},
}
Opset Versions and Optimizations
The default opset_version=17 provides broad compatibility with modern inference engines. When the [onnx] extras are installed, the exporter automatically applies graph optimizations including:
- Shape inference: Propagates tensor dimensions through the graph
- Constant folding: Pre-computes static sub-graphs at export time
- Graph surgeon optimizations: Simplifies redundant operations via
onnx-graphsurgeon
Key Source Files Reference
| File | Purpose |
|---|---|
src/rfdetr/export/_onnx/exporter.py |
Contains the main export_onnx implementation (lines 61-73) |
src/rfdetr/export/_onnx/symbolic.py |
Registry for custom ONNX symbolic definitions |
src/rfdetr/export/main.py |
CLI entry point that wraps the Python API |
src/rfdetr/export/_backend.py |
Shared utilities across export backends (ONNX, TensorRT, etc.) |
Summary
- Install extras: Use
pip install "rfdetr[onnx]"to obtain optimization libraries - Use
export_onnx: Located insrc/rfdetr/export/_onnx/exporter.py, this function handles the full conversion pipeline - Provide dummy inputs: Create tensors matching your target resolution (e.g.,
640×640) for accurate tracing - Enable dynamic axes: Map batch dimensions to handle variable input sizes in deployment
- Choose CLI or Python: Use
python -m rfdetr.export.mainfor automation orexport_onnx()for programmatic integration
Frequently Asked Questions
What dependencies are required for ONNX export?
ONNX export requires the optional [onnx] extra, which installs onnx, onnx-graphsurgeon, and polygraphy. Without these, basic export works but graph optimizations and metadata embedding are disabled. Install via pip install "rfdetr[onnx]".
Can I export only the backbone without the detection head?
Yes. Set the backbone_only=True parameter in export_onnx or use the --backbone-only flag in the CLI. This produces a smaller model suitable for feature extraction workflows rather than end-to-end object detection.
How do I enable dynamic batch sizes in the exported model?
Pass the dynamic_axes dictionary mapping input and output names to their batch dimension indices. For example, map "images" to {0: "batch"} to allow variable batch sizes at inference time. This is also accessible via the --dynamic-axes CLI flag.
What ONNX opset version should I use for RF-DETR?
The repository defaults to opset version 17, which balances feature support with runtime compatibility. Specify opset_version=17 (or your target version) in the Python API, or use --opset 17 via CLI. Lower versions may lack support for certain transformer operations used in RF-DETR.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →