You’re absolutely right to notice the apparent contradiction between YOLOv10 being “NMS-free” and having an NMS config file in our model zoo. Let me break this down:
The short answer: YOLOv10 can run without NMS, but our current pipeline still includes NMS support for practical reasons.
Here’s what’s happening:
YOLOv10’s “NMS-free” design uses a dual-head training approach - one head for training (one-to-many) and another for inference (one-to-one). When you use the one-to-one head properly, it should give you a single prediction per object, eliminating the need for NMS post-processing.
So why do we still have the NMS config?
Compatibility - Our post-processing pipeline works across all YOLO versions. Keeping NMS support means existing workflows, demos, and evaluation scripts work seamlessly without special cases for v10.
Real-world flexibility - Not every YOLOv10 model you’ll find actually exposes only the one-to-one head. Some exports still produce dense predictions like older YOLO versions, where NMS is still needed.
Practical control - Even with one-to-one heads, teams sometimes want NMS as a safety net for noisy data or when matching legacy performance metrics.
Want to run truly NMS-free?
If you want to try the pure NMS-free approach:
Make sure your YOLOv10 export uses the one-to-one inference head
Remove the nms_postprocess() stage from your .alls pipeline
Handle confidence filtering in your application code instead