- Home »

Как обучить 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 даёт все инструменты для этого.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.