Проект для классификации дорожных знаков с использованием глубокого обучения. Обучает модель ResNet18 на датасете GTSRB (German Traffic Sign Recognition Benchmark) для распознавания 43 классов дорожных знаков.
- Особенности
- Требования
- Установка
- Быстрый старт
- Структура проекта
- Конфигурация
- Использование
- Разработка
- Лицензия
- 🚀 PyTorch Lightning — современный фреймворк для обучения моделей
- 🔧 Hydra — гибкая система управления конфигурациями
- 📊 MLflow — отслеживание экспериментов и метрик
- 📦 DVC — версионирование данных
- 🎯 ResNet18 — предобученная архитектура для классификации изображений
- 📥 Kaggle API — автоматическая загрузка датасета GTSRB
- Python >= 3.13
- CUDA-capable GPU (опционально, для ускорения обучения)
- Kaggle API credentials (для загрузки датасета)
git clone https://github.com/ek2kk/automatic-traffic-sign-classification
cd automatic-traffic-sign-classificationПроект использует uv для управления зависимостями:
uv syncИли с помощью pip:
pip install -e .Для загрузки датасета необходимо настроить Kaggle API:
-
Создайте API токен:
- Зайдите на Kaggle.com
- Перейдите в Settings → API → "Create New Token"
- Скачайте файл
kaggle.json
-
Разместите токен:
mkdir -p ~/.kaggle cp kaggle.json ~/.kaggle/kaggle.json chmod 600 ~/.kaggle/kaggle.json
Альтернатива: Используйте переменные окружения:
export KAGGLE_USERNAME="your_username" export KAGGLE_KEY="your_api_key"
uv run python -m automatic_traffic_sign_classification.data.downloadДанные будут скачаны в data/gtsrb/ (~200MB). Процесс может занять несколько минут.
uv run python -m automatic_traffic_sign_classification.commandsМодель начнет обучение с параметрами из configs/train.yaml.
Если используете DVC для версионирования данных:
dvc repro download_dataautomatic-traffic-sign-classification/
├── automatic_traffic_sign_classification/ # Основной пакет
│ ├── __init__.py
│ ├── commands.py # Точка входа (Hydra)
│ ├── train.py # Логика обучения
│ ├── data/
│ │ ├── __init__.py
│ │ ├── dataset.py # PyTorch Dataset для GTSRB
│ │ └── download.py # Загрузка данных с Kaggle
│ ├── models/
│ │ ├── __init__.py
│ │ └── classifier.py # ResNet18 классификатор
│ ├── lightning/
│ │ ├── __init__.py
│ │ └── module.py # Lightning модуль
│ └── utils/
│ ├── __init__.py
│ └── seed.py # Фиксация seed для воспроизводимости
├── configs/ # Конфигурационные файлы (Hydra)
│ ├── train.yaml # Главный конфиг
│ ├── data/
│ │ ├── base.yaml # Базовый конфиг данных
│ │ └── kaggle.yaml # Конфиг для Kaggle датасета
│ ├── model/
│ │ └── resnet18.yaml # Параметры модели
│ ├── trainer/
│ │ └── default.yaml # Параметры тренера
│ └── logging/
│ └── mlflow.yaml # Настройки MLflow
├── data/ # Данные (не в git)
│ └── gtsrb/ # GTSRB датасет
├── pyproject.toml # Зависимости проекта
├── dvc.yaml # DVC pipeline
├── docker-compose.yml # Docker конфигурация
└── README.md # Этот файл
Проект использует Hydra для управления конфигурациями. Все параметры находятся в configs/.
defaults:
- model/resnet18
- data/kaggle
- trainer/default
- logging/mlflow
train:
batch_size: 128
lr: 3e-4
use_gpu: truedata_dir: ./data/gtsrb/Train
batch_size: 128
val_split: 0.2
num_workers: 4
image_size: 32num_classes: 43
pretrained: truemax_epochs: 10
precision: 32
gradient_clip_val: 0.0Вы можете переопределить любые параметры через командную строку:
uv run python -m automatic_traffic_sign_classification.commands \
train.batch_size=64 \
train.lr=1e-4 \
trainer.max_epochs=20 \
train.use_gpu=falseИли создать новый конфиг в configs/ и указать его:
uv run python -m automatic_traffic_sign_classification.commands \
--config-name=my_config# Стандартная загрузка
uv run python -m automatic_traffic_sign_classification.data.download
# Или через DVC
dvc repro download_dataСтруктура данных после загрузки:
data/gtsrb/
└── Train/
├── 0/ # Класс 0
│ ├── 00000.ppm
│ ├── 00001.ppm
│ └── ...
├── 1/ # Класс 1
└── ...
Датасет содержит 43 класса дорожных знаков, каждый класс находится в отдельной директории.
# Базовое обучение
uv run python -m automatic_traffic_sign_classification.commands
# С переопределением параметров
uv run python -m automatic_traffic_sign_classification.commands \
train.batch_size=256 \
trainer.max_epochs=50
# Обучение на CPU
uv run python -m automatic_traffic_sign_classification.commands \
train.use_gpu=falseДля использования MLflow убедитесь, что сервер запущен:
mlflow ui --port 8080Затем запустите обучение — метрики будут автоматически логироваться в MLflow.
data/dataset.py— реализуетGTSRBDataset, PyTorch Dataset для загрузки изображенийdata/download.py— загрузка датасета GTSRB с Kagglemodels/classifier.py— архитектура ResNet18 с заменой последнего слояlightning/module.py— Lightning модуль с логикой обучения и оптимизаторомtrain.py— основная функция обучения, создает DataLoader и Trainercommands.py— точка входа с Hydra декоратором
- Создайте новый файл в
automatic_traffic_sign_classification/models/ - Реализуйте класс модели, наследуясь от
nn.Module - Создайте конфиг в
configs/model/ - Обновите
train.pyдля использования новой модели
Текущая версия обучает только на тренировочных данных. Для добавления валидации:
- Добавьте
validation_stepвlightning/module.py - Разделите датасет на train/val в
train.py - Передайте оба DataLoader в
trainer.fit()
# Проверка импортов
python -c "from automatic_traffic_sign_classification.models.classifier import TrafficSignClassifier; print('OK')"
# Проверка загрузки данных (после скачивания)
python -c "from automatic_traffic_sign_classification.data.dataset import GTSRBDataset; ds = GTSRBDataset('data/gtsrb/Train'); print(f'Dataset size: {len(ds)}')"- Архитектура: ResNet18 (предобученная на ImageNet)
- Размер изображений: 32x32 пикселей
- Классы: 43 класса дорожных знаков
- Оптимизатор: Adam
- Loss: Cross Entropy
Ожидаемая точность на валидационной выборке: ~95-98% после 10-20 эпох обучения.
Автор: Egor Kuznetsov Версия: 0.1.0