- Автор кейса: Цифровой прорыв - Уральский федеральный округ - ЛизаАлерт
- Кейс: "ИИ фотобанк для поискового отряда"
- Решают: команда I PRO
- Репозиторий - фронтенд
- Репозиторий - бекенд
- Репозиторий - нейронная сеть
Задача присвоения тегов изображению оттносится к задаче многолейбельной классификации (Multilabel classification). На основане изображения, мы должны присвоить ему несколько различных классов. В кокретно нашей задаче было разделение на 11 признаков, 3 из которых являлись каегориальными фичами с 5, 4 и 3 категориями соответственно - в итоге на выходе 16 тегов.
Список призанков: 'Название', 'Время суток', 'Время года', 'Местность', 'Авиа', 'Автомобили', 'БПЛА', 'Водолаз', 'Кинолог', 'Кони', 'Объятия', 'Шерп'
При решении задач компьютерного зрения, важно обращать внимание на уже готовые решения, проверенные временем. Так поступили и мы, решив доработать классификатор resnet34 под эту задачу. Такая хорошая модель позволяет нам извлекать из картинок фичи, которые можно использовать для обучения более простых по структуре классификаторов. Так, на каждый признак разбиения по тегам в нашей модели приходится по линейному полносвязному слою, никак не связанным с остальными классификаторами - таким образом классификация времени суток не будет зависеть от классификаци, допустим местности, тем самым позволяя учиться классификаторам, что позволит улучшить классическую модель.
На вход нейронной сети поступает картинка 256 на 256, который отправляются в основу сети, resnet34. Его задача заключается в извлечения признаковых описаний Выход resnet34 подается на вход 11-ти линейным полносвязным слоям - по слою-"классификатору" на каждый признак. Каждый полносвязный слой включает в себя 512 нейронов и имеет количество выходов, равное количеству возможных значений признака. В итоге у нейронной сети получается 16 логитов, отражающих вероятность тега.
При обучении мы добились высоких результатов - на валидационной части датасета метрика f1-score составила 0.9378 (НЕ на приватной части датасета, данные по качеству модели на ней будут оглашены в конце соревнования). Использовали CrossEntropyLoss для каждого классификатора, оптимизатор Adam. Кроме того, при обучении возникали трудности в использовании оперативной памяти, подробно процесс можно посмотреть в ноутбуке. Для достижения таких результатов нам хватило 200 эпох (~2500 изображений на train, батч 128).
Вы можете найти её summary в этом файле. Также, имеется схема backward pass'а.
- Модель легко расширяется, при обучении дополнительных классификаторов не требуется переобучать модель целиком
- Обёртка в микросервис, позволяющая легко интегрировать его в существующую систему
Демо модели доступно по ссылке (если ещё не добавил - ищите на сайте http://i-pro.duckdns.org)
Чтобы запустить микросервис достаточно установить зависимости, скачать веса и запустить скрипт. Для запуска требуется Python3. По стандарту сервер запускается на localhost:8081
# Установка зависимостей
pip3 install -r requirements.txt
# Запуск сервера
python3 server.py
- Егор Смурыгин - продукт-менеджер
- Егор Голубев - бекенд-разработчик
- Роман Мамаев - фронтенд-разработчик
- Андрей Баранов - UX/UI Designer
- Тампио Илья - ML-специалист