Home » Как обучить YOLOv5 на собственных данных
Как обучить YOLOv5 на собственных данных

Как обучить YOLOv5 на собственных данных

Если ты занимаешься управлением серверами, то наверняка знаешь, что нейросети сегодня — это не просто модный тренд, а реальный инструмент для решения бизнес-задач. YOLO (You Only Look Once) — одна из самых популярных архитектур для детекции объектов в реальном времени. Но как её обучить на собственных данных? Это вопрос, который рано или поздно встаёт перед каждым, кто хочет выйти за рамки готовых решений и создать что-то специфичное для своих нужд.

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

В этой статье разберём весь процесс от А до Я: как подготовить данные, настроить окружение, запустить обучение и получить работающую модель. Рассмотрим как успешные кейсы, так и типичные грабли, на которые можно наступить. Поговорим о том, какие ресурсы понадобятся, как оптимизировать процесс и что делать, если что-то пошло не так.

Как работает YOLOv5: архитектура и принципы

YOLOv5 использует подход “один проход” — вся картинка обрабатывается за один раз, без необходимости скользящего окна или региональных предложений. Модель разделяет изображение на сетку и для каждой ячейки предсказывает bounding box’ы и классы объектов.

Архитектура состоит из трёх основных компонентов:

  • Backbone — извлекает признаки из изображения (CSPDarknet53)
  • Neck — агрегирует признаки разных уровней (PANet)
  • Head — генерирует финальные предсказания

Модель поставляется в нескольких вариантах: YOLOv5s (small), YOLOv5m (medium), YOLOv5l (large) и YOLOv5x (extra large). Выбор зависит от баланса между скоростью и точностью.

Модель Размер (MB) mAP@0.5 Скорость (FPS) Рекомендации
YOLOv5s 14 56.0 140 Для быстрого прототипирования
YOLOv5m 42 61.9 100 Баланс скорости и точности
YOLOv5l 90 65.4 70 Высокая точность
YOLOv5x 166 66.9 50 Максимальная точность

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

Для комфортной работы с YOLOv5 нужен сервер с GPU. Если у тебя его нет, можно взять VPS с видеокартой или выделенный сервер для серьёзных задач.

Минимальные требования:

  • Python 3.8+
  • CUDA 11.0+ (для GPU)
  • 8GB RAM (16GB рекомендуется)
  • 50GB свободного места

Устанавливаем YOLOv5:

git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

Проверяем установку:

python detect.py --source data/images/bus.jpg

Если всё работает, увидишь результат детекции в папке runs/detect/exp/.

Подготовка данных: форматы и структура

YOLOv5 работает с собственным форматом аннотаций. Каждое изображение должно сопровождаться текстовым файлом с разметкой:

datasets/
├── images/
│   ├── train/
│   │   ├── img1.jpg
│   │   └── img2.jpg
│   └── val/
│       ├── img3.jpg
│       └── img4.jpg
└── labels/
    ├── train/
    │   ├── img1.txt
    │   └── img2.txt
    └── val/
        ├── img3.txt
        └── img4.txt

Формат файла аннотации:

class_id center_x center_y width height
0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.2

Все координаты нормализованы (от 0 до 1). Если у тебя данные в формате COCO или Pascal VOC, можно использовать готовые конвертеры.

Создаём конфигурационный файл датасета (custom_dataset.yaml):

train: ../datasets/images/train
val: ../datasets/images/val

nc: 2  # количество классов
names: ['person', 'car']  # названия классов

Запуск обучения: параметры и настройки

Базовая команда для обучения:

python train.py --img 640 --batch 16 --epochs 100 --data custom_dataset.yaml --weights yolov5s.pt

Разберём основные параметры:

  • --img — размер входного изображения (640×640)
  • --batch — размер батча (зависит от объёма GPU памяти)
  • --epochs — количество эпох обучения
  • --data — путь к конфигурации датасета
  • --weights — предобученные веса для transfer learning

Для мониторинга процесса обучения используй TensorBoard:

tensorboard --logdir runs/train

Полезные дополнительные параметры:

python train.py \
    --img 640 \
    --batch 16 \
    --epochs 100 \
    --data custom_dataset.yaml \
    --weights yolov5s.pt \
    --device 0 \
    --workers 8 \
    --project my_project \
    --name experiment_1 \
    --save-period 10 \
    --cache ram

Оптимизация и тонкая настройка

Размер батча — критически важный параметр. Слишком маленький батч приведёт к нестабильному обучению, слишком большой — к переполнению памяти.

GPU Память Рекомендуемый batch Модель
GTX 1660 Ti 6GB 8-16 YOLOv5s
RTX 3070 8GB 16-32 YOLOv5m
RTX 3080 10GB 32-64 YOLOv5l
A100 40GB 64-128 YOLOv5x

Для оптимизации скорости обучения используй:

python train.py \
    --img 640 \
    --batch 32 \
    --epochs 100 \
    --data custom_dataset.yaml \
    --weights yolov5s.pt \
    --optimizer AdamW \
    --lr0 0.01 \
    --lrf 0.01 \
    --momentum 0.937 \
    --weight-decay 0.0005 \
    --warmup-epochs 3 \
    --warmup-momentum 0.8 \
    --warmup-bias-lr 0.1 \
    --box 0.05 \
    --cls 0.5 \
    --cls-pw 1.0 \
    --obj 1.0 \
    --obj-pw 1.0 \
    --iou-t 0.20 \
    --anchor-t 4.0 \
    --fl-gamma 0.0 \
    --hsv-h 0.015 \
    --hsv-s 0.7 \
    --hsv-v 0.4 \
    --degrees 0.0 \
    --translate 0.1 \
    --scale 0.5 \
    --shear 0.0 \
    --perspective 0.0 \
    --flipud 0.0 \
    --fliplr 0.5 \
    --mosaic 1.0 \
    --mixup 0.0

Типичные проблемы и решения

Проблема: CUDA out of memory

Решение: Уменьши batch size или используй градиентную аккумуляцию:

python train.py --batch 8 --accumulate 4  # эквивалент batch=32

Проблема: Модель не сходится

Решение: Проверь качество данных, увеличь количество эпох, настрой learning rate:

python train.py --lr0 0.001 --lrf 0.1 --epochs 300

Проблема: Переобучение

Решение: Увеличь аугментацию данных, используй early stopping:

python train.py --patience 50 --dropout 0.1

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

После обучения протестируй модель:

python val.py --weights runs/train/exp/weights/best.pt --data custom_dataset.yaml

Для инференса на новых изображениях:

python detect.py --weights runs/train/exp/weights/best.pt --source test_images/

Экспорт модели в разные форматы:

# ONNX
python export.py --weights best.pt --include onnx

# TensorRT
python export.py --weights best.pt --include engine

# TensorFlow
python export.py --weights best.pt --include saved_model

Альтернативные решения и сравнение

YOLOv5 — не единственное решение для детекции объектов. Рассмотрим альтернативы:

Модель Скорость Точность Простота настройки Размер
YOLOv5 Высокая Хорошая Очень простая Средний
YOLOv8 Высокая Лучше Простая Средний
Detectron2 Средняя Отличная Сложная Большой
EfficientDet Средняя Хорошая Средняя Маленький

Для production среды также стоит рассмотреть:

  • YOLOv8 — новая версия с улучшенной архитектурой
  • Detectron2 — более мощная, но сложная система от Facebook
  • TensorFlow Object Detection API — хорошая интеграция с TensorFlow экосистемой

Интеграция с другими инструментами

YOLOv5 отлично интегрируется с популярными инструментами:

Docker развёртывание:

FROM ultralytics/yolov5:latest
COPY custom_dataset.yaml /usr/src/app/
COPY best.pt /usr/src/app/
RUN pip install fastapi uvicorn
COPY api.py /usr/src/app/
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000"]

FastAPI сервис:

from fastapi import FastAPI, File, UploadFile
import torch
from PIL import Image
import io

app = FastAPI()
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')

@app.post("/predict")
async def predict(file: UploadFile = File(...)):
    image = Image.open(io.BytesIO(await file.read()))
    results = model(image)
    return results.pandas().xyxy[0].to_dict(orient="records")

Интеграция с Kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: yolov5-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: yolov5-api
  template:
    metadata:
      labels:
        app: yolov5-api
    spec:
      containers:
      - name: yolov5-api
        image: your-registry/yolov5-api:latest
        ports:
        - containerPort: 8000
        resources:
          requests:
            nvidia.com/gpu: 1
          limits:
            nvidia.com/gpu: 1

Мониторинг и автоматизация

Для production использования важно настроить мониторинг:

# Скрипт для автоматического переобучения
#!/bin/bash
DATASET_PATH="/data/datasets"
MODEL_PATH="/models/current"
BACKUP_PATH="/models/backup"

# Проверяем наличие новых данных
if [ -f "$DATASET_PATH/new_data.flag" ]; then
    echo "Найдены новые данные, начинаем переобучение..."
    
    # Бэкап текущей модели
    cp -r $MODEL_PATH $BACKUP_PATH/$(date +%Y%m%d_%H%M%S)
    
    # Запуск обучения
    python train.py \
        --img 640 \
        --batch 16 \
        --epochs 100 \
        --data $DATASET_PATH/config.yaml \
        --weights $MODEL_PATH/best.pt \
        --project $MODEL_PATH \
        --name retrain_$(date +%Y%m%d)
    
    # Валидация новой модели
    python val.py --weights $MODEL_PATH/retrain_$(date +%Y%m%d)/weights/best.pt
    
    # Если всё ок, заменяем модель
    if [ $? -eq 0 ]; then
        cp $MODEL_PATH/retrain_$(date +%Y%m%d)/weights/best.pt $MODEL_PATH/best.pt
        echo "Модель успешно обновлена"
    else
        echo "Ошибка при обучении, откат к предыдущей версии"
    fi
    
    rm "$DATASET_PATH/new_data.flag"
fi

Интересные факты и нестандартные применения

YOLOv5 можно использовать не только для классической детекции объектов:

  • Детекция аномалий в логах — конвертируй логи в изображения и обучай модель находить аномальные паттерны
  • Анализ сетевого трафика — представь трафик как тепловую карту и детектируй подозрительную активность
  • Мониторинг серверов — анализируй графики метрик для поиска проблем
  • Детекция лиц в видеопотоке для систем безопасности

Интересный способ использования — детекция объектов в dashboard’ах Grafana для автоматического обнаружения аномалий в метриках.

Оптимизация для production

Для production среды важно оптимизировать модель:

# Квантизация модели
python export.py --weights best.pt --include onnx --int8

# Оптимизация для TensorRT
python export.py --weights best.pt --include engine --device 0

Настройка batch inference для обработки множества изображений:

import torch
from pathlib import Path

model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
model.eval()

# Batch inference
images = [str(x) for x in Path('test_images').glob('*.jpg')]
results = model(images, size=640)

# Сохранение результатов
results.save()

Заключение и рекомендации

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

Когда использовать YOLOv5:

  • Нужна быстрая детекция в реальном времени
  • Ограничены вычислительные ресурсы
  • Требуется простая настройка и развёртывание
  • Есть собственные данные для обучения

Когда рассмотреть альтернативы:

  • Нужна максимальная точность (рассмотри Detectron2)
  • Работа с очень маленькими объектами
  • Специфические требования к архитектуре

Для серьёзных проектов рекомендую использовать мощные серверы с GPU — это значительно ускорит процесс обучения и позволит экспериментировать с более сложными моделями. Не забывай про мониторинг и автоматизацию — в production среде это критически важно.

Главное — начни с малого, протестируй на своих данных, и только потом масштабируй решение. YOLOv5 даёт все инструменты для этого.


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

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

Leave a reply

Your email address will not be published. Required fields are marked