Рассказываем, как мы, ML princesses [Napoleon IT] стали победителями кейса от Минприроды «Защита редких животных», и решили задачу по созданию сервиса, способного распознавать в дикой природе особо редкий вид хищников- амурского тигра. Десятый региональный хакатон проходил в рамках федерального проекта «Искусственный интеллект».

Проблематика

Число амурских тигров стремительно сокращается по всей планете. По оценкам экспертов, на 2021 год в России насчитывается около 580 особей. Это значит, что ценность представляет каждая жизнь и мы можем помочь решить эту проблему - бороться с браконьерством и спасать тигров с помощью искусственного интеллекта. 

Карта популяции амурских тигров
Карта популяции амурских тигров

Подготовка к хакатону

Чтобы хорошо подготовиться к хакатону мы нашли готовые датасеты для детекции и классификации животных.

Датасет для детекции:

  1. 2750 изображений;

  2. разрешение 1920x1080;

  3. разметка в формате x, y, width, height;

  4. 1 класс - тигры.

Датасет для классификации:

  1. 3080 изображений;

  2. разрешение варьируется от изображения к изображению;

  3. размеченные фотографии были распределены по папкам с названиями классов;

  4. 5 классов - гепарды, леопарды, пантеры, ягуары и тигры.

Постановка задачи

В начале хакатона мы ознакомились с техническим заданием и принялись за работу. Основная задача заключалась в создании модели машинного обучения, которая позволила бы классифицировать животных, попавших в объективы расположенных в лесу фотоловушек, специальных устройств фиксации фото и видео по датчику движения без участия человека.

Фотоловушка
Фотоловушка

Вторая задача - найти ту единственную амурскую тигрицу “Принцессу”, эту особь можно идентифицировать по уникальному рисунку по бокам, аналогично человеческим отпечаткам пальцев. Узор отличается с левой и правой стороны. 

Технический эксперт оценивает решение по следующим критериям:

  1. Запускаемость кода.

  2. Обоснованность выбранного метода (описание подходов к решению, их обоснование и релевантность задаче).

  3. Точность работы алгоритма (возможность оценить формальной метрикой с обоснованием выбора).

  4. Адаптивность/Масштабируемость.

  5. Отсутствие в решении импортного ПО и библиотек, кроме свободно распространяемого с обоснованием выбора.

Мы распределили роли: Вова был ответственный за обучение моделей, Игорь занимался инференсом моделей и телеграм ботом, а Егор разрабатывал бэкэнд приложения и накидывал презентацию для итоговой спич-сессии. 

У нас было готово: предобученные модели классификации и детекции.

Нам надо было сделать: дообучить модель классификации на данных, предоставленных организаторами; бэкэнд приложение, с привязанным к нему телеграм ботом.

Исходные данные

Мы получили данные от организаторов. Это были размеченные фотографии с фотоловушек, расположенных в лесу. Разметка Всего было 4 класса: “принцесса”, “тигры”, “леопарды” и “другие животные”. Фотографии были сделаны как днем, так и ночью с разрешением 2048  x  1536 пикселей. На одном снимке могло быть несколько животных одного класса. К фотографиям прилагались csv с координатами для обучения детектора в формате x1, y1, x2, y2. На фотографии ниже можем наблюдать ту самую принцессу. 

Пример изображения из датасета
Пример изображения из датасета

Техническое решение

Наше решение позволяет распознавать виды животных и отдельных особей с высокой точностью за счет SOTA (state of the art) подходов. Оно состоит из 4 модулей:

  1. Телеграм-бот.

  2. Сервис распознавания.

  3. Модель детекции.

  4. Модель классификации.

С тем как эти модули связаны между собой можно ознакомиться ниже:

Диаграмма последовательностей обработки одного кадра
Диаграмма последовательностей обработки одного кадра
Диаграмма последовательностей обработки видео
Диаграмма последовательностей обработки видео

Детектор 

Для детекции животных использовали архитектуру DetectoRS с использованием фреймворка mmdetection. По нашему опыту, она довольно хорошо дообучается и хватает 3-4 эпохи для получения высоких метрик. Обучение модели заняло около 2 часов. Изначально мы обучали детектор на нескольких классах, но потом было принято решение оставить один, потому что в дальнейшем мы выделили отдельный этап классификации.

Код обучения детектора можно посмотреть по ссылке: ​​https://www.kaggle.com/vfomenko/tiger-detectors-mmdetection-training 

Архитектура DetectoRS
Архитектура DetectoRS

Классификатор

Для определения хищников в кадре сделали классификатор на основе архитектуры Vision Transformer, который также хорошо дообучается. Мы решили использовать ViT вместо более распространенных подходов на сверточных нейронных сетях, потому что даже с базовыми версиями трансформеров участникам нашей команды уже удавалось занять первые места в соревнованиях по компьютерному зрению.

Визуализация работы Vision Transformer
Визуализация работы Vision Transformer

Но чтобы выделить Принцессу и в дальнейшем была возможность распознавать и других особей, мы отказались от классической реализации с использованием полносвязного слоя и категориальной перекрестной энтропии. Для этого использовали подход на основе metric learning, который хорошо себя зарекомендовал в задаче распознавания лиц. Обучали модель для извлечения вектора признаков с функцией потерь ArcFace и в дальнейшем сравнивали извлеченные из кадра признаки с теми, которые есть в базе данных по косинусной метрике. Вектор признаков брался из первого токена, который обычно используется для классификации, вместо различных вариаций глобальных пулингов.

Чтобы создать базу, мы взяли из тренировочного датасета все фотографии каждого класса, извлекли из них признаки и сделали средний вектор. На выходе получили три разных средних вектора, для “принцессы”, тигров и леопардов. Остальных животных мы отсекали по отсечке.

С кодом обучения классификатора можно ознакомиться здесь https://www.kaggle.com/emorkrin/animal-classification .

Распределения векторов в пространстве признаков у ArcFace и Softmax
Распределения векторов в пространстве признаков у ArcFace и Softmax

Метрики

По детекции мы получили 0.98 mAP и 0.99 recall

Для классификации считали три метрики: precision, recall и accuracy. Получили следующие результаты:

Класс

precision

recall

accuracy

Тигры

0.87

0.93

0.89

Леопарды

0.81

0.89

0.89

Другие животные

0.93

0.83

0.89

Принцесса

0.97

0.96

0.96

В итоге мы находим 99% животных и принцессу в 97% случаев с точностью 96% 

Backend

Мы реализовали бэкэнд приложение с помощью фреймворка Flask, позволяющего создавать Rest API сервисы. Создали endpoint,  который на вход принимает один кадр. В response получали json с меткой класса и координатами животного.

"message": "image received. size=2048 x 1536",
"image": [
  {
    "bbox": {
      "bbox_id": 0,
      "bbox": {
        "x1": 124,
        "y1": 332,
        "x2": 467,
        "y2": 670
      },
      "confidence": 0.94,
      "class_name": "princess"
    }
  }
]

Frontend

Для демонстрации работы сервиса было принято решение использовать телеграм бота. Это удобный формат демонстрации работы сервиса как для разработчика с точки зрения скорости разработки, так и для конечного пользователя, потому что никакого дополнительного ПО, кроме телеграма, устанавливать не нужно. Бот будет получать данные от юзера, взаимодействовать с нашим сервисом и выдавать краткую сводку о распознавании. В бота пользователь мог загрузить фотографию или видео. Если это видео, то оно нарезается на несколько кадров с задержкой в 3 секунды и обрабатывается как обычное изображение. Такой таймлаг был выбран для того, чтобы не засорять ленту пользователю. Для пользователя это выглядело так:

Результат работы телеграм-бота на одном кадре
Результат работы телеграм-бота на одном кадре
Сервиса распознавания нашел тигра
Сервиса распознавания нашел тигра
Результат работы на одном кадре с найденной Принцессой
Результат работы на одном кадре с найденной Принцессой
Сервис распознавания нашел Принцессу
Сервис распознавания нашел Принцессу

Итог

Наше решение полностью соответствует заявленным критериям:

  1. Окружения всех наших сервисов зафиксированы через docker.

  2. Наше решение с детекцией и последующим сопоставлением животного с известными нам позволяет идентифицировать всех особей в кадре.

  3. Добились метрик работы моделей выше 97%.

  4. Наше решение масштабируется на любое количество особей за счет подхода metric learning.

  5. В решении были использованы только open source технологии.

Таким образом, мы разработали сервис с высокой точностью распознавания животных, и заняли первое место на хакатоне. 

С кодом решения можно ознакомиться по ссылке.

 Теперь все принцессы будут под присмотром :) 

Комментарии (9)


  1. E_STRICT
    04.05.2022 09:44
    +1

    в дикой природе осталось всего 4000 особей, из них 540 особей насчитывается в России

    А где находятся остальные 3.5 тысячи?


    1. mctMaks
      04.05.2022 12:09

      Было видео, где тигрица Амур переплывала. Так что запросто могут быть и в Китае.


      1. E_STRICT
        04.05.2022 13:32

        Не могут быть в таком количестве. Тут изначально даны неправильные цифры.

         От мировой стотысячной популяции в дикой природе осталось всего 4000 особей

        В каком году была стотысячная популяция? Откуда взята цифра в 4000 особей?


        1. NapoleonIT Автор
          05.05.2022 07:28

          Спасибо большое за внимание, несоответствующие данные исправили!


  1. IamSVP
    04.05.2022 14:06

    Сколько времени ушло на проект?!


    1. NapoleonIT Автор
      04.05.2022 16:50

      Разрабатывали на хакатоне с вечера пятницы по утро воскресенья с минимумом сна) Код обучения моделей мы переиспользовали с других соревнований


  1. EqualsZero
    04.05.2022 16:26

    Спасибо за статью. Интересно, а вы не пробовали еще тестировать идентификацию на новых данных? Раз есть апи и бот, значит это видимо предполагалось.

    Несколько лет назад на CVPR был конкурс по детекции и ре-идентификации амурских тигров: https://cvwc2019.github.io/leaderboard.html

    Судя по лидерборду и статьям, с идентификацией все было супер (top-1 точность 95%+). Но в данных была одна интересная деталь: в датасете в Train и Test были кадры с одних и тех же камер, и даже одних и тех же видео с небольшим интервалом, что приводило общем-то к data-leak между Train и Test и оверфиту, который было сложно увидеть по Test. В публичных решениях фото тигра Х с одной камеры зоопарка, никогда не ре-идентифицировалось по фото того же тигра Х с другой камеры в том же зоопарке - всегда только с той же камеры.

    Например, если вдруг фото "Принцессы" все зимние и со снегом, а у других тигров в основном летние и без снега, то тут можно словить похожий эффект.


    1. NapoleonIT Автор
      04.05.2022 16:28

      Пробовали идентифицировать Принцессу на фотографиях из интернета. На них сервис справился с детекцией и распознаванием.


  1. Akr0n
    05.05.2022 02:23

    Интересно, несколько достоверны оценки численности? Скорее всего в каждой ООПТ финансово заинтересованы в росте такой цифры в отчетах, но реальна ли она? Зная, как обстоят дела в российской тайге, число в 600 особей выглядит как-то слишком оптимистично...