Object Detection
ultralytics
Russian
yolov8
drone-detection
anti-uav
small-object-detection
Eval Results (legacy)
Instructions to use ReNothingg/drone-studio with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use ReNothingg/drone-studio with ultralytics:
from huggingface_hub import hf_hub_download from ultralytics import YOLO # pick the weights file from this repo's "Files and versions" tab weights = hf_hub_download("ReNothingg/drone-studio", "<weights>.pt") model = YOLO(weights) source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
File size: 13,275 Bytes
85bf5d8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | ---
license: agpl-3.0
language:
- ru
library_name: ultralytics
pipeline_tag: object-detection
tags:
- yolov8
- ultralytics
- object-detection
- drone-detection
- anti-uav
- small-object-detection
datasets:
- GabrieleMagrini/FRED
model-index:
- name: Ястраб
results:
- task:
type: object-detection
dataset:
name: DUT Anti-UAV (test)
type: dut-anti-uav
metrics:
- type: map_50
value: 0.928
- task:
type: object-detection
dataset:
name: Halmstad Drone Dataset (test)
type: halmstad-drone-dataset
metrics:
- type: map_50
value: 0.856
- task:
type: object-detection
dataset:
name: Anti-UAV300 RGB (test)
type: anti-uav300
metrics:
- type: map_50
value: 0.959
---
# Ястраб: детектор дронов с наземной камеры
Это модели из моей исследовательской работы «Автономный перехватчик БПЛА». Камера смотрит в небо, модель находит на кадре квадрокоптер, трекер его ведёт, а пусковая установка наводится и стреляет водяным шариком. Код всего комплекса лежит на [GitHub](https://github.com/ReNothingg/track_drone), здесь только веса.
Заметить дрон по картинке трудно: в кадре он часто занимает около 10 пикселей, фон сложный, а птицы и самолёты на него похожи. В прошлом году я обучал свою языковую модель Mind 4 и понял, что универсальную модель в одиночку не построить. Поэтому в этот раз я сделал модель под 1 задачу и проверил, может ли она обойти универсальные решения там, где важна точность. Вся работа сделана на ноутбуке с Apple M5 и арендованном на полтора часа сервере с H100. Итоговые затраты около 45 $.

## Какие модели здесь лежат
Обучение шло поэтапно, и каждой версии я дал имя птицы.
| Папка | Модель | Что это |
| --- | --- | --- |
| `production/` | Ястраб | основная: YOLOv8s, 11,1 млн параметров, вход 640 px, 13 мс на кадр на M5. Рядом лежат specialist для мелких целей и проверяющая сеть |
| `yastrab/` | Ястраб | та же модель отдельно, с описанием обучения |
| `berkut/` | Беркут | Ястраб, дообученный на входе 960 px. Лучше на DUT, хуже на Halmstad |
| `studio/` | Ястраб-Studio | дообучен на 3 070 кадрах 3D-сцены Drone Studio, для симулятора |
| `observation/` | профиль наблюдения | основная и дообученная модели плюс проверяющая сеть MobileNetV3. Добавлены FRED и сложные фоны Open Images, ложных тревог стало 11 вместо 90 |
Рядом с каждым `.pt` лежит `.json`: контрольная сумма, откалиброванный порог уверенности и результаты на тестах. Порог Ястраба подобран на проверочной выборке по максимуму F1 и равен 0,335.
## Как устроена и как обучалась
Ястраб - свёрточная сеть из 3 частей. Основа сжимает кадр 640 × 640 в карты признаков. Шея соединяет карты 3 масштабов, чтобы мелкий дрон на 16 пикселей и крупный на 100 искались одинаково хорошо. Голова для каждой клетки сеток 80 × 80, 40 × 40 и 20 × 20 предсказывает, есть ли там дрон, и 4 расстояния до сторон рамки. Пересекающиеся рамки одной цели убирает NMS при IoU 0,55.
Ястраба я учил на сервере с H100 1,5 часа: 40 эпох на 21 071 кадре из 3 наборов. Среди них 3 869 кадров, на которые я вклеил вырезанных дронов шириной 7-40 px, чтобы сеть насмотрелась на мелкие цели. Чтобы сеть не заучила кадры, каждый при обучении случайно меняется: склейка 4 кадров в 1, сдвиг цвета и яркости, поворот, масштаб, отражение.
| Набор | Что внутри | Обучение | Проверка | Тест |
| --- | --- | ---: | ---: | ---: |
| [DUT Anti-UAV](https://github.com/wangdongdut/DUT-Anti-UAV) | фотографии дронов на разном фоне | 5 200 | 2 600 | 2 199 |
| [Halmstad](https://github.com/DroneDetectionThesis/Drone-detection-dataset) | 285 роликов: дроны, птицы, самолёты, вертолёты | 6 295 | 1 346 | 1 340 |
| [Anti-UAV300](https://github.com/ZhaoJ9014/Anti-UAV) | 318 роликов, день и ночь | 4 377 | 946 | 2 147 |
| Дополнение | сложные фоны и мелкие дроны, только из train | 1 330 | - | - |
Перед обучением я проверил данные. По контрольным суммам нашёлся кадр, который был одновременно и в обучающей, и в тестовой части DUT, и я убрал его из тестов, чтобы модель не полагалась на заученный ответ. В Anti-UAV300 26 съёмочных сессий попали и в обучение, и в проверку, поэтому сессии я разделил заново. Ещё 83 кадра Halmstad с видимым, но неразмеченным дроном я убрал, чтобы не учить сеть считать дрон фоном.

## Результаты
Модели проверены на 3 тестах из кадров, которых они не видели при обучении. mAP@0,5 от 0 до 1, где 1 - все дроны найдены без ложных тревог. Время кадра замерено на M5.
| Модель | DUT | Halmstad | Anti-UAV300 | Среднее | мс | Вывод |
| --- | ---: | ---: | ---: | ---: | ---: | --- |
| Бусел | 0,899 | 0,011 | 0,822 | 0,577 | 8 | слепа на Halmstad |
| Сокал | 0,888 | 0,839 | 0,971 | 0,899 | 8 | прежняя основная |
| Арол | 0,930 | 0,807 | 0,959 | 0,899 | 17 | ложные тревоги |
| **Ястраб** | **0,928** | **0,856** | **0,959** | **0,914** | **13** | **основная, лучшая** |
| Беркут | 0,944 | 0,783 | 0,952 | 0,893 | 25 | хуже на Halmstad |
| drone-yolov8 | 0,242 | 0,012 | 0,476 | 0,243 | - | готовая чужая |
| flying-objects | 0,148 | 0,007 | 0,071 | 0,075 | - | готовая чужая |

Результат Бусла сам по себе удивил: на своём наборе он работает хорошо, а в роликах Halmstad почти не находит дроны, ведь съёмка, фон и размер целей там другие. Бусел учился 15 эпох, Сокал только 5, но на роликах нужного типа, и выиграл. Отсюда главный вывод: данные нужного типа съёмки важнее, чем долгое обучение на 1 наборе.
Ради интереса я прогнал и варианты потяжелее: YOLOv8m и сеть с головой P2 на 1280 пикселях. На DUT они дали 0,946 и 0,963, а на Halmstad 0,808 и 0,774. Не помогла и добавка 48 тыс. чужих кадров из 23 открытых наборов: на Halmstad минус 5 пунктов. Вывод вышел сам собой: чем больше сеть, вход или чужих данных, тем лучше DUT и хуже Halmstad. Поэтому основным я оставил Ястраба. 2 готовые открытые модели с Hugging Face на тех же тестах мелкие дроны не видят вовсе.
## Против универсальных нейросетей
Я взял 30 кадров из отложенной выборки Halmstad, где дрон часто меньше 20 пикселей, и дал их моей модели и ChatGPT. Каждой сети кадры даны по одному, без инструментов, одним и тем же вопросом. Рамка засчитывается, если её перекрытие с разметкой (IoU) не меньше 0,5.
| Модель | Найдено из 30 | Точных рамок | Средний IoU |
| --- | ---: | ---: | ---: |
| Ястраб, 640 px | 30 | 26 | 0,66 |
| Арол, 960 px | 28 | 26 | 0,72 |
| ChatGPT 6 Instant | 20 | 2 | 0,32 |
ChatGPT пропустил все 10 дронов уже 20 пикселей, а там, где нашёл, рамка почти всегда шире нужной.

На 3 кадрах с дроном 76, 31 и 16 пикселей я сравнил ещё Gemini 5.3 Flash Lite и Grok. Когда дрон виден явно или слабо, универсальные сети его находят. А на кадре с дроном в 16 пикселей все 3 ставят рамку мимо или заметно меньше дрона. Ястраб и Арол находят все 3.
И для интереса 2 мои модели за 2 года:
| | Mind 4, 2025 | Ястраб, 2026 |
| --- | --- | --- |
| Задача | универсальная языковая модель | 1 класс «дрон» на кадре |
| Архитектура | Transformer, 36 слоёв, 128 экспертов | YOLOv8s, 11,1 млн параметров |
| Данные | 650 млн токенов из интернета без фильтрации | 21 071 кадр из 3 наборов, вычищенных вручную |
| Железо | Google Colab, A100 | ноутбук M5 и 1,5 ч H100, 45 $ |
| Итог на тесте | TruthfulQA около 30 %, галлюцинации | mAP@0,5 = 0,914, 26 точных рамок из 30 |
| Против лучших | хуже GPT-2 (2019) | лучше ChatGPT (2026) на своей задаче |
## Как пользоваться
```python
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
weights = hf_hub_download("ReNothingg/drone-studio", "production/best.pt")
model = YOLO(weights)
result = model.predict("frame.jpg", imgsz=640, conf=0.335)[0]
print(result.boxes.xyxy, result.boxes.conf)
```
Чтобы скачать все модели сразу и запустить Drone Studio с трекером и 3D-сценой, склонируйте [репозиторий](https://github.com/ReNothingg/track_drone) и выполните `npm install` и `npm run dev`. Веса скачаются сами при первом запуске.
## Ограничения
Модель проверена на открытых наборах, а не на моих видео с птицами и другими дронами. На незнакомый источник сеть переносится плохо: обученная на DUT и Halmstad, на Anti-UAV300 она нашла лишь 47 % дронов, так что данные нужны под каждую камеру. Модель видит только 1 класс «дрон» и не отличает самолётные БПЛА. Цифры выше относятся к указанным тестам и не обещают такой же точности на другой камере.
Установка из работы учебная: она стреляет водяными шариками и не предназначена для применения против людей или чужого имущества.
|