README.md

# YoloFastNMS

A fast Non-Maximum Suppression (NMS) implementation in Rust for YOLO object detection outputs. This library is designed as a companion to the [`yolo`](https://github.com/poeticoding/yolo_elixir) library, specifically optimizing one of the most computationally intensive parts of the YOLO detection pipeline in Elixir/Nx, running much faster (~100x, ~4ms vs ~400ms on my MacBook Air M3)!

The NMS operation is crucial for filtering overlapping bounding boxes in object detection, but is computationally expensive when implemented in Elixir/Nx. This Rust NIF implementation provides significant speed improvements over the pure Elixir version, helping achieve near real-time performance for object detection tasks.

The current version is specifically built around YOLOv8 models trained on the COCO dataset, which outputs tensors in the shape of `{84, 8400}` (4 bounding box coordinates + 80 class probabilities × 8400 detections). The library efficiently filters these detections based on confidence scores `prob_threshold` and Intersection over Union (IoU) `iou_threshold` thresholds. Future development will focus on making the number of classes and detections dynamic, enabling compatibility with different YOLO and custom models.



## Installation

```elixir
def deps do
  [
    {:yolo_fast_nms, "~> 0.1.0"}
  ]
end
```


## Stand-alone usage

```elixir
{84, 8400} = tensor_nx.shape
iex> YoloFastNMS.run(tensor_nx, 0.4, 0.5)
[
  [cx, cy, w, h, prob, class_idx]
  ...
] 
```

## With YOLO library

```elixir
model = YOLO.load(...)

YOLO.detect(mat, nms_fun: &YoloFastNMS.run/3)
```