Глава 9. Обучение нейросети

1. Цель занятия и обзор плана

На этом занятии мы научимся дообучать нейросеть YOLO для детекции объектов в симуляторе катамарана. Вы пройдёте полный цикл: от сбора данных и разметки датасета до обучения модели и проверки результатов.

После завершения занятия вы сможете:

  • объяснить, почему нейросети предпочтительнее цветовой сегментации в сложных условиях;

  • собирать данные для обучения из симулятора;

  • размечать датасет в Roboflow;

  • понимать, что такое дообучение (fine-tuning) и почему оно работает;

  • настраивать параметры обучения (batch, epoch);

  • дообучать модель YOLO на своих данных и проверять результат.

1.1. Обзор плана занятия

  1. Зачем нужны нейросети — ограничения классического зрения.

  2. Преимущества и недостатки нейросетевого подхода.

  3. Подготовка рабочего места.

  4. Как работает YOLO (кратко).

  5. Сбор данных и создание датасета.

  6. Дообучение YOLO.

  7. Проверка результатов.

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

Последовательность действий (порядок важен!):

  1. Разметка данных — обведите объекты рамками и назначьте классы.

  2. Распределение между train/valid/test выборками.

  3. Аугментация — автоматическое расширение датасета.

Внимание: если сначала аугментировать весь датасет, а потом делить на выборки, похожие варианты одного изображения могут попасть в разные выборки. Модель будет «помнить» аугментированные варианты из train и показывать нереально хорошие метрики на valid. Это ложный результат. Поэтому сначала делим, потом аугментируем.

Выборки

  • Train (обучающая) — основные данные для обучения. На этих примерах модель напрямую «учится», подстраивая свои внутренние параметры (веса).

  • Valid (валидационная) — «тренировочный полигон» во время обучения. На этих данных, которые модель не видела во время прямого обучения, проверяют её промежуточную производительность. По ним настраивают гиперпараметры.

  • Test (контрольная) — «выпускной экзамен». Полностью изолированный набор, который используется только один раз в самом конце, после фиксации всех параметров.

Пошаговая инструкция

  1. Создайте проект: + New Project, Project Name: course_2025, Project type: Object Detection, Visibility: Public. Нажмите Create Public Project. Откажитесь от синхронизации аннотаций.

  2. Загрузите данные: вкладка Upload DataSelect Folder → выберите папку с фотографиями → в качестве исполнителя выберите Label Myself.

  3. Разметьте данные: вкладка AnnotateStart Annotating. Используйте инструмент Bounding box (второй сверху) для обведения объектов. Для пустых кадров — Null Tool (нижний инструмент). Следите за единообразием: решите заранее, размечаете ли вы подводную часть буя или нет, и придерживайтесь одного стиля.

  4. Создайте версию: вкладка Versions → Preprocessing: Auto-Orient, Resize 640x480 → Augmentation: выберите несколько эффектов → Create 3x (датасет увеличится в 3 раза за счёт аугментации).

  5. Скачайте датасет: Download dataset → Format: YOLOv11Download 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. Домашнее задание

  1. Соберите датасет из симулятора (не менее 10 изображений на класс).

  2. Разметьте данные в Roboflow и создайте аугментированную версию (3x).

  3. Дообучите YOLO и проверьте результат на сцене соревнования.

  4. Убедитесь, что модель корректно распознаёт все 5 классов объектов.

5. Дополнительные материалы

Сайт Ultralytics

https://www.ultralytics.com/

https://www.ultralytics.com/

Сайт Roboflow

https://roboflow.com/

https://roboflow.com/

Документация YOLO: обучение

https://docs.ultralytics.com/modes/train/

https://docs.ultralytics.com/modes/train/

Документация YOLO: датасеты

https://docs.ultralytics.com/datasets/

https://docs.ultralytics.com/datasets/