--- 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 класс «дрон» и не отличает самолётные БПЛА. Цифры выше относятся к указанным тестам и не обещают такой же точности на другой камере. Установка из работы учебная: она стреляет водяными шариками и не предназначена для применения против людей или чужого имущества.