Сегодня хочу рассказать вам о библиотеке yolo_detector — простой, удобной и производительной обёртке для использования моделей компьютерного зрения YOLO на языке Rust.

Я создал эту библиотеку, потому что мне не хватало нативного и удобного инструмента для распознавания объектов прямо из кода на Rust — без связки с Python, без танцев с OpenCV, без лишней боли.

Целью было сделать максимально простую в использовании библиотеку, которая:

  • легко интегрируется в любой Rust-проект;

  • поддерживает ONNX-модели YOLO (v4 и выше);

  • быстро работает даже на слабых машинах;

  • имеет чистую архитектуру и читаемый код.

  • поддержку всех основных типов моделей YOLO:

    • Detection — стандартное распознавание объектов

    • Weights — загрузка весов в разных форматах

    • OBB (Oriented Bounding Boxes) — поддержка наклонных прямоугольников

    • Classification — определение класса объекта

    • Pose — позы человека, скелетная модель

    • Segmentation — маски объектов и выделение контуров

Сейчас yolo_detector — это полностью готовый open-source проект с реализованным roadmap’ом, активным использованием и понятным API.


Возможности yolo_detector

  • Полностью написана на чистом Rust — без зависимостей на C, C++ или Python.

  • Поддержка CPU-режима и ускорение на NVIDIA GPU через CUDA — высокая производительность при детектировании объектов.

  • Удобный API — простая интеграция в любые проекты на Rust.

  • Полностью open-source — доступен на GitHub, можно использовать, дополнять и адаптировать под свои задачи


Почему я создал yolo_detector

Когда я начал работать с задачами компьютерного зрения на Rust, я столкнулся с рядом проблем в существующих библиотеках:

  • Слабая документация — многие проекты почти не имеют комментариев или пояснений. Пользоваться ими неудобно, особенно новичкам.

  • Поддержка только стандартных моделей YOLO (Detection) — практически никто не реализует поддержку Pose, Segmentation, OBB и других расширенных типов моделей.

  • Сложный и перегруженный код — в большинстве библиотек сложно разобраться даже в базовой логике. Отсутствует модульность и структура.

  • Часто зависят от C/C++ или Python — тянут за собой дополнительные зависимости, ухудшают кросс-платформенность и увеличивают время сборки.

Что делает yolo_detector по-другому

Я решил создать чистую, лаконичную и мощную реализацию, написанную полностью на Rust, чтобы:

  • обеспечить понятную и структурированную архитектуру, с которой легко работать;

  • покрыть все типы моделей YOLO: Detection, Weights, OBB, Classification, Pose и Segmentation;

  • использовать ONNX и давать выбор между CPU и CUDA (NVIDIA) для ускорения;

Скрытый текст

ONNX (Open Neural Network Exchange) — это открытый формат для представления нейронных сетей, разработанный компаниями Microsoft и Facebook (ныне Meta) для обмена и совместимости моделей между разными фреймворками машинного обучения, такими как PyTorch, TensorFlow, scikit-learn и другими.


Установка и пример использования

Для начала работы с yolo_detector достаточно добавить зависимость в ваш Cargo.toml:

yolo_detector = "1.0.0"
opencv = "0.94.4"

Актуальную версию всегда можно найти на crates.io: ? crates.io/yolo_detector

Простой пример использования

Для получения готового изображения:

use opencv::{highgui, imgcodecs};
use yolo_detector::YoloDetector;

fn main() -> opencv::Result<()> {
    let detector = YoloDetector::new("yolov8m.onnx", "coco.names", 640).unwrap();

    let mat = imgcodecs::imread("image.jpg", imgcodecs::IMREAD_COLOR)?;

    let (detections, original_size) = detector.detect(&mat.clone())?;

    let result = detector.draw_detections(mat.clone(), detections, 0.5, 0.5, original_size)?;

    highgui::imshow("YOLOv8 Image", &result)?;
    highgui::wait_key(0)?;

    Ok(())
}

Для получение чистых данных:

use yolo_detector::YoloDetector;
use opencv::imgcodecs;

fn main() -> opencv::Result<()> {
    let detector = YoloDetector::new("yolov8m.onnx", "coco.names", 640).unwrap();

    let mat = imgcodecs::imread("image.jpg", imgcodecs::IMREAD_COLOR)?;

    let (detections, original_size) = detector.detect(&mat.clone())?;

    let detections_with_classes =
        detector.get_detections_with_classes(detections, 0.5, 0.5, original_size);

    for (class_name, rect) in detections_with_classes {
        println!("Class: {}, Position: {:?}", class_name, rect);
    }

    Ok(())

//returns values
//Class: person, Position: Rect_ { x: 74, y: 875, width: 41, height: 112 }
//Class: car, Position: Rect_ { x: 184, y: 899, width: 499, height: 141 }
}

Если доступна NVIDIA CUDA — библиотека использует GPU по умолчанию для максимально быстрого детектирования объектов.

Если GPU не обнаружено — плавно переключается на CPU-режим, сохраняя функциональность без дополнительных настроек.

Больше примеров кода есть в README файле проекта.


Формат выходных данных разных моделей YOLO

Библиотека yolo_detector поддерживает все основные типы моделей YOLO, каждая из которых возвращает массив данных в своём формате. Ниже приведены основные структуры выходных тензоров:

YOLO Detection (обнаружение объектов)

  • Форма выхода: [1, 84, 8400]

  • 84 признака: x, y, w, h, objectness_score + 80 классов с вероятностью

  • 8400 — количество ячеек (анкорбоксов) для анализа

Это стандартный формат для YOLOv5/v8 с 80 классами (COCO dataset).

YOLO OBB (Oriented Bounding Box — наклонные рамки)

  • Форма выхода: [1, 20, 8400]

  • 20 признаков: x, y, w, h, 15 классов с вероятностью, угол в радианах

Используется, когда объекты имеют ориентацию (например, текст или спутниковые изображения).

YOLO Classification

  • Форма выхода: [1, 1000]

  • 1000 значений: массив вида [class, probability]

Это простая классификация изображений — один класс на всё изображение, как в ImageNet.

YOLO Pose (определение позы человека)

Модель для определения позы возвращает данные в виде трёхмерного массива с размерностью [1, 56, 8400].

  • Число 8400 — это количество возможных предсказаний (ячеек).

  • Число 56 — это количество признаков для каждого предсказания.

Из этих 56 признаков:

  • Первые 5 описывают прямоугольник вокруг объекта: координаты центра (x, y), ширина (w), высота (h) и вероятность наличия объекта.

  • Остальные признаки — это данные по ключевым точкам тела (например, плечи, локти, колени). Для каждой ключевой точки есть три значения: координаты x и y и уверенность (насколько модель точно определила эту точку).

Всего ключевых точек 17 (получается из расчёта: (56 - 5) / 3).

YOLO Segmentation (сегментация объектов)

Форматы выходных данных

Модель возвращает два тензора с такими формами:

  • Shape0: [1, 116, 8400] — предсказания объектов

  • Shape1: [1, 32, 160, 160] — прототипы масок

Структура данных

Данные

Размерность

Содержание и назначение

detections

[8400, 116]

Каждый из 8400 предсказаний — вектор из 116 признаков:

- bbox: 4 числа (x-центр, y-центр, ширина, высота) — нормализованы

- class scores: 80 чисел — вероятности классов (например, COCO dataset)

- mask coefficients: 32 числа — веса для прототипов масок

mask_protos

[32, 25600]

32 прототипа масок размером 160x160, сплющенных в вектор


Производительность

Тест был запущен на Raspberry pi 4 8GB.
Была запущенна модель Yolov8m Detection

Результаты тестирования:

  • Rust 3.766 секунд

  • Python 12.386 секунд

Rust-реализация детектора работает примерно в 3.3 раза быстрее чем Python-версия.


Вывод

Библиотека yolo_detector показывает, что работать с моделями YOLO на Rust можно просто, быстро и удобно. Поддержка разных типов моделей и нативная реализация без лишних зависимостей делают её отличным выбором для проектов на Rust.

Тесты показали, что Rust-версия работает в несколько раз быстрее, чем Python.

Если вы хотите попробовать или использовать YOLO на Rust — yolo_detector вам поможет.

GitHub проекта: https://github.com/Elieren/yolo_detector

Комментарии (0)