Skip to content

Repository files navigation

T-Bank Logo Detector

📌 Описание

REST API сервис для поиска логотипа Т-Банка на изображениях.
Используется дообученная YOLO-модель для детекции объектов и аннотирования логотипов на загруженных изображениях.

🛠️ Структура проекта

  • app/: Основной код приложения, включая обработку запросов и схемы данных.
  • data/: Данные для обучения и тестирования, включая изображения и аннотации.
  • model_creations/: Файлы, связанные с обучением и настройкой моделей.
  • tests/: Тестовые данные и скрипты для проверки работы сервиса.
  • weights/: Предобученные веса моделей.

🚀 Возможности

  • Детекция логотипов: Определяет логотипы Т-Банка на загруженных изображениях и возвращает координаты ограничивающих рамок.
  • Проверка состояния: Эндпоинт для проверки работоспособности сервиса.
  • Аннотация данных: Утилиты для аннотирования изображений и обогащения обучающих наборов данных.
  • Обучение модели: Поддержка обучения YOLO-моделей для повышения точности детекции.
  • Поддерживаемые форматы: JPEG, PNG, BMP, WEBP

🧩 API Эндпоинты

Порт сервиса: 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

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

About

REST API, которое определяет есть на изображении лого Т-Банка или нет

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages