drone-studio / README.md
ReNothingg's picture
Drone detection models
85bf5d8
|
Raw History Blame Contribute Delete
13.3 kB
---
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 $.
![Drone Studio: слева рамка детектора на ролике, справа кадр камеры ствола с прицелом](assets/studio_frames.png)
## Какие модели здесь лежат
Обучение шло поэтапно, и каждой версии я дал имя птицы.
| Папка | Модель | Что это |
| --- | --- | --- |
| `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 с видимым, но неразмеченным дроном я убрал, чтобы не учить сеть считать дрон фоном.
![Ход обучения: mAP@0,5 на проверочной выборке по эпохам](assets/training.png)
## Результаты
Модели проверены на 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 | - | готовая чужая |
![Средняя оценка моделей на 3 тестах](assets/models_ranking.png)
Результат Бусла сам по себе удивил: на своём наборе он работает хорошо, а в роликах 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 пикселей, а там, где нашёл, рамка почти всегда шире нужной.
![30 кадров Halmstad: белая рамка - разметка, зелёная - Ястраб (Y), жёлтая - ChatGPT (G), в подписи ширина дрона и IoU](assets/benchmark30_models.png)
На 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 класс «дрон» и не отличает самолётные БПЛА. Цифры выше относятся к указанным тестам и не обещают такой же точности на другой камере.
Установка из работы учебная: она стреляет водяными шариками и не предназначена для применения против людей или чужого имущества.