Веб-система для обучения и выдачи моделей компьютерного зрения (классификация, сегментация). Стек: React / Vite, FastAPI, Celery, PostgreSQL, Redis, MinIO.
Для разработки: Python 3.10+, Node.js 18+ (сборка фронтенда), Docker с Compose V2.
- Описание
- Автоматизация процессов
- Загрузка данных
- Тестирование (инференс)
- Локальный запуск
- Docker и веб-интерфейс
- Продакшен (чеклист)
- Лицензия
- Структура репозитория
Автоматизирует подготовку данных, обучение и дообучение (YOLO через Ultralytics), инференс и хранение артефактов. Основной способ запуска — Docker Compose и единая точка входа через nginx.
Схема веб-стека (точка входа — http://localhost:100):
flowchart TB
B(["Браузер"])
subgraph compose["Docker Compose"]
NG["nginx :100"]
FE["frontend · React / Vite"]
API["backend · FastAPI"]
WRK["ml · Celery worker"]
DB[("PostgreSQL")]
RD[("Redis · брокер Celery")]
MN["MinIO · S3 и консоль"]
VOL[("том ml_data · /data")]
B --> NG
NG --> FE
NG -->|"/api/"| API
NG -->|"/minio/"| MN
API --> DB
API --> RD
API -->|ZIP, Drive, выдача файлов| MN
API --> VOL
WRK --> RD
WRK --> DB
WRK --> VOL
WRK -->|"POST /api/internal/storage/sync"| API
end
- Классификация
Определение категории, к которой принадлежит изображение. - Сегментация
Пиксельная классификация изображения с разметкой объектов.
Система автоматически анализирует предоставленный набор данных и определяет, какие действия необходимо выполнить:
- Обучение модели — если данные загружены впервые.
- Дообучение модели — если в данных обнаружены изменения или добавлены новые данные.
- Тестирование модели — если в папке
testприсутствуют данные для инференса.
Каждая обученная модель автоматически сохраняется в базе данных (БД), что позволяет:
- Использовать уже обученные модели для быстрого тестирования.
- Продолжать обучение без необходимости начинать с нуля.
- Загружаете новый набор данных — система автоматически обучает модель.
- Добавляете новые изображения в
dataset— система выполняет дообучение. - Загружаете изображения в папку
test— система запускает инференс и сохраняет результаты.
Система поддерживает два способа загрузки данных: Google Drive и ZIP-архив.
Настройте сервисный аккаунт Google (файл ключа задаётся в SERVICE_ACCOUNT_FILE, см. .env.example). В своём Google Drive необходимо:
- Создать директорию с вашим именем.
- Внутри этой директории создать папку с названием вашей задачи (например,
classificationилиsegmentation). - Разместить в ней папку
dataset, содержащую файлы для задачи.
- Классификация
dataset/ ├── class1/ # Директория для изображений первого класса │ ├── image1.jpg │ ├── image2.jpg │ └── ... ├── class2/ # Директория для изображений второго класса │ ├── image1.jpg │ ├── image2.jpg │ └── ... └── ... - Сегментация
Файл разметки для сегментации должен иметь структуру:
dataset/ ├── images/ # Директория с изображениями │ ├── image1.jpg │ ├── image2.jpg │ └── ... ├── labels/ # Директория с разметкой │ ├── image1.txt # Разметка для image1.jpg │ ├── image2.txt # Разметка для image2.jpg │ └── ...класс: точки сегментов
Архив загружается напрямую в директорию проекта и автоматически распаковывается.
ZIP-архив должен содержать папку dataset с файлами, организованными так же, как описано выше для задач классификации и сегментации.
Для проведения инференса по вашей задаче необходимо:
- Создать в директории вашей задачи папку
test. - Разместить в папке
testизображения, для которых требуется выполнить предсказание.
После завершения инференса результаты сохранятся в папке result в директории вашей задачи.
classification/ # Ваша задача
├── dataset/ # Данные для обучения
├── test/ # Изображения для инференса
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ...
└── result/ # Результаты инференса (создается автоматически)
├── image1_result
├── image2_result
└── ...
Для локального запуска проекта выполните следующие шаги:
-
Клонируйте репозиторий:
git clone https://github.com/OdincovMD/SimpleAutoML
-
Перейдите в директорию проекта:
cd SimpleAutoML -
Создайте виртуальное окружение:
python3 -m venv venv
-
Активируйте виртуальное окружение:
- Для Linux/macOS:
source venv/bin/activate- Для Windows:
venv\Scripts\activate
-
Установите зависимости:
- Worker / полный ML-стек локально:
pip install -r ml/requirements.txt - Только backend (FastAPI):
pip install -r backend/requirements.txt
- Worker / полный ML-стек локально:
-
Создайте файл
.envв корне репозитория. Достаточно задать либоDATABASE_URL(строка подключения PostgreSQL), либо отдельные поля, как вbackend/config.py:# Вариант A — одна строка (как в Docker) # DATABASE_URL=postgresql+psycopg2://user:pass@localhost:5432/dbname # Вариант B — по полям DB_HOST=localhost DB_PORT=5432 DB_USER=your_user DB_PASS=your_pass DB_NAME=your_db # Google Drive (опционально, для API) SERVICE_ACCOUNT_FILE=automl_token.json DRIVE_FOLDER_ID=your_drive_folder_id # Если поднимаете Celery worker и backend отдельно: общий секрет для POST /api/internal/storage/sync # INTERNAL_STORAGE_TOKEN=длинная-случайная-строка
-
Таблицы PostgreSQL создаются сами: при старте FastAPI (
SyncOrm.create_tables()вbackend/app/main.py) и при обучении в worker (в началеrun_pipeline). Отдельно инициализировать БД не нужно.Чтобы полностью пересоздать таблицы (все данные будут удалены):
python -c "from backend.db.orm import SyncOrm; SyncOrm.init_db()"
- Docker Engine и Docker Compose V2.
cp .env.example .env
# В продакшене смените пароли и INTERNAL_STORAGE_TOKEN (одинаковый токен у backend и ml).
# Для Google Drive задайте DRIVE_FOLDER_ID и положите JSON ключа (см. SERVICE_ACCOUNT_FILE).
docker compose up -d --buildПри старте контейнера backend схема БД в PostgreSQL создаётся автоматически (SyncOrm.create_tables() в lifespan приложения).
Точки входа после запуска:
| URL | Назначение |
|---|---|
| http://localhost:100 | Веб-портал (nginx → frontend) |
| http://localhost:100/api/ | REST API (FastAPI) |
| http://localhost:100/api/health | Проверка живости backend |
| http://localhost:100/minio/ | Консоль MinIO (прокси nginx → порт 9001 контейнера) |
| Сервис | Роль |
|---|---|
| nginx | Единая точка входа, лимит тела запроса 500M, прокси API и MinIO Console |
| frontend | SPA (React, Vite, TypeScript) |
| backend | FastAPI: датасеты, Drive, задачи, модели, работа с MinIO (S3 API) |
| ml | Celery worker: обучение YOLO; общий том /data с backend; после обучения вызывает внутренний API синхронизации в MinIO |
| postgres | Метаданные датасетов и моделей |
| redis | Брокер и backend результатов Celery |
| minio | Объектное хранилище (S3 API), том minio_data |
Healthcheck настроен для nginx, backend, postgres, redis, ml. У образа minio/minio отдельный healthcheck не используется (минимальный rootfs).
- С MinIO по S3 API взаимодействует только backend (загрузка ZIP в бакет, presigned URL для скачивания модели, выгрузка
results/иmodels/после задачи). - ml не содержит клиента MinIO: пишет артефакты на том
ml_data(/dataв контейнерах) и вызываетPOST /api/internal/storage/syncс заголовкомX-Internal-Token. ЗначениеINTERNAL_STORAGE_TOKENдолжно совпадать у сервисов backend и ml (задаётся в.env/ compose; в примере по умолчанию в compose — только для разработки).
См. .env.example. Часто используемые:
POSTGRES_*— учётные данные БД (и подстановка вDATABASE_URLу backend/ml).MINIO_ROOT_USER,MINIO_ROOT_PASSWORD— ключи MinIO (те же передаются backend какMINIO_ACCESS_KEY/MINIO_SECRET_KEY).INTERNAL_STORAGE_TOKEN— секрет внутреннего API синхронизации с хранилищем.DATABASE_URL,CELERY_BROKER_URL— при необходимости переопределить явно.
Для Google Drive в контейнерах положите файл сервисного аккаунта в контекст сборки и смонтируйте или скопируйте в образ согласно вашей политике безопасности; в коде по умолчанию ожидается путь из SERVICE_ACCOUNT_FILE (backend/config.py).
В ml по умолчанию заданы SKIP_IMGSZ_SEARCH=1 и AUTO_IMGSZ=640, чтобы не запускать длительный перебор размера изображения (check_imgsz). Также AUTOML_QUIET=1 отключает прогресс-бары tqdm в worker. Чтобы вернуть перебор imgsz, задайте SKIP_IMGSZ_SEARCH=0; для tqdm в логах — AUTOML_QUIET=0.
docker compose logs -f ml backend # логи worker и API
docker compose build --no-cache ml # пересборка после смены ml/requirements.txt
docker compose down -v # остановка и удаление томов (данные БД и MinIO пропадут)- Секреты: сильные
POSTGRES_PASSWORD,MINIO_ROOT_PASSWORD,INTERNAL_STORAGE_TOKEN; не коммитьте.envи ключи (automl_token.jsonи т.п.). - CORS: в
backend/app/main.pyзаменитеallow_origins="*"на список ваших доменов. - TLS: вынесите HTTPS на внешний reverse proxy (Traefik, Caddy, облачный LB); не публикуйте HTTP-порт сервиса в открытую сеть без шифрования.
- БД и бэкапы: при старте backend создаёт таблицы и при необходимости добавляет колонки
task_type,trained_at. Настройте резервное копирование PostgreSQL и томов MinIO по вашей политике. - Образы: зафиксируйте теги образов (в т.ч. MinIO) вместо
latest. - Frontend в CI:
npm ciиnpm run buildвfrontend/для воспроизводимых артефактов. - Google Drive: без валидного
DRIVE_FOLDER_IDи сервисного аккаунта эндпоинты Drive не использовать; для продакшена предпочтительнее ZIP и MinIO.
Этот проект распространяется под лицензией MIT.
Благодарим @Horokami, который внес свой вклад в развитие этого проекта. Также выражаем признательность за использование открытых библиотек и фреймворков, которые значительно ускоряют разработку. В частности, благодарим авторов библиотек:
PyTorch
Google API
ultralytics
Улучшения и багрепорты — через issue и pull request в репозитории.