REST API сервис для поиска логотипа Т-Банка на изображениях.
Используется дообученная YOLO-модель для детекции объектов и аннотирования логотипов на загруженных изображениях.
- app/: Основной код приложения, включая обработку запросов и схемы данных.
- data/: Данные для обучения и тестирования, включая изображения и аннотации.
- model_creations/: Файлы, связанные с обучением и настройкой моделей.
- tests/: Тестовые данные и скрипты для проверки работы сервиса.
- weights/: Предобученные веса моделей.
- Детекция логотипов: Определяет логотипы Т-Банка на загруженных изображениях и возвращает координаты ограничивающих рамок.
- Проверка состояния: Эндпоинт для проверки работоспособности сервиса.
- Аннотация данных: Утилиты для аннотирования изображений и обогащения обучающих наборов данных.
- Обучение модели: Поддержка обучения YOLO-моделей для повышения точности детекции.
- Поддерживаемые форматы: JPEG, PNG, BMP, WEBP
Порт сервиса: 8000
Контракт API
from pydantic import BaseModel, Field
from typing import List, Optional
from fastapi import FastAPI, File, UploadFile
class BoundingBox(BaseModel):
"""Абсолютные координаты BoundingBox"""
x_min: int = Field(..., description="Левая координата", ge=0)
y_min: int = Field(..., description="Верхняя координата", ge=0)
x_max: int = Field(..., description="Правая координата", ge=0)
y_max: int = Field(..., description="Нижняя координата", ge=0)
class Detection(BaseModel):
"""Результат детекции одного логотипа"""
bbox: BoundingBox = Field(..., description="Результат детекции")
class DetectionResponse(BaseModel):
"""Ответ API с результатами детекции"""
detections: List[Detection] = Field(..., description="Список найденных логотипов")
class ErrorResponse(BaseModel):
"""Ответ при ошибке"""
error: str = Field(..., description="Описание ошибки")
detail: Optional[str] = Field(None, description="Дополнительная информация")
# Пример эндпоинта
@app.post("/detect", response_model=DetectionResponse)
async def detect_logo(file: UploadFile = File(...)):
"""
Детекция логотипа Т-банка на изображении
Args:
file: Загружаемое изображение (JPEG, PNG, BMP, WEBP)
Returns:
DetectionResponse: Результаты детекции с координатами найденных логотипов
"""
pass
docker-compose up --build- data/raw/images/: Исходные изображения (получил по ссылочке из условия)
- data/splits/images/train/: Изображения для обучения (в моем случае было ~4000 размеченных изображений)
- data/splits/labels/train/: Аннотации для обучения (2000 размечал сам, 2000 размечала моя модель, а я проверил)
- data/splits/images/val/
- data/splits/labels/val/
- data/splits/images/test/
- data/splits/labels/test/
Загрузить data, которые я использовал можно по ссылке: https://disk.yandex.ru/d/fyOTQXxwP6ey7Q
Едиснтвенное отличие: там нет data/raw/images, они же есть в условии
Для обучения модели я использовал ноутбук model_creations/workbook.ipynb. Путь к данным указан в файле tbank.yaml.
Модели есть в репозитории, но на всякий случай вот еще по ссылке: https://disk.yandex.ru/d/SFMNUhuyzBSB8w
Я выбрал модель yolov8m, потому что я нашел хороший гайд по моделям YOLO, а именно yolov8m потому что это средняя модель, на обучение которой у меня хватит ресурсов и при этом у нее хорошее качество
- Я разметил 2000 изображений и обучил на них первую модель, я ее назвал rick_2000_model, у нее были довольно хорошие метрики (подробнее о них в
model_creations/workbook.ipynb) - Используя эту модель, я разметил еще 2000 изображений и обучил на них итоговую модель с именем morty_4000_model
Я проверил модель rick_2000_model на 2000 тестовых изображений, получил хорошие результаты:
- mAP50: 0.9504
- mAP50-95: 0.8891
- Precision: 0.9940
- Recall: 0.8784
Модель morty_4000_model показывает себя не хуже, точно проверить сложно, потому что не хочу еще размечать тестовую выборку
ТГ: @rokerius