# UfaHack2024
![](c4715817-515e-4815-aa0d-bfcc75d45388.jfif)
Хакатон UfaHack2024 в Уфе

---

## Описание проекта
Проект представляет систему распознавания лиц актёров (США / СССР-Россия) и блогеров с веб-камеры и по загруженным фотографиям. Пайплайн обработки: MTCNN (детекция лица) → DeepFace (Facenet, выделение эмбеддингов) → CatBoost (градиентный бустинг, классификация).

На основе десктопного приложения на CustomTkinter пользователь может запускать распознавание как из файловой папки с фотографиями, так и в реальном времени через веб-камеру. Дополнительно реализован Android-клиент на Kotlin, который отправляет фото на серверную часть по TCP-сокету.

Система обучена на нескольких категориях: актёры США, актёры СССР-Россия и блогеры. Для каждой категории строится отдельная модель CatBoost, использующая эмбеддинги лиц, извлечённые предобученной сетью Facenet.

## Стек технологий
- Python (основной язык)
- CustomTkinter (графический интерфейс)
- DeepFace + Facenet (извлечение эмбеддингов лиц)
- MTCNN / FastMTCNN (детекция лиц)
- CatBoost (градиентный бустинг)
- OpenCV + opencv-contrib-python (обработка изображений и видео)
- PyTorch + torchvision (фреймворк для нейросетей)
- CUDA (ускорение на GPU)
- Kotlin (Android-клиент)

## Структура проекта
```
UfaHack2024/
├── notebooks/
│   ├── app/
│   │   ├── main.py               # Точка входа, CustomTkinter
│   │   ├── Predict_photo.py      # Распознавание из папки с фото
│   │   ├── Predict_video.py      # Распознавание с веб-камеры
│   │   ├── PredictServer.py      # TCP-сервер (192.168.120.240:12345)
│   │   ├── Start.py              # Стартовое окно
│   │   ├── FastMtcnn.py          # Ускоренный MTCNN
│   │   └── FDJ.jpg               # Тестовое изображение
│   ├── model/
│   │   ├── saved_dictionary.pkl          # Словарь имён (категория)
│   │   ├── saved_dictionary_russia.pkl   # Словарь имён (Россия)
│   │   ├── saved_dictionary_bloggers.pkl # Словарь имён (блогеры)
│   │   ├── actors_usa_embeddings.pkl     # Эмбеддинги (США)
│   │   └── actors_ussr_embeddings.pkl    # Эмбеддинги (СССР-Россия)
│   ├── saved_dictionary.pkl      # Словарь имён (корневой)
│   ├── EDA.ipynb                 # Разведочный анализ данных
│   ├── blur_detection.ipynb      # Детекция размытия
│   ├── catboost.ipynb            # Обучение CatBoost
│   ├── deepface_notebooks.ipynb  # Работа с DeepFace
│   ├── FastMTCNN.py              # Вспомогательный модуль
│   └── tester.py                 # Тестирование
├── MyApplication6.rar            # Android-клиент (Kotlin)
├── .gitignore
├── requirements.txt
├── server/
│   ├── __init__.py
│   └── server.py
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── .github/
│   └── workflows/
│       └── docker-build.yml
├── .gitea/
│   └── workflows/
│       └── docker-build.yml
└── c4715817-515e-4815-aa0d-bfcc75d45388.jfif
```

## Установка и запуск

1. Клонируйте репозиторий:
```
git clone https://github.com/DrHo1y/UfaHack2024.git
cd UfaHack2024
cd notebooks/app
```
2. Установите зависимости (см. раздел Зависимости ниже).
3. Запустите приложение:
```
python main.py
```

### Зависимости

Все необходимые зависимости (15 пакетов) перечислены в `requirements.txt`. Установка выполняется одной командой:

```bash
pip install -r requirements.txt
```

## Важные замечания
- Файлы `.cbm` (catboost_usa.cbm, catboost_ussr.cbm) **не включены** в репозиторий. Их необходимо обучить из блокнота `catboost.ipynb` или получить отдельно.
- Каталоги `data/` с фотографиями находятся в `.gitignore` и **не приложены** к репозиторию. В коде жёстко прописаны абсолютные пути вида `C://Users//fatik//PycharmProjects//UfaHack2024//data//...` — перед запуском требуется скорректировать пути под ваше окружение.
- `requirements.txt` содержит все зависимости — см. раздел «Зависимости».
- Серверная часть (`PredictServer.py`) ожидает IP-адрес `192.168.120.240:12345` — измените под свою сеть.

## Приложение для Android
В корне репозитория находится архив `MyApplication6.rar` — проект Android-приложения на Kotlin. Клиент подключается к серверу (`PredictServer.py`) по TCP-сокету, отправляет фотографию и получает результат распознавания.

## Docker / локальная разработка

В репозитории добавлена конфигурация для запуска headless-сервера распознавания лиц в Docker-контейнере (без GUI). Серверная часть находится в каталоге `server/` — это Python-скрипт без графического интерфейса, который может работать независимо от десктопного приложения.

### Быстрый старт

```bash
docker compose up --build
```

После сборки и запуска сервер будет доступен на порту `12345` (адрес `127.0.0.1:12345`).

### Ручной запуск (без docker compose)

Собрать образ:

```bash
docker build -t ufahack2024 .
```

Запустить контейнер:

```bash
docker run -p 12345:12345 -v ./models:/app/models ufahack2024
```

Контейнер запускает headless TCP-сервер из `server/server.py`, слушает порт 12345 и требует файлы `.cbm` в каталоге `./models/`. Логи выводятся в stdout. Для выполнения команд необходим установленный Docker CLI.

### Переменные окружения

| Переменная  | По умолчанию   | Описание                         |
|-------------|----------------|----------------------------------|
| `HOST`      | `0.0.0.0`      | Адрес для привязки сокета        |
| `PORT`      | `12345`        | Порт TCP-сервера                 |
| `MODEL_DIR` | `/app/models`  | Каталог с моделями CatBoost      |
| `DATA_DIR`  | `/data`        | Каталог с данными (фотографиями) |

### Важно

- Файлы `.cbm` (catboost_usa.cbm и др.) **не включены** в репозиторий. Поместите их в каталог `./models/` на хосте перед запуском контейнера. Без них контейнер запустится, но распознавание будет недоступно (в логах появится предупреждение).
- Каталоги `./models/` и `./data/` создаются Docker автоматически, если их нет на хосте.
- Файл `.dockerignore` исключает из контекста сборки ненужные файлы (исходники блокнотов, Android-клиент, `.git` и др.).

### CI / CD

В репозитории определены два workflow-файла:

- **GitHub Actions** (`.github/workflows/docker-build.yml`) — при пуше в ветку `main` автоматически собирает образ и публикует его в `ghcr.io/drho1y/ufahack2024` (все символы в нижнем регистре). Аутентификация через `secrets.GITHUB_TOKEN`, теги — `:latest` и `:${{ github.sha }}`.
- **Gitea Actions** (`.gitea/workflows/docker-build.yml`) — публикует образ в `git.byte-mate.ru/coder/ufahack2024`. Аутентификация: имя пользователя `${{ github.repository_owner }}`, пароль из секрета `GIT_PASSWORD` (не `GITEA_TOKEN`). Требуется зарегистрированный Gitea Actions runner.

## Благодарности
Для обучения модели использовали [CatBoost](https://catboost.ai/)