Основы детекции объектов с использованием YOLO

Практический курс по освоению современных методов обнаружения объектов на изображениях с помощью архитектуры YOLO. Студенты пройдут путь от теории и установки библиотек до обучения собственной модели на уникальных данных.

1. Введение в архитектуру YOLO и принципы работы детекции объектов

Введение в архитектуру YOLO и принципы работы детекции объектов

Добро пожаловать на курс «Основы детекции объектов с использованием YOLO». Это первая статья, в которой мы заложим фундамент для понимания того, как компьютеры «видят» и находят объекты на изображениях. Мы разберем, чем детекция отличается от классификации, почему старые методы были медленными и как архитектура YOLO совершила революцию в компьютерном зрении.

Что такое детекция объектов?

Прежде чем погружаться в архитектуру нейросетей, важно четко разграничить понятия. В компьютерном зрении существует несколько ключевых задач:

  • Классификация изображений (Image Classification): Алгоритм отвечает на вопрос «Что изображено на картинке?». Ответ обычно один: «Кошка» или «Собака». При этом мы не знаем, где именно находится объект.
  • Локализация объектов (Object Localization): Алгоритм не только говорит «Кошка», но и рисует вокруг неё рамку (bounding box).
  • Детекция объектов (Object Detection): Это более сложная задача. Алгоритм должен найти все объекты интересующих нас классов на изображении и для каждого нарисовать рамку.
  • !Иллюстрация различий между классификацией, локализацией и детекцией объектов.

    Детекция объектов — это комбинация двух задач: выяснить, что это за объект, и определить, где он находится.

    Проблема традиционных подходов

    До появления современных алгоритмов, таких как YOLO, задача детекции решалась методом «скользящего окна» (Sliding Window). Представьте, что вы смотрите на мир через узкую трубку. Вы перемещаете эту трубку по всему изображению слева направо, сверху вниз, пытаясь понять, попал ли в поле зрения объект.

    Этот метод имел существенные недостатки:

    * Низкая скорость: Чтобы найти объекты разного размера, нужно было прогонять окно разного масштаба тысячи раз. * Высокая вычислительная стоимость: Нейросеть классифицировала каждый фрагмент отдельно.

    Более продвинутые методы, такие как R-CNN (Region-based Convolutional Neural Networks), использовали алгоритмы для предложения регионов (Region Proposals), где мог бы находиться объект, и затем классифицировали их. Это было точнее, но все еще слишком медленно для работы в реальном времени (Real-Time).

    Революция YOLO: You Only Look Once

    В 2015 году Джозеф Редмон (Joseph Redmon) представил архитектуру YOLO, название которой расшифровывается как «You Only Look Once» («Ты смотришь только один раз»).

    Главная идея YOLO заключается в том, чтобы рассматривать детекцию объектов не как последовательность классификаций множества окон, а как единую задачу регрессии.

    > Люди смотрят на картинку и мгновенно понимают, какие объекты на ней есть, где они находятся и как взаимодействуют. Человеческая зрительная система быстрая и точная.

    Нейросеть YOLO «смотрит» на изображение целиком один раз (отсюда и название) и предсказывает координаты рамок и вероятности классов одновременно.

    Принцип работы: Сетка (The Grid)

    Основа работы YOLO — разделение входного изображения на сетку размером .

    !Визуализация разделения изображения на сетку S x S для работы алгоритма YOLO.

    Если центр объекта попадает в определенную ячейку сетки, то именно эта ячейка несет ответственность за детекцию этого объекта.

    Каждая ячейка сетки предсказывает ограничивающих рамок (bounding boxes) и оценки уверенности (confidence scores) для этих рамок. Оценка уверенности показывает, насколько модель уверена в том, что в рамке есть объект, и насколько точно рамка его охватывает.

    Формально оценка уверенности определяется как:

    где: * — итоговая оценка уверенности; * — вероятность того, что в данной ячейке вообще есть объект (от 0 до 1); * — метрика Intersection over Union (пересечение через объединение) между предсказанной рамкой и реальной рамкой (ground truth).

    Если объекта в ячейке нет, то , и, следовательно, .

    Параметры предсказания

    Каждая ограничивающая рамка состоит из 5 предсказанных значений: и .

  • : Координаты центра рамки относительно границ ячейки сетки.
  • : Ширина и высота рамки относительно всего изображения.
  • : Уверенность модели в наличии объекта в этой рамке.
  • Помимо рамок, каждая ячейка также предсказывает вероятности классов (). Это условные вероятности того, что объект принадлежит к определенному классу (например, «собака», «машина», «велосипед»), при условии, что в ячейке есть объект.

    где: * — вероятность того, что объект относится к классу , при условии наличия объекта.

    Выходной тензор

    В результате одного прохода через нейросеть мы получаем трехмерный тензор (массив данных). Если мы используем сетку , предсказываем рамок и имеем классов, то размер выхода будет:

    где: * — количество ячеек сетки по одной стороне; * — количество предсказываемых рамок на одну ячейку; * — количество параметров рамки (); * — количество классов объектов.

    Например, в первой версии YOLO использовалась сетка , 2 рамки на ячейку и 20 классов (датасет PASCAL VOC). Размер выхода составлял .

    Метрика IoU (Intersection over Union)

    Как мы понимаем, насколько точно нейросеть нашла объект? Для этого используется метрика IoU (Intersection over Union — Пересечение через Объединение).

    !Графическое объяснение метрики Intersection over Union.

    где: * — коэффициент перекрытия (от 0 до 1); * — площадь пересечения предсказанной рамки и реальной рамки; * — общая площадь, занимаемая обеими рамками вместе.

    Если , рамки идеально совпадают. Если , рамки не пересекаются вовсе. Обычно детекция считается успешной, если (или другое пороговое значение).

    Фильтрация результатов: Non-Maximum Suppression (NMS)

    Поскольку каждая ячейка сетки пытается предсказать рамки, для одного большого объекта (например, машины, занимающей несколько ячеек) может быть предсказано множество перекрывающихся рамок. Нам нужно оставить только одну — самую точную.

    Для этого используется алгоритм Non-Maximum Suppression (NMS):

  • Отбрасываются все рамки с низким уровнем уверенности ( ниже порога).
  • Выбирается рамка с самой высокой уверенностью.
  • Эта рамка сравнивается со всеми остальными рамками того же класса.
  • Если другая рамка сильно пересекается с выбранной (высокий ), она удаляется (подавляется), так как, скорее всего, это дубликат.
  • Процесс повторяется, пока не останутся только уникальные детекции.
  • Преимущества архитектуры YOLO

    Подводя итог, выделим ключевые преимущества, которые сделали YOLO стандартом индустрии:

    * Скорость: Благодаря единому проходу (single stage) сеть работает невероятно быстро, позволяя обрабатывать видеопоток в реальном времени (45-150 кадров в секунду). * Глобальный контекст: Сеть видит все изображение целиком, поэтому она реже ошибается, принимая фон за объект (меньше ложноположительных срабатываний на фоне), по сравнению с методами скользящего окна. * Обобщающая способность: YOLO хорошо изучает общие признаки объектов, что позволяет ей неплохо работать даже на изображениях, отличных от тех, на которых она обучалась (например, картины или рисунки).

    В следующих статьях мы углубимся в структуру нейросети, разберем процесс подготовки данных и начнем практическую работу с современными версиями YOLO.

    2. Установка необходимых библиотек и запуск инференса на готовых весах

    Установка необходимых библиотек и запуск инференса на готовых весах

    В предыдущей статье мы погрузились в теорию: разобрали, как работает сетка, что такое IoU и почему архитектура YOLO («You Only Look Once») стала революционной благодаря своей скорости и точности. Теперь пришло время перейти от теории к практике. В этой статье мы подготовим рабочее окружение, установим необходимые библиотеки и запустим нашу первую детекцию объектов, используя уже обученную нейросеть.

    Мы будем работать с современной реализацией YOLO (в частности, YOLOv8 от Ultralytics), так как она предоставляет наиболее удобный интерфейс для разработчиков и исследователей.

    Что такое инференс?

    Прежде чем писать код, определимся с терминологией. В машинном обучении существует два основных этапа:

  • Обучение (Training): Процесс, когда нейросеть «учится» на тысячах размеченных изображений, настраивая свои веса (параметры) для минимизации ошибки.
  • Инференс (Inference): Использование уже обученной модели для предсказания на новых, ранее не виденных данных.
  • Сегодня мы займемся именно инференсом. Мы не будем обучать сеть с нуля (это тема следующих статей), а возьмем готовые веса (pre-trained weights), которые уже «знают», как выглядят люди, машины, собаки и другие объекты.

    Подготовка окружения

    Для работы с нейросетями стандартом де-факто является язык программирования Python. Если у вас он еще не установлен, необходимо скачать и установить версию 3.8 или выше.

    Зачем нужно виртуальное окружение?

    При работе с Python крайне важно использовать виртуальные окружения. Представьте, что для одного проекта вам нужна библиотека numpy версии 1.0, а для другого — версии 2.0. Если устанавливать всё в глобальную систему, возникнет конфликт зависимостей, который может сломать оба проекта.

    Виртуальное окружение — это изолированная папка, в которой хранятся библиотеки только для конкретного проекта.

    Создадим папку для нашего курса и инициализируем окружение:

    После активации вы увидите префикс (venv) в командной строке. Это значит, что теперь все установленные библиотеки попадут именно в эту изолированную среду.

    Установка библиотеки Ultralytics

    Современные версии YOLO (v8, v9, v10 и новее) удобно упакованы в библиотеку ultralytics. Она базируется на фреймворке PyTorch, но скрывает большую часть сложного кода, предоставляя простой API.

    Для установки выполните команду:

    Эта команда автоматически подтянет все необходимые зависимости: torch (PyTorch), opencv-python (для работы с изображениями), pandas и другие.

    !Диаграмма зависимостей при установке библиотеки Ultralytics.

    Понимание готовых весов (Pre-trained Weights)

    Когда мы говорим «скачать YOLO», мы обычно имеем в виду скачивание файла с весами. Это файл (обычно с расширением .pt для PyTorch), содержащий миллионы чисел — параметров нейросети, которые были подобраны в процессе обучения на огромном датасете.

    Стандартные модели YOLO обучены на датасете COCO (Common Objects in Context). Этот датасет содержит 80 классов объектов, включая:

    * Людей * Транспорт (машины, велосипеды, самолеты) * Животных (кошки, собаки, лошади, птицы) * Предметы быта (стулья, диваны, ноутбуки, телефоны)

    Масштабы моделей

    YOLOv8 поставляется в нескольких размерах. Это позволяет выбрать баланс между скоростью работы и точностью детекции.

    | Модель | Название файла | Описание | | :--- | :--- | :--- | | Nano | yolov8n.pt | Самая быстрая и легкая. Идеальна для мобильных устройств и слабых ПК. Точность ниже остальных. | | Small | yolov8s.pt | Немного медленнее, но точнее. Хороший баланс. | | Medium | yolov8m.pt | Средний вариант. | | Large | yolov8l.pt | Высокая точность, требует мощной видеокарты. | | XLarge | yolov8x.pt | Максимальная точность, самая медленная и тяжелая. |

    !График соотношения скорости и точности для разных версий модели YOLOv8.

    Для начала мы будем использовать модель Nano (yolov8n.pt), так как она скачивается мгновенно и работает быстро даже на процессоре (CPU).

    Запуск инференса через командную строку (CLI)

    Самый простой способ проверить работу YOLO — использовать интерфейс командной строки (CLI). После установки библиотеки ultralytics вам доступна команда yolo.

    Попробуем найти объекты на изображении. Вы можете взять любую фотографию из интернета, сохранить её как image.jpg в папку проекта и выполнить команду:

    Разберем аргументы: * predict: режим работы (предсказание/инференс). * model=yolov8n.pt: указываем, какую модель использовать. Если файла нет, он скачается автоматически. * source='image.jpg': путь к входному изображению.

    После выполнения команды вы увидите в консоли отчет, например:

    > image 1/1 /path/to/image.jpg: 640x480 2 persons, 1 dog, 1 car, 72.5ms > Speed: 2.1ms preprocess, 72.5ms inference, 1.3ms postprocess per image at shape (1, 3, 640, 480) > Results saved to runs/detect/predict

    Результат (картинка с нарисованными рамками) будет сохранен в папку runs/detect/predict.

    Запуск инференса через Python

    CLI удобен для быстрых тестов, но для создания приложений нам нужно использовать Python-скрипты. Это дает гибкость: мы можем обрабатывать результаты, фильтровать их или передавать в другие части программы.

    Создайте файл main.py и напишите следующий код:

    Параметр уверенности (Confidence Threshold)

    Обратите внимание на аргумент conf=0.5 в коде выше. Это порог уверенности. Нейросеть для каждой рамки выдает вероятность того, что в ней находится объект.

    Математически условие фильтрации выглядит так:

    где: * — предсказанная вероятность наличия объекта (Confidence Score), число от 0 до 1; * — установленный нами порог (в данном случае 0.5).

    Если уверенность модели меньше 0.5 (50%), рамка будет отброшена и не попадет в финальный результат. Изменяя этот параметр, вы можете регулировать чувствительность модели.

    Интерпретация результатов

    Объект results, который возвращает модель, содержит всю информацию о детекции. Основной интерес представляет атрибут boxes (рамки).

    Каждая детекция содержит:

  • Координаты: (координаты углов рамки).
  • Confidence: Уверенность модели.
  • Class ID: Числовой идентификатор класса (например, 0 — это человек, 1 — велосипед).
  • Чтобы получить понятное название класса из ID, используется словарь имен, хранящийся в модели:

    Работа с видео и веб-камерой

    Одной из сильных сторон YOLO является скорость, позволяющая работать в реальном времени (Real-Time). Чтобы запустить детекцию на видеопотоке с вашей веб-камеры, достаточно изменить источник source на 0 (индекс камеры по умолчанию).

    В этом режиме вы увидите окно, в котором объекты будут выделяться рамками прямо в процессе съемки. Для выхода из режима просмотра обычно используется клавиша q или Esc.

    Использование GPU (опционально)

    Если у вас есть видеокарта NVIDIA, вы можете значительно ускорить инференс. Библиотека ultralytics и pytorch автоматически пытаются использовать GPU, если установлены правильные драйверы (CUDA).

    Чтобы проверить, на каком устройстве работает модель, можно посмотреть лог при запуске или проверить атрибут:

    Если вывод cpu, значит вычисления идут на процессоре. Если cuda:0, значит используется видеокарта. Для простых задач и модели Nano процессора вполне достаточно, но для моделей Large и XLarge видеокарта критически необходима для комфортной работы.

    Заключение

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

  • Устанавливать библиотеку ultralytics.
  • Различать версии моделей (Nano, Small, Medium и т.д.).
  • Запускать детекцию через консоль и Python-код.
  • Фильтровать результаты с помощью порога уверенности.
  • Однако, использование готовых весов ограничивает нас только теми 80 классами, которые есть в датасете COCO. А что, если мы хотим детектировать специфические объекты, например, дефекты на производстве, определенные виды растений или номерные знаки? Для этого нам потребуется обучить свою модель.

    Именно этим — подготовкой собственного датасета и обучением (Fine-Tuning) — мы займемся в следующей статье курса.

    3. Подготовка данных: сбор изображений, разметка и структура датасета

    Подготовка данных: сбор изображений, разметка и структура датасета

    В предыдущих статьях мы разобрали архитектуру YOLO и научились запускать инференс на готовых весах. Это отличный старт, но настоящая сила нейросетей раскрывается, когда мы обучаем их решать наши специфические задачи. Хотите детектировать дефекты на печатных платах? Определять спелость помидоров в теплице? Или находить свободные парковочные места?

    Для всего этого стандартный датасет COCO не подойдет. Вам нужны собственные данные. В этой статье мы пройдем путь от идеи до готового к обучению датасета. Помните золотое правило машинного обучения: «Garbage In, Garbage Out» (Мусор на входе — мусор на выходе). Качество вашей модели напрямую зависит от качества данных, на которых она учится.

    Этап 1: Сбор изображений

    Первый шаг — собрать коллекцию изображений, на которых присутствуют интересующие вас объекты. Кажется, что это просто, но здесь есть свои подводные камни.

    Принципы качественного датасета

  • Разнообразие (Diversity): Ваша модель должна работать в разных условиях. Снимайте объекты при разном освещении (день, ночь, тень), с разных ракурсов (сверху, сбоку, снизу) и на разном фоне. Если вы обучаете сеть находить каски на рабочих, а все фото сделаны в студии на белом фоне, модель не будет работать на реальной стройке.
  • Репрезентативность: Данные должны соответствовать той среде, где модель будет использоваться. Если камера будет висеть на потолке, собирайте фото с высоты потолка.
  • Объем: Для простых задач (например, отличить яблоко от банана) может хватить 50-100 изображений на класс. Для сложных задач в реальных условиях (например, детекция лиц в толпе) потребуются тысячи примеров.
  • Источники данных

    * Открытые датасеты: Google Open Images, Kaggle, Roboflow Universe. Часто там уже есть то, что вам нужно. * Скрейпинг (Web Scraping): Автоматическое скачивание картинок из поисковиков. Требует чистки от мусора. * Собственная съемка: Самый надежный, но трудоемкий способ. Вы берете камеру и идете снимать объекты.

    Этап 2: Разметка данных (Annotation)

    Компьютер не знает, что такое «кот» или «машина», пока мы ему не покажем. Разметка — это процесс, когда человек вручную выделяет объекты на изображении рамками (bounding boxes) и присваивает им классы.

    !Процесс разметки объектов в специализированном ПО.

    Формат разметки YOLO

    Существует множество форматов хранения разметки (PASCAL VOC XML, COCO JSON), но YOLO использует свой собственный, максимально простой текстовый формат.

    Для каждого изображения создается отдельный текстовый файл с тем же именем (например, image_01.jpg и image_01.txt). Внутри файла каждая строка описывает один объект.

    Структура строки выглядит так:

    class_id x_center y_center width height

    Где: * class_id — целое число, идентификатор класса (начинается с 0). * x_center, y_center — координаты центра рамки. * width, height — ширина и высота рамки.

    Важно: Все координаты в YOLO нормализованы. Это значит, что они приведены к диапазону от 0 до 1 относительно размера изображения. Это делает разметку независимой от разрешения картинки.

    Формулы для вычисления нормализованных координат выглядят следующим образом:

    Где: * — нормализованная координата центра по оси X (значение от 0 до 1); * — координата центра рамки в пикселях; * — ширина всего изображения в пикселях.

    Аналогично для высоты:

    Где: * — нормализованная высота рамки (значение от 0 до 1); * — высота рамки в пикселях; * — высота всего изображения в пикселях.

    Пример содержимого файла image_01.txt:

    Это означает, что на картинке два объекта: один класса 0 (например, человек) и один класса 1 (например, велосипед).

    Инструменты для разметки

    Вам не нужно считать координаты вручную. Существуют программы, которые делают это за вас:

  • CVAT (Computer Vision Annotation Tool): Мощный профессиональный инструмент от Intel (теперь независимый). Поддерживает командную работу, видео и авто-разметку.
  • LabelImg: Классическая, простая программа, которую нужно устанавливать на компьютер. Идеальна для новичков.
  • Roboflow: Облачная платформа. Позволяет размечать, хранить данные, делать аугментацию и экспортировать в формат YOLO в один клик. Очень популярна в сообществе YOLO.
  • Этап 3: Структура датасета и разделение данных

    Просто свалить все картинки в одну папку нельзя. Для корректного обучения данные нужно разделить на три выборки:

  • Обучающая (Train): На этих данных нейросеть учится. Обычно это 70-80% от всего объема.
  • Валидационная (Validation / Val): Используется в процессе обучения для проверки качества модели после каждой эпохи. Помогает понять, не начала ли сеть просто «заучивать» картинки (переобучение). Обычно 10-20%.
  • Тестовая (Test): Используется после завершения обучения для финальной оценки. Модель никогда не видела эти картинки раньше. Обычно 10%.
  • Файловая структура

    Стандартная структура папок для YOLOv8 выглядит так:

    Обратите внимание: имена файлов картинок и разметок должны совпадать (кроме расширения). Если картинка лежит в train/images/car_1.jpg, то разметка должна лежать в train/labels/car_1.txt.

    Этап 4: Конфигурационный файл (data.yaml)

    Последний штрих — создание файла data.yaml. Этот файл служит «картой» для скрипта обучения. Он говорит YOLO, где лежат картинки и какие классы мы ищем.

    Пример содержимого data.yaml:

    Аугментация данных

    Что делать, если вы собрали всего 100 фотографий, а для хорошего обучения нужно 500? На помощь приходит аугментация.

    Аугментация — это искусственное увеличение датасета путем преобразования имеющихся изображений. Мы можем: * Отразить фото по горизонтали. * Изменить яркость или контраст. * Добавить шум. * Немного повернуть или обрезать изображение.

    Для нейросети отраженная фотография кота — это новая фотография, на которой она может учиться. Современные библиотеки обучения YOLO (Ultralytics) делают базовую аугментацию автоматически прямо во время обучения, но вы также можете заранее расширить свой датасет с помощью инструментов вроде Albumentations или Roboflow.

    Заключение

    Подготовка данных — это самый скучный, но самый важный этап работы над проектом компьютерного зрения. Если вы качественно разметите данные и правильно организуете структуру папок, само обучение модели (которое мы разберем в следующей статье) пройдет гладко и быстро.

    Теперь у вас есть понимание того, как создать фундамент для вашей будущей нейросети. В следующем уроке мы напишем код для запуска обучения (Training) на вашем собственном датасете.

    4. Обучение собственной модели YOLO и анализ процесса тренировки

    Обучение собственной модели YOLO и анализ процесса тренировки

    Мы прошли долгий путь: изучили теорию, настроили окружение, собрали и разметили данные. Теперь у нас есть папка с изображениями, текстовые файлы с координатами рамок и файл конфигурации data.yaml. Настало время самого захватывающего этапа — обучения нейросети.

    В этой статье мы запустим процесс тренировки, разберем, что происходит «под капотом», и научимся читать графики, чтобы понимать, насколько хорошо наша модель справляется с задачей.

    Трансферное обучение (Transfer Learning)

    Прежде чем писать код, важно понять одну концепцию. Мы не будем обучать нейросеть с «чистого листа» (со случайными весами). Вместо этого мы используем метод Transfer Learning (перенос обучения).

    Представьте, что вы хотите научить человека определять виды редких тропических бабочек. Вы можете взять новорожденного ребенка и учить его с нуля. А можете взять взрослого энтомолога, который уже знает, что такое насекомые, крылья и узоры, и просто показать ему специфику новых бабочек. Очевидно, второй вариант быстрее и эффективнее.

    В мире YOLO: * «Взрослый энтомолог» — это модель, предварительно обученная на гигантском датасете COCO (80 классов, миллионы картинок). * «Новые бабочки» — это ваш уникальный датасет.

    Мы берем веса модели (например, yolov8n.pt), которые уже умеют выделять границы объектов и текстуры, и «дообучаем» (Fine-Tuning) их под наши классы.

    Запуск обучения

    Благодаря библиотеке ultralytics, запуск обучения сводится к одной строчке кода. Однако, успех зависит от правильного выбора гиперпараметров.

    Создайте файл train.py в корне вашего проекта (рядом с папкой dataset):

    Разбор ключевых аргументов

  • epochs (Эпохи): Одна эпоха — это один полный проход нейросети через весь ваш обучающий датасет. Если у вас 1000 картинок и вы ставите 100 эпох, сеть увидит каждую картинку 100 раз. Мало эпох — недообучение, много — переобучение и трата времени.
  • batch (Батч): Нейросеть не учится на картинках по одной. Она берет их пачками. batch=16 означает, что сеть загрузит 16 картинок, сделает предсказания, посчитает ошибку и только потом обновит веса. Чем больше батч, тем стабильнее обучение, но тем больше видеопамяти (VRAM) требуется.
  • imgsz (Размер изображения): Все картинки перед подачей в сеть приводятся к квадрату (обычно 640x640). Если ваши объекты очень мелкие, имеет смысл увеличить это значение до 1280 (но скорость упадет).
  • Что происходит во время обучения?

    Когда вы запустите скрипт, в консоли побегут строки с логами. Давайте разберем, что они означают. Нейросеть пытается минимизировать функцию потерь (Loss Function). В YOLOv8 она состоит из трех компонентов:

    Где: * — общая ошибка, которую модель пытается уменьшить. * (Box Loss) — ошибка координат рамки. Показывает, насколько предсказанная рамка не совпадает с реальной. Использует метрику IoU. * (Class Loss) — ошибка классификации. Модель угадала, где объект, но назвала собаку кошкой. * (Distribution Focal Loss) — помогает уточнить границы рамок, когда они размыты или сложны. * (лямбда) — коэффициенты важность каждого типа ошибки.

    В логах вы увидите box_loss, cls_loss и dfl_loss. В идеальном сценарии эти числа должны уменьшаться с каждой эпохой.

    Метрики качества: как понять, что модель умная?

    Просто уменьшение ошибки (Loss) не гарантирует, что модель будет хорошо работать на новых данных. Для реальной оценки используются метрики Precision (Точность) и Recall (Полнота).

    Для начала определим базовые понятия: * TP (True Positive): Модель верно нашла объект (есть рамка, класс верный). * FP (False Positive): Ложное срабатывание. Модель нашла объект там, где его нет (или перепутала класс). * FN (False Negative): Пропуск. Объект был, но модель его не заметила.

    Precision (Точность)

    Отвечает на вопрос: «Из всех объектов, которые модель нашла, сколько реально существуют?»

    Где: * — точность (от 0 до 1); * — количество верно найденных объектов; * — количество ложных срабатываний.

    Если низкий, значит модель «галлюцинирует» — находит объекты там, где их нет.

    Recall (Полнота)

    Отвечает на вопрос: «Из всех объектов, которые реально есть на картинке, сколько модель смогла найти?»

    Где: * — полнота (от 0 до 1); * — количество верно найденных объектов; * — количество пропущенных объектов.

    Если низкий, значит модель часто пропускает объекты.

    mAP (mean Average Precision)

    Это главная метрика в соревнованиях и статьях. Это «средняя точность», которая объединяет Precision и Recall в одно число.

    В логах вы увидите: * mAP50 (mAP@0.5): Точность при условии, что мы считаем детекцию верной, если пересечение рамок (IoU) больше 50%. mAP50-95: Более строгая метрика. Усредненное значение точности при порогах IoU от 50% до 95% с шагом 5%. Это число показывает, насколько идеально* рамки совпадают с объектами.

    !График изменения ошибки обучения и валидации, демонстрирующий момент переобучения.

    Анализ результатов обучения

    После завершения обучения (или в процессе) библиотека ultralytics сохраняет результаты в папку runs/detect/my_custom_model. Там вы найдете много полезного.

    1. Графики (results.png)

    Самый важный файл. Посмотрите на графики потерь (val/box_loss, val/cls_loss). * Хорошо: Линии падают и выходят на плато (становятся горизонтальными). * Переобучение (Overfitting): Ошибка на тренировке (train) падает, а ошибка на валидации (val) начинает расти. Это значит, модель просто запомнила тренировочные картинки и не может работать с новыми. Решение: больше данных, меньше эпох или усиление аугментации.

    2. Матрица ошибок (confusion_matrix.png)

    Показывает, какие классы модель путает между собой.

    !Пример матрицы ошибок, показывающей, как часто модель путает классы между собой.

    Если вы видите, что модель часто путает «волка» с «собакой», возможно, вам нужно добавить больше фотографий именно этих животных в сложных ракурсах.

    3. Веса модели (weights/)

    В папке weights будут лежать два файла: * last.pt: Веса модели после самой последней эпохи. * best.pt: Веса модели, показавшей наилучший результат (максимальный mAP) на валидации за все время обучения.

    Именно файл best.pt вы будете использовать в дальнейшем для работы вашего приложения.

    Проверка обученной модели

    Теперь, когда у вас есть best.pt, вы можете запустить инференс точно так же, как мы делали это во второй статье, только заменив имя модели:

    Заключение

    Поздравляю! Вы обучили свою собственную нейросеть. Теперь она умеет видеть то, что нужно именно вам. Мы разобрали, как запускать обучение, что такое Loss, Precision и Recall, и как выбрать лучшую версию модели.

    Но обучение — это не конец пути. В реальных проектах модель нужно оптимизировать, ускорять и встраивать в приложения. В следующих материалах курса мы могли бы рассмотреть вопросы экспорта модели в форматы ONNX и TensorRT для максимальной производительности.

    5. Валидация результатов, метрики качества и экспорт модели для использования

    Валидация результатов, метрики качества и экспорт модели для использования

    Поздравляю! Если вы читаете эту статью, значит, вы уже прошли путь от установки библиотек до обучения собственной нейросети. У вас есть файл с весами best.pt, и вы даже видели, как уменьшаются графики потерь (Loss). Но достаточно ли этого, чтобы сказать: «Моя модель работает отлично»?

    В этой статье мы научимся профессионально оценивать качество работы модели, разбираться в запутанных метриках и, наконец, экспортировать нейросеть для работы в реальных приложениях на разных устройствах.

    Валидация против Тестирования

    Часто новички путают эти понятия. Давайте разграничим их:

  • Валидация (Validation): Происходит во время обучения. Нейросеть видит эти данные, но не учится на них напрямую. Она использует их, чтобы понять, когда остановиться и какие веса сохранить. Это как пробные тесты перед экзаменом.
  • Тестирование (Testing): Происходит после обучения на абсолютно новых данных, которые модель никогда не видела. Это финальный экзамен.
  • В библиотеке Ultralytics запуск валидации выполняется одной командой:

    Погружение в метрики: как читать графики

    После валидации вы получите набор графиков. Самые важные из них помогают понять природу ошибок модели.

    Матрица ошибок (Confusion Matrix)

    Это один из самых информативных инструментов. Она показывает не просто «ошиблась модель или нет», а как именно она ошиблась.

    !Пример матрицы ошибок, где по диагонали расположены верные предсказания, а вне диагонали — ошибки классификации и пропуски.

    В матрице ошибок для детекции важны следующие понятия:

    * True Positive (TP): Модель верно нашла объект. * False Positive (FP): Модель нашла объект там, где его нет (ложь). * False Negative (FN): Модель не заметила существующий объект (пропуск). * True Negative (TN): Модель верно проигнорировала пустой фон (в детекции используется редко).

    F1-Score: Баланс точности и полноты

    В прошлой статье мы говорили о Precision (Точности) и Recall (Полноте). Проблема в том, что их часто сложно сбалансировать: увеличивая порог уверенности, мы повышаем точность, но теряем полноту (пропускаем объекты). Чтобы оценить модель одним числом, используют F1-Score — среднее гармоническое между ними.

    Где: * — итоговая метрика качества (от 0 до 1); * — точность (доля верных срабатываний среди всех срабатываний); * — полнота (доля найденных объектов среди всех реальных объектов).

    Идеальная модель имеет . Если одна из метрик (Precision или Recall) близка к нулю, то и F1 будет близок к нулю.

    mAP: Король метрик детекции

    Если вы откроете любую научную статью по компьютерному зрению, вы увидите метрику mAP (mean Average Precision). Это стандарт индустрии.

    Чтобы понять mAP, нужно сначала понять AP (Average Precision) для одного класса. Это площадь под кривой Precision-Recall.

    Где: * — средняя точность для конкретного класса; * — значение полноты (Recall) от 0 до 1; * — значение точности (Precision) как функция от полноты.

    Простыми словами: мы меняем порог уверенности от 0% до 100%, строим график зависимости точности от полноты и считаем площадь под этим графиком.

    mAP (mean AP) — это просто среднее арифметическое AP по всем классам.

    В отчетах YOLO вы увидите два значения:

  • mAP@50: Считается, что ответ верный, если пересечение рамок (IoU) больше 50%. Это «мягкая» метрика.
  • mAP@50-95: Это усредненное значение mAP при разных порогах IoU (от 50% до 95% с шагом 5%). Это «строгая» метрика, требующая идеального совпадения границ рамки.
  • Экспорт модели: выход в реальный мир

    Файл .pt (PyTorch), который мы получили, удобен для обучения, но плох для продакшена. Он требует установленного Python и тяжелого PyTorch, медленно работает на CPU и не запускается на мобильных телефонах.

    Чтобы внедрить модель в приложение (на C++, C#, Java, Android, iOS), её нужно экспортировать.

    Формат ONNX (Open Neural Network Exchange)

    Это самый популярный универсальный формат. Он поддерживается почти всеми платформами и языками программирования. Если вы хотите запустить YOLO на C# или внутри OpenCV, вам нужен ONNX.

    Преимущества ONNX: * Универсальность: Работает везде. * Отсутствие зависимости от PyTorch: Для запуска нужен только легкий onnxruntime.

    Формат TensorRT (engine)

    Если ваша цель — максимальная скорость на видеокартах NVIDIA (например, для обработки видео с 20 камер одновременно), ваш выбор — TensorRT. Это оптимизатор, который «пересобирает» нейросеть специально под архитектуру вашей видеокарты, объединяя слои и оптимизируя вычисления.

    !Схема, демонстрирующая варианты экспорта модели из исходного формата PyTorch в специализированные форматы для разных задач.

    Практика: Экспорт модели

    В Ultralytics экспорт делается одной строкой кода.

    Экспорт в ONNX:

    После выполнения вы получите файл best.onnx.

    Экспорт в TensorRT (требуется GPU):

    Вы получите файл best.engine.

    Анализ кривых обучения (Results.png)

    В папке с результатами обучения всегда создается файл results.png. Давайте научимся читать его ключевые графики:

  • Box Loss: Ошибка координат. Должна падать.
  • Cls Loss: Ошибка классов. Должна падать.
  • Metrics/mAP50: Должна расти и выходить на плато.
  • Если Box Loss на валидации (val/box_loss) начинает расти, а на обучении (train/box_loss) продолжает падать — это классический признак переобучения. Модель начала «зубрить» обучающие примеры.

    Заключение курса

    Мы прошли полный цикл создания системы компьютерного зрения:

  • Поняли, как работает YOLO и сетка.
  • Настроили окружение.
  • Собрали и разметили уникальный датасет.
  • Обучили модель.
  • Научились валидировать её и экспортировать в ONNX.
  • Теперь у вас есть все инструменты, чтобы создавать умные камеры, анализировать видеопотоки и решать реальные бизнес-задачи. Мир компьютерного зрения огромен, и YOLO — это ваш надежный проводник в него. Удачи в ваших проектах!