Глава 9. Обучение нейросети
1. Цель занятия и обзор плана
На этом занятии мы научимся дообучать нейросеть YOLO для детекции объектов в симуляторе катамарана. Вы пройдёте полный цикл: от сбора данных и разметки датасета до обучения модели и проверки результатов.
После завершения занятия вы сможете:
-
объяснить, почему нейросети предпочтительнее цветовой сегментации в сложных условиях;
-
собирать данные для обучения из симулятора;
-
размечать датасет в Roboflow;
-
понимать, что такое дообучение (fine-tuning) и почему оно работает;
-
настраивать параметры обучения (batch, epoch);
-
дообучать модель YOLO на своих данных и проверять результат.
2. Теоретический материал
2.1. Зачем использовать нейросети
На прошлых занятиях мы работали с цветовой сегментацией. В симуляторе она работает неплохо, но вспомните её ограничения:
-
Человек в одежде подходящего цвета. Во время испытаний мимо может пройти человек в жёлтой футболке — и алгоритм примет его за буй. Пришлось бы добавлять дополнительные проверки: по форме, по размеру, по положению в кадре. Код усложняется, но проблема до конца не решается.
-
Смена освещения. Если робота настраивали утром, а испытания проходят днём — пороги HSV перестают работать. Или начинается закат, и каждую минуту становится всё темнее. Можно пытаться корректировать цвета, динамически подстраивать пороги — но это путь к бесконечному усложнению кода.
-
Тени и блики. Часть буя, которая в тени, приобретает совсем другой оттенок. Цветовая сегментация может «потерять» половину объекта.
Для решения этих проблем классическими методами потребовалось бы сильно усложнять код — добавлять дополнительные проверки, корректировки, специальные случаи. Это в теории уменьшает ошибки, но на практике невозможно отладить код для всех возможных сценариев.
YOLO использует контекстные признаки и геометрию объектов. Она «видит» не просто цвет пикселя, а текстуры, границы, формы и контекст. Поэтому YOLO стабильно работает даже при изменении освещения, смене фона и наличии помех.
2.2. Преимущества нейросетей
-
Устойчивость к вариациям освещения, фона и ракурса.
-
Обобщающая способность — модель распознаёт объекты в условиях, которых не было в обучающей выборке.
-
Работа с абстрактными признаками — нейросеть улавливает неочевидные закономерности, которые сложно формализовать вручную.
-
Единый процесс — данные на входе, результат на выходе, без ручной настройки порогов.
2.3. Недостатки нейросетей
-
Требовательность к ресурсам — для работы в реальном времени нужны существенные вычислительные мощности (желательно GPU).
-
Зависимость от данных — качество напрямую зависит от объёма и разнообразия обучающей выборки. Чем больше качественных данных вы соберёте — тем лучше будет работать модель.
-
Трудоёмкость разметки — создание размеченных датасетов требует ручной работы.
-
«Галлюцинации» — нейросеть может «видеть» объекты там, где их нет. Это нужно понимать и отлавливать (например, через порог уверенности).
-
Переобучение — модель может запомнить артефакты обучающих данных вместо общих закономерностей.
Важно: применение нейросетей выдвигает дополнительные требования к компьютеру — как к компьютеру робота, так и к компьютеру разработчика. Обучение на CPU занимает около часа, на GPU — около 5 минут. Инференс (работа обученной модели) тоже значительно быстрее на GPU.
2.4. Что такое YOLO
YOLO (You Only Look Once) — архитектура нейросети для детекции объектов в реальном времени. Название отражает ключевую идею: модель обрабатывает изображение за один проход (one look), а не сканирует его поэлементно, что обеспечивает высокую скорость.
Мы используем реализацию от Ultralytics — это компания и open-source-платформа, которая упрощает обучение и применение YOLO.
Простейший пример использования:
from ultralytics import YOLO
model = YOLO("/path/to/model.pt")
results = model.predict(frame, verbose=False)
annotated_frame = results[0].plot() # кадр с нарисованными рамками и метками
Три строчки — и вы получаете кадр с выделенными объектами. Подробнее про работу с результатами — на следующем занятии.
2.5. Что такое дообучение (fine-tuning)
Дообучение — процесс дополнительного обучения уже предобученной модели на специфическом наборе данных. Базовая модель YOLO обучена на огромном датасете COCO (сотни тысяч изображений, 80 классов обычных объектов) и уже умеет выделять общие признаки: границы, текстуры, формы. Дообучение адаптирует её под наши конкретные объекты: буи, маркеры, ворота.
Преимущества дообучения:
-
Экономия ресурсов — не нужно обучать с нуля (обучение YOLO с нуля заняло бы дни на мощном GPU).
-
Работа с малыми данными — модель уже знает базовые признаки, ей нужно лишь «доучить» специфику.
-
Специализация — модель адаптируется под узкую задачу и работает на ней лучше, чем универсальная.
3. Практическое занятие
3.1. Подготовка рабочего места
Установите пакет Ultralytics:
$ pip3 install ultralytics --break-system-packages
Для ускорения обучения установите CUDA (только для видеокарт NVIDIA).
Зарегистрируйтесь на Roboflow — сервис для разметки данных и подготовки датасетов. Сайт может долго грузиться — это нормально.
Склонируйте репозиторий:
$ cd ~/ros2_ws/src
$ git clone http://sdb.smtu.ru/gitlab/marinerobotics/lesson_09.git
$ cd ..
$ colcon build --symlink-install
3.2. Сбор данных
Данные для обучения — это фотографии из симулятора. Нам нужно собрать изображения всех объектов, которые будет детектировать нейросеть.
Необходимые классы:
-
жёлтый буй (yellow buoy)
-
красный буй (red buoy)
-
красный треугольник (red triangle)
-
жёлтый круг (yellow circle)
-
зелёный квадрат (green square)
Требования к данным:
-
Часть данных должна быть пустой (кадры без объектов). Это нужно, чтобы модель научилась не видеть объекты там, где их нет.
-
Баланс классов — примерно одинаковое количество объектов каждого класса. Если одного класса в 10 раз больше, модель будет хуже детектировать остальные.
-
Разные ракурсы и дистанции — снимайте объекты издалека и вблизи, слева и справа, сверху и снизу. Чем разнообразнее — тем лучше.
-
Для симулятора рекомендуется 10–20 размеченных объектов на каждый класс.
Запустите сцену сбора данных:
$ ros2 launch lesson_09 main.launch.py lesson_num:=2
Управляйте катамараном, подъезжайте к объектам с разных сторон и нажимайте пробел для сохранения кадра.
3.3. Создание датасета в Roboflow
Последовательность действий (порядок важен!):
-
Разметка данных — обведите объекты рамками и назначьте классы.
-
Распределение между train/valid/test выборками.
-
Аугментация — автоматическое расширение датасета.
Внимание: если сначала аугментировать весь датасет, а потом делить на выборки, похожие варианты одного изображения могут попасть в разные выборки. Модель будет «помнить» аугментированные варианты из train и показывать нереально хорошие метрики на valid. Это ложный результат. Поэтому сначала делим, потом аугментируем.
Выборки
-
Train (обучающая) — основные данные для обучения. На этих примерах модель напрямую «учится», подстраивая свои внутренние параметры (веса).
-
Valid (валидационная) — «тренировочный полигон» во время обучения. На этих данных, которые модель не видела во время прямого обучения, проверяют её промежуточную производительность. По ним настраивают гиперпараметры.
-
Test (контрольная) — «выпускной экзамен». Полностью изолированный набор, который используется только один раз в самом конце, после фиксации всех параметров.
Пошаговая инструкция
-
Создайте проект:
+ New Project, Project Name:course_2025, Project type:Object Detection, Visibility:Public. НажмитеCreate Public Project. Откажитесь от синхронизации аннотаций. -
Загрузите данные: вкладка
Upload Data→Select Folder→ выберите папку с фотографиями → в качестве исполнителя выберитеLabel Myself. -
Разметьте данные: вкладка
Annotate→Start Annotating. Используйте инструментBounding box(второй сверху) для обведения объектов. Для пустых кадров —Null Tool(нижний инструмент). Следите за единообразием: решите заранее, размечаете ли вы подводную часть буя или нет, и придерживайтесь одного стиля. -
Создайте версию: вкладка
Versions→ Preprocessing:Auto-Orient,Resize 640x480→ Augmentation: выберите несколько эффектов → Create3x(датасет увеличится в 3 раза за счёт аугментации). -
Скачайте датасет:
Download dataset→ Format:YOLOv11→Download zip to computer.
3.4. Обучение нейросети
Основные параметры
-
Batch (пакет) — порция данных, обрабатываемая за один шаг перед обновлением весов. Больше batch — больше потребление оперативной памяти, но стабильнее обучение.
-
Epoch (эпоха) — один полный проход всей обучающей выборки через нейросеть. Чем больше эпох — тем дольше обучение.
Оптимальное количество эпох для дообучения YOLO: 50–200.
-
Слишком много эпох — переобучение (overfitting): модель выучила шумы и особенности обучающих данных, а не общие закономерности. На train метрики отличные, на valid — плохие.
-
Слишком мало эпох — недообучение (underfitting): модель не смогла выучить даже закономерности обучающих данных. Метрики плохие везде.
Запуск обучения
Распакуйте скачанный датасет в ~/ros2_ws/src/lesson_09/etc/train_yolo и запустите:
$ cd ~/ros2_ws/src/lesson_09/etc/train_yolo
$ python3 train.py
Для первого запуска нужен интернет — загрузится базовая модель COCO. Обучение на CPU занимает около часа, на GPU — около 5 минут.
Результат — файл *.pt (дообученная модель), который будет сохранён в ros2_ws/src/lesson_09/config/my_model.pt.
3.5. Проверка результатов
Запустите сцену соревнования и проверьте работу вашей модели:
$ ros2 launch lesson_09 main.launch.py lesson_num:=5
В RQT откройте топик yolo_debug — вы увидите кадр с нарисованными рамками и метками. Походите по сцене и убедитесь, что модель корректно распознаёт объекты.
Если результат вас не устраивает — вернитесь к сбору данных. Добавьте больше разнообразных изображений, особенно для тех классов, которые распознаются плохо. Переразметьте и переобучите. Итеративный процесс — это нормально.
4. Домашнее задание
-
Соберите датасет из симулятора (не менее 10 изображений на класс).
-
Разметьте данные в Roboflow и создайте аугментированную версию (3x).
-
Дообучите YOLO и проверьте результат на сцене соревнования.
-
Убедитесь, что модель корректно распознаёт все 5 классов объектов.