Ястраб: детектор дронов с наземной камеры

Это модели из моей исследовательской работы «Автономный перехватчик БПЛА». Камера смотрит в небо, модель находит на кадре квадрокоптер, трекер его ведёт, а пусковая установка наводится и стреляет водяным шариком. Код всего комплекса лежит на GitHub, здесь только веса.

Заметить дрон по картинке трудно: в кадре он часто занимает около 10 пикселей, фон сложный, а птицы и самолёты на него похожи. В прошлом году я обучал свою языковую модель Mind 4 и понял, что универсальную модель в одиночку не построить. Поэтому в этот раз я сделал модель под 1 задачу и проверил, может ли она обойти универсальные решения там, где важна точность. Вся работа сделана на ноутбуке с Apple M5 и арендованном на полтора часа сервере с H100. Итоговые затраты около 45 $.

Drone Studio: слева рамка детектора на ролике, справа кадр камеры ствола с прицелом

Какие модели здесь лежат

Обучение шло поэтапно, и каждой версии я дал имя птицы.

Папка Модель Что это
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 фотографии дронов на разном фоне 5 200 2 600 2 199
Halmstad 285 роликов: дроны, птицы, самолёты, вертолёты 6 295 1 346 1 340
Anti-UAV300 318 роликов, день и ночь 4 377 946 2 147
Дополнение сложные фоны и мелкие дроны, только из train 1 330 - -

Перед обучением я проверил данные. По контрольным суммам нашёлся кадр, который был одновременно и в обучающей, и в тестовой части DUT, и я убрал его из тестов, чтобы модель не полагалась на заученный ответ. В Anti-UAV300 26 съёмочных сессий попали и в обучение, и в проверку, поэтому сессии я разделил заново. Ещё 83 кадра Halmstad с видимым, но неразмеченным дроном я убрал, чтобы не учить сеть считать дрон фоном.

Ход обучения: mAP@0,5 на проверочной выборке по эпохам

Результаты

Модели проверены на 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 тестах

Результат Бусла сам по себе удивил: на своём наборе он работает хорошо, а в роликах 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

На 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) на своей задаче

Как пользоваться

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-сценой, склонируйте репозиторий и выполните npm install и npm run dev. Веса скачаются сами при первом запуске.

Ограничения

Модель проверена на открытых наборах, а не на моих видео с птицами и другими дронами. На незнакомый источник сеть переносится плохо: обученная на DUT и Halmstad, на Anti-UAV300 она нашла лишь 47 % дронов, так что данные нужны под каждую камеру. Модель видит только 1 класс «дрон» и не отличает самолётные БПЛА. Цифры выше относятся к указанным тестам и не обещают такой же точности на другой камере.

Установка из работы учебная: она стреляет водяными шариками и не предназначена для применения против людей или чужого имущества.

Downloads last month
250
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train ReNothingg/drone-studio

Evaluation results