Как нейросети помогают изучать снежных барсов: о проекте Сайлюгемского парка и Yandex Cloud

Снежный барс (ирбис) — один из самых редких видов больших кошачьих, который обитает в горных районах. С 2000 года снежный барс занесён в Красный список МСОП как «находящийся под угрозой исчезновения», а с 2017 года ирбисам присвоен статус уязвимого вида.

Такие животные нуждаются в особом наблюдении. Для мониторинга их поведения, состояния и численности учёные используют фотоловушки — автоматические камеры, которые устанавливаются на звериных тропах. Но чтобы отсмотреть и отсортировать все изображения c ловушек вручную, исследователи могут потратить несколько недель. Так что для этой задачи нужны помощники.

Меня зовут Михаил Добрицын, я учусь в Школе Анализа Данных Яндекса (ШАД) и занимаюсь ML‑сервисами в Yandex Cloud. В 2023 году совместно с Сайлюгемским национальным парком и другими студентами ШАД мы обучили нейросеть, которая поможет учёным быстрее находить снежных барсов и других животных на снимках и узнавать больше об их маршрутах. В этой статье мы расскажем, как создали собственный датасет для обучения такой нейросети, как тренировали модель, какие результаты получили сейчас и как планируем развивать это решение.

99ed04fdfe92c4da909d46d154b05736.jpg

В чём сложности мониторинга снежных барсов

Барсы считаются малоизученным видом, и одна из причин — их образ жизни. У ирбисов нет стай, они живут и охотятся поодиночке: самка воспитывает детёнышей одна, а когда котятам исполняется 1,5–2 года, они отделяются от матери и начинают самостоятельную жизнь. Так что обнаружить много барсов вместе нельзя в принципе. При этом снежные барсы обитают в труднодоступных местах на высоте от двух до шести тысяч метров, отличаются довольно осторожным поведением и наиболее активны в сумеречное время.

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


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

Если вы смотрели фильм «Невероятная жизнь Уолтера Митти», то немного представляете, каких усилий может стоить снимок барса от профессионального фотографа.  

Источник: THE SECRET LIFE OF WALTER MITTY by sheng wang, лицензия CC 2.0.  

Сегодня снежный барс занесён в Красный список международного союза охраны природы в статусе уязвимого вида. Это означает, что особей этого вида осталось менее 10 тысяч, и нужны специальные программы по его защите. Одной из самых эффективных мер во всем мире считается создание особо охраняемых природных территорий.

Здесь есть несколько уровней защиты:

  • заповедники — самый строгий способ охраны, где туристам разрешено посещать только 5% территории;

  • национальные парки — менее строгая схема, где создаются отдельные зоны особой охраны;

  • природные парки, в которых может быть запрещена вырубка деревьев или охота.

Ещё один важный элемент охраны — программы мониторинга. Они помогают определить численность популяции барсов, изучить места их обитания и понять, в каком месте и как создавать охраняемые территории. Для наблюдения за редкими животными можно отправлять экспедиции, в которых специалисты обследуют каждый квадрат, чтобы найти следы присутствия барсов. Но если человеческих ресурсов недостаточно, следить за животными как раз и помогают фотоловушки, которые можно установить даже в труднодоступных местах, куда люди добираются редко. Специалисты настраивают фиксацию по движению, находят на полученных кадрах животных и могут построить карту их передвижений и даже воссоздать историю жизни.

Иногда с фотоловушек получаются почти портретные снимки

Иногда с фотоловушек получаются почти портретные снимки

В России ирбис обитает в Республиках Тыва, Алтай, Бурятия и на юге Красноярского края. Всего на территории нашей страны замечено около 90 снежных барсов, и 24 из них находятся в национальном парке «Сайлюгемский» на Алтае. В этом регионе автоматические камеры для наблюдения за барсами появились в 2010 году. За много лет специалисты усовершенствовали методики качественного научного мониторинга. Современная технология предполагает, что на каждый квадрат площадью 5 км² требуется как минимум две фотоловушки.

Некоторые такие ловушки в труднодоступных местах могут работать по два года: батареи и флешки вполне хватает

Некоторые такие ловушки в труднодоступных местах могут работать по два года: батареи и флешки вполне хватает

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

В Сайлюгемском национальном парке около 160 фотоловушек: какие‑то могут снимать фото, какие‑то — видео. На одном устройстве может храниться до 20 000 фото или 5000 видеофайлов. Такой объём позволяет ловушке работать долго, даже если из‑за непростых условий размещения её не удаётся часто обслуживать. Но с такими камерами возникает проблема ложного срабатывания: если датчики движения настроены слишком чувствительно, фотофиксация будет запускаться даже на шевеление травы, и карта памяти заполнится нерелевантными кадрами. В среднем даже при правильно настроенной чувствительности среди всего массива изображений подходящими для изучения снежных барсов будут 10–30% кадров.

До автоматизации с этой задачей приходилось работать вручную: специалист парка должен был дойти до фотоловушки, забрать флешку и скачать все изображения на компьютер. Затем их нужно было отсмотреть и вручную отобрать фотографии с барсами. Чтобы найти те самые 10% барсов среди тысяч изображений, могли потребоваться недели.

Какой baseline был до обучения нейросети

До проекта сотрудники пробовали автоматизировать процесс самостоятельно, но первые программы работали не очень быстро: на обработку 1000 кадров уходило два часа, а результаты приходилось перепроверять. Поэтому исследователи обратили внимание на возможности нейронных сетей в облаке, без необходимости создавать собственную локальную инфраструктуру под машинное обучение.

Над нашим совместным проектом для Сайлюгемского национального парка работала команда из пяти человек: консультантами выступали архитектор ML‑сервисов Дмитрий Рыбалко и доцент Высшей школы экономики Дмитрий Сошников aka@shwars, а экспериментами занимались три студента ШАДа. Для работы мы выбрали нейросеть архитектуры YOLO — это довольно стандартная архитектура для решения таких типов задач. Конкретно в нашем проекте использовалась yolov8 по лицензии APGL 3.0, так как у нас некоммерческое использование.

Сначала мы пробовали запустить сеть без обучения и сразу столкнулись с двумя проблемами:

  • Не было нейросети, обученной именно на классах животных национального парка. А нам было важно не только обнаружить животное, но ещё и определить, к какому виду оно относится. Впоследствии ещё хотелось бы распознавать конкретного барса как личность.

  • Не всегда получалось хорошо найти bounding box — ограничивающий прямоугольник вокруг объекта. Тут мы пробовали дообучать open‑source сеть megadetector, которая построена на базе yolo5, но результаты были хуже, чем у нашей нейросети. Megadetector хорошо распознавал животных вообще, но без определения вида.

Так что в первую очередь нам требовалось обучить нейросеть корректно детектировать и распознавать нужных нам животных — в перспективе вплоть до конкретной особи. К сожалению, мы не нашли готовых датасетов, в которых были нужные виды, да ещё и хорошо размеченные. А значит, в качестве первого шага нам нужно было собрать, разметить и отвалидировать выборку для обучения нейросети.

Как формировали датасет для обучения нейросети  

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

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

1242ae7ba2d556276887311fc8eab3c9.jpg

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

Для обучения модели мы решили использовались фото десяти самых распространённых в парке видов.

68a8f6ac6118b7ffb610c2c3c18e9c4c.png

В финальной выборке распределение по количеству фотографий было такое:

b3c69b43483c482c710b6210c287a6f3.png

Помимо этого использовали и фотографии без животных, которые тоже нужны для обучения и проверки качества детектирования. В общей сложности за несколько месяцев мы набрали массив из 16 084 фотографий и видеофрагментов объёмом 13 ГБ.

Разметка данных. Дальше предстояла самая трудоёмкая задача — разметить все 16 тысяч кадров: выделить нужное животное и указать его класс. С разметкой помогали участники проекта Yandex U‑team, но всё равно им было бы сложно быстро отсмотреть десятки тысяч фото.

Задачу облегчало то, что все фотографии нам предоставили уже в разбивке по папкам с видами, но хотелось ещё немного ускорить подготовку. Поэтому для начала нужно было «нарисовать» вокруг животных прямоугольники (bounding box). Для этого мы использовали всё ту же выбранную нами нейросеть, уже натренированную на задачи object detection. Решение неплохо справилось и выделило больше половины животных.

Дальше команде оставалось провалидировать машинную разметку, добавить классы всем животным и исправить сложные случаи: например, если нейросеть не увидела лежащее животное или если особь затаилась и «потерялась» на фоне камней.

Найди кота

Найди кота

Это один из сложных случаев: даже человеку трудно разглядеть барса (зелёный контур) среди камней (красный контур). Команде заодно нужно было принять решение, отмечать ли вообще такого незаметного даже для человека барса:

b491f401332568a4e575c0e9165cc8e3.jpeg

После ручной проверки подобных сложных случаев у нас появился хороший подготовленный датасет, на котором уже можно обучать модель.

Но задача улучшения датасета на этом не завершилась. Во время экспериментов мы продолжали совершенствовать его и собирать данные. Например, при проверке одной из гипотез мы обнаружили частые ошибки, которые возникают из‑за водяных знаков на изображениях. Мы программно сгруппировали прямоугольники, которые встречались на разных кадрах в одном и том же месте, просмотрели их ещё раз, нашли среди них детекции камней и сучков и выделенные ватермарки и удалили эти детекции из датасета.

Как обучались первые модели

Модель обучали в облаке: там удобно вести распределённую командную работу в JupyterLab и пользоваться мощностями, которых может не хватать на собственных ноутбуках.

Сами данные для обучения держали в объектном хранилище, туда же складывали обработанные фото.

8bde1da403703a0c95b1e1b503968594.png

Ещё нам понадобились обычные виртуальные машины в Compute Cloud для размещения простого приложения. Чтобы сотрудники национального парка могли загружать новые данные и получать уже отсортированные по папкам кадры, мы создали простой интерфейс с помощью streamlit.

cef1299dd21a79d595615742b5e136ca.png

Для обучения модели настроили конфигурацию Yandex DataSphere с двумя картами V100 —, но даже в этом случае первое полноценное обучение на 10 000 изображений заняло 5–6 часов. Так что скорость каждой итерации была нам важна.

Вот какие первые результаты мы получили:

4e12079ef28b606f606b8e68353855f9.png

На кривой Precision‑Recall наблюдаем, насколько полно алгоритм видит всех животных и с какой точностью определяются конкретные животные. Специалисты по машинному обучению знают: чем больше график стремится вверх и вправо, тем лучше.

Конкретный пример сложного случая, где модель не «видит» животное: барс на фото вроде бы распознался. Но при внимательном рассмотрении мы видим, что особи там скорее всего две: справа от bounding box притаилось ещё одно животное.

3b9f80f80686ee422d718d58ca686828.png

Нам нужно было улучшить эти показатели, так что стали разбираться, что ещё можно подкрутить.

После первого обучения мы обратили особое внимание на ночные кадры. Как мы помним, барс сумеречное животное, и отслеживать его в тёмное время суток чуть ли не самое важное. Поэтому в качестве эксперимента для дообучения сети на этапе тренировочного датасета мы создали отдельную выборку из ночных снимков — их было около 40%. Кадры примерно такие:

546c828ae4b0ffa9617e0c3698b5a9ed.png

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

Дополнительно потребовалось создать скрипт, который будет определять время суток на изображении и отправлять его в нужную модель. Метаданных для принятия такого решения не хватало. Поэтому время суток определяли по количеству цветных пикселей: ночные фотографии преимущественно чёрно‑белые, а дневные — цветные.

В тренировочной выборке были и такие примеры

В тренировочной выборке были и такие примеры

Пайплайн из двух моделей работал хорошо, но в итоге сравнимых результатов мы смогли добиться и с помощью одной модели. В итоге решили не множить сущности и отказались от деления на дневные и ночные снимки. Дальше стали экспериментировать с тренировкой одной модели на дневных и ночных снимках, улучшая показатели.

После дообучения в начале декабря метрики качества распознавания выглядели уже так:

День

Ночь

recall:
архар: 251/272 (92.28%)
барс: 177/181 (97.79%)
козерог: 417/426 (97.89%)
лиса: 75/86 (87.21%)
манул: 19/51 (37.25%)
марал: 465/472 (98.52%)
медведь: 219/236 (92.80%)
сурок: 400/404 (99.01%)
волк: 92/126 (73.02%)
заяц: ⅓ (33.33%)

recall:
архар: 34/39 (87.18%)
барс: 152/165 (92.12%)
козерог: 15/17 (88.24%)
лиса: 199/220 (90.45%)
манул: 6/29 (20.69%)
марал: 45/47 (95.74%)
медведь: 217/224 (96.88%)
сурок: 0/0 (0.00%)
волк: 18/39 (46.15%)
заяц: 134/158 (84.81%)

precision:
архар: 251/255 (98.43%)
барс: 177/178 (99.44%)
козерог: 417/464 (89.87%)
лиса: 75/85 (88.24%)
манул: 19/21 (90.48%)
марал: 465/465 (100.00%)
медведь: 219/235 (93.19%)
сурок: 400/413 (96.85%)
волк: 92/107 (85.98%)
заяц: 1/1 (100.00%)
background: 0/33 (0.00%)

precision:
архар: 34/44 (77.27%)
барс: 152/153 (99.35%)
козерог: 15/16 (93.75%)
лиса: 199/249 (79.92%)
манул: 6/7 (85.71%)
марал: 45/46 (97.83%)
медведь: 217/234 (92.74%)
сурок: 0/0 (0.00%)
волк: 18/24 (75.00%)
заяц: 134/153 (87.58%)
background: 0/12 (0.00%)

Как всё работает сейчас и как будем развивать распознавание барсов в будущем

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

a584e830331036378051beedc40ab446.jpg

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

Мы продолжаем улучшать показатели, и в процессе появляется много идей, что ещё можно сделать с этими данными. Вот так сейчас выглядят наши Precision‑Recall‑кривые:

69314dd2fd1e954cbd49bb31522ce019.png

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

С накоплением данных мы сможем проверить новые гипотезы. Нам бы хотелось научить модель распознавать на фотографиях конкретных барсов, но пока для этого не хватает данных, и сотрудники парка ищут особей на фотографиях вручную. Думаем, что при достаточном количестве фото для распознавания конкретных барсов мы обучим отдельную модель. В результате должен получиться пайплайн из нескольких алгоритмов: сначала отправляем фото в нейросеть, которая находит и распознаёт животных, а уже распознанные изображения барсов отдаём модели, которая отвечает за определение конкретных особей.

Модели можно дообучать и для других видов животных. Например, сейчас мы не распознаём птиц, но за ними тоже может быть интересно наблюдать.

d0c9de246a43f411e35cbc16eca7088e.png

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

Также на следующем этапе можно визуализировать существующие данные. Уже сейчас у нас есть довольно много признаков, привязанных к каждой фотографии:

  • геометка фотоловушки, с которой получено изображение;

  • временная метка;

  • класс животного;

  • обозначение конкретной особи, которую удалось определить вручную.

Эти данные можно будет переносить на карты, добавить счётчики по каждой фотоловушке и выстроить маршруты передвижения животных. Например: сегодня здесь было 10 архаров. Пока мы попробовали перенести данные только на сгенерированную карту. Но в будущем эти наработки можно будет переносить на реальный геослой и «проваливаться» внутрь конкретного счётчика на карте, чтобы изучить подробности по нему.

© Habrahabr.ru