Inference¶
This guide covers running inference with trained models.
Quick Start¶
Run inference on a single image:
from visdet.apis import inference_detector, init_detector
config_file = "configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py"
checkpoint_file = "checkpoints/faster_rcnn_r50_fpn_1x_coco.pth"
# Build the model from config and checkpoint
model = init_detector(config_file, checkpoint_file, device="cuda:0")
# Run inference on an image
result = inference_detector(model, "demo/demo.jpg")
Visualization¶
Save results to file:
from visdet.cv import imread
from visdet.visualization import DetLocalVisualizer
# DetLocalVisualizer expects RGB images
image = imread("demo/demo.jpg", channel_order="rgb")
visualizer = DetLocalVisualizer()
visualizer.dataset_meta = model.dataset_meta
visualizer.add_datasample(
"result",
image,
data_sample=result,
draw_gt=False,
out_file="result.jpg",
pred_score_thr=0.3,
)
Batch Inference¶
Process multiple images:
import glob
from visdet.apis import inference_detector
# Get all images in a directory
image_files = glob.glob("path/to/images/*.jpg")
# Run as a batch for better performance
results = inference_detector(model, image_files)
results is a list of DetDataSample objects (one per input image).
Multi-GPU Inference¶
To run inference on multiple GPUs in a single process, pass multiple CUDA devices to init_detector and then infer a batch (a list) of images:
from visdet.apis import inference_detector, init_detector
model = init_detector(config_file, checkpoint_file, device="cuda:0,1")
results = inference_detector(model, image_files) # list[DetDataSample]
FiftyOne (Voxel51) Dataset¶
If you use FiftyOne for dataset management and visualization, you can run visdet inference over a fiftyone.Dataset and attach the predictions back onto each sample.
import fiftyone as fo
from visdet.apis import inference_detector, init_detector
from visdet.utils import detections_to_fiftyone
# 1) Load your model
config_file = "configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py"
checkpoint_file = "checkpoints/faster_rcnn_r50_fpn_1x_coco.pth"
model = init_detector(config_file, checkpoint_file, device="cuda:0")
# 2) Create (or load) a FiftyOne dataset
# You can also do: dataset = fo.load_dataset("my-dataset")
dataset = fo.Dataset.from_images_dir(
"path/to/images",
name="my-images",
overwrite=True,
)
dataset.compute_metadata() # populates sample.metadata.width/height
classes = model.dataset_meta.get("classes", [])
score_thr = 0.3
# 3) Run streaming batched inference and attach detections
# (Batching is important for performance, and required for multi-GPU inference)
import itertools
batch_size = 8
sample_iter = dataset.iter_samples(progress=True)
while True:
sample_batch = list(itertools.islice(sample_iter, batch_size))
if not sample_batch:
break
data_samples = inference_detector(model, [s.filepath for s in sample_batch])
for sample, data_sample in zip(sample_batch, data_samples, strict=True):
pred = data_sample.pred_instances
pred = pred[pred.scores > score_thr]
width = sample.metadata.width
height = sample.metadata.height
dets = []
for bbox, label_id, score in zip(
pred.bboxes.cpu().numpy(),
pred.labels.cpu().numpy(),
pred.scores.cpu().numpy(),
strict=True,
):
x1, y1, x2, y2 = bbox.tolist()
dets.append(
{
"label": classes[int(label_id)] if classes else str(int(label_id)),
"bounding_box": [
x1 / width,
y1 / height,
(x2 - x1) / width,
(y2 - y1) / height,
],
"confidence": float(score),
}
)
sample["predictions"] = detections_to_fiftyone(dets)
sample.save()
# 4) Visualize in the FiftyOne App
session = fo.launch_app(dataset)
session.wait()
Test Dataset¶
Evaluate model on a test dataset:
With multiple GPUs:
Advanced Usage¶
Custom Inference Pipeline¶
Create a custom inference pipeline:
from visdet.apis import inference_detector, init_detector
from visdet.engine.config import Config
# Load config
cfg = Config.fromfile("config.py")
# Modify config if needed
cfg.model.test_cfg.score_thr = 0.5
# Initialize model
model = init_detector(cfg, "checkpoint.pth", device="cuda:0")
# Run inference
result = inference_detector(model, "image.jpg")
Async Inference¶
For high-throughput scenarios:
import asyncio
from visdet.apis import init_detector
from visdet.apis.inference import async_inference_detector
async def async_process():
model = init_detector(config_file, checkpoint_file, device="cuda:0")
tasks = [async_inference_detector(model, img) for img in images]
results = await asyncio.gather(*tasks)
return results
Export Models¶
ONNX Export¶
Export model to ONNX format:
TensorRT¶
Convert to TensorRT for optimized inference: