Привет! Меня зовут Сергей Иванов, я Data Scientist в команде MaritimeAI. Совместно с Яндекс Облаком мы создаем систему, которая позволит ученым Национального исследовательского института биологии Иркутского государственного университета отслеживать экологию Байкала, крупнейшего в мире пресноводного озера. Почему это важно? Вода озера является домом для сотен видов планктона. Именно сложный баланс микроорганизмов делает Байкал таким уникальным, первозданным и идеально подходящим для рыбалки и других занятий. Мы должны заботиться о здоровье озера, чтобы оно оставалось полезным для людей и продолжало вызывать благоговение у путешественников.

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

Чем мы обычно занимаемся в MaritimeAI? Наша команда применяет различные методы машинного обучения в морских, экологических и многих других исследованиях. Мы можем распознавать различные типы морского льда на спутниковых снимках, обрабатывать данные сонара, обнаруживать разливы нефти и улучшать подводные видеозаписи.

При поддержке Yandex Cloud мы создаем систему для Биологического института Иркутского государственного университета (ИГУ). Эта система поможет исследователям в проведении и поддержании уникального эксперимента по мониторингу экологической обстановки на Байкале.

На протяжении 77 лет Национальный исследовательский институт биологии ИГУ проводит научные наблюдения за водами озера Байкал. Это самый продолжительный в мире исследовательский проект такого рода, методология которого не менялась все это время. Пробы воды берутся в определенном месте тела озера на глубине от 0 до 700 метров. Затем исследователи регистрируют различные свойства, как гидрофизические (прозрачность и температура на разных глубинах), так и гидробиологические (количество и видовой состав фито- и зоопланктона).

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

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

Основная часть: наш подход

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

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

Еще одно отличие от базовых задач машинного обучения — оценка качества. С самого начала мы задавались вопросом, как точно определить, хорошо ли работают наши алгоритмы. Естественно, мы можем использовать соотношение распознанных объектов и специальные метрики (такие как F1 и ROC-AUC) и использовать IoU при обнаружении объектов.

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

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

Вот как выглядит общая классификация с процессом принятия решений на основе ответов:

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

В процессе разработки у нас не было четкого понимания всех нюансов работы специалистов НИИ, поэтому сначала мы оцифровали процесс «как есть». Это не значит, что мы не наблюдали за тем, как исследователи обращаются с образцами; однако, как и в любой другой реальной задаче, есть тысячи предостережений, которые мы можем не заметить. В отличие от изучения образца под микроскопом, теперь специалист делает фотографии, сохраняя кадры с камеры микроскопа в созданную нашей командой среду каталогизации образцов. Затем исследователь может просмотреть образец на компьютере, выбрать объекты, пометив их многоугольниками, и присвоить объектам определенные классы. Сводная карта будет сгенерирована автоматически.

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

Обнаружение объектов в настоящее время является самым интересным, но и самым слабым местом. Это было бы идеально для обнаружения всего, что мы видим в обязательном порядке, но здесь выявляются трудности:

  1. Мы можем столкнуться с объектом, которого никогда раньше не видели
  2. Объекты часто могут накладываться друг на друга

Из-за этого нам нужно было что-то более надежное, чем стандартные детекторы и классификаторы. На данный момент лучшее решение — маркировать фон, а не сами объекты. Ведь фон относительно выдержан: это стакан определенной емкости с янтарной подсветкой. Стеклянный контейнер имеет множество выпуклостей и царапин на дне, которые необходимо отличать от предметов: к сожалению, это исключает простую цветовую сегментацию. Помечая фон, мы можем создавать маски для фона и объектов, а затем разделять отдельные объекты, используя стандартный алгоритм OpenCV Watershed. На данный момент мы маркируем фон, используя классический алгоритм сегментации UNet, но также продолжаем экспериментировать с другими вариантами.

При таком подходе мы извлекаем объекты или, по крайней мере, сгустки объектов, если нам не повезло. Тем не менее, когда слишком много перекрывающихся объектов, помогает добавление в контейнер еще немного воды.

Для классификации мы используем подход Metric Learning. У нас есть множество классов для изображений, поэтому существует значительный дисбаланс между примерами объектов, принадлежащих к разным видам. Например, в этом году мы не ожидаем увидеть байкальскую дафнию. Кроме того, мы можем использовать отдельный алгоритм для определения новизны объекта для каждого класса объектов. В настоящее время классификатор представляет собой модель, состоящую из трех взаимосвязанных частей. Первая часть — это классическая нейронная сеть, в основном основанная на ResNet (но она может меняться, так как мы постоянно с ней экспериментируем). Мы обучаем эту сеть извлекать отдельные вложения объектов из изображений с различными вариантами потери триплетов. Вторая часть — это, по сути, критерий ближайшего соседа, работающий на движке Файсса. Этот метод помогает нам сгруппировать данные и определить, насколько новое изображение похоже или отличается от ранее встречавшихся изображений. Более того, вложения и расстояния между ними влияют на третью часть модели, классификаторы вне предметной области. Они определяют «новизна» вновь встречающегося изображения — один предиктор на класс. Классификатор может спутать некоторые классы (я тоже, если честно), поэтому мы позволяем людям оценить объект и решить, действительно ли он новый или алгоритм допустил ошибку.

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

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

В процессе работы мы столкнулись с множеством нюансов и сюрпризов. Вот несколько примеров:

  • Мы можем измерить частоту ошибок алгоритмов, но пока не можем оценить метрики человеческого труда. В прошлом биологи дважды подсчитывали каждый образец и усредняли результаты, чтобы компенсировать любые ошибки.
  • Наметанный глаз специалиста может различить давно знакомый вид даже на сильно смазанном изображении. «Пролистывая» образец под микроскопом, ученый не останавливается, чтобы сосредоточиться на какой-нибудь Epischura Baikalensis. Мы пытаемся добавить видеообработку — то есть непрерывную съемку камерой микроскопа для увеличения скорости обработки образцов. Пока что мы сталкиваемся с ограничениями обеих камер и скоростью «прокрутки».
  • У одного вида некоторые стадии развития отличаются количеством ног — некоторые из них могут просто не попасть в кадр. Такие примеры могут застать врасплох даже профессионалов с многолетним стажем.
  • Когда изображения претерпевают значительные системные изменения, мы переключаемся в полностью ручной режим. Например, когда наступает лето, в воде появляется множество дополнительных объектов. Мы на самом деле не учитываем эти объекты, но они, безусловно, существуют. Обычно специалисты НИИ знают, что видят, и пропускают мелкие нюансы. Для нейронных сетей это тренировочный сезон.

Реализация в облаке

Все делаем в Яндекс Облаке, используя сервисы платформы.

Мы создали онлайн-портал с образцами альбомов изображений для сотрудников Института. Это веб-сайт, созданный с помощью Python и FastApi, который работает в Compute Cloud, хранит данные в Managed MongoDB и хранит изображения в Object Storage.

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

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

Мы создали компактный сервис распознавания, которому мы передаем сообщения через механизм Message Queue. В сервисе используются старые добрые Faiss и ONNX для нейросетей.

Ручная маркировка

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

Открытые данные

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

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

Ссылка ведет на набор данных с размеченными изображениями из-под микроскопа. Файл JSON содержит объекты, каждый из которых соответствует одному объекту в воде — ракообразному или водоросли.

Для каждого объекта мы предоставляем:

  1. ссылка на изображение, содержащее объект
  2. многоугольник или прямоугольник с объектом внутри
  3. метка класса объекта

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

В наши планы по набору данных входит разделение на обучающую и проверочную части в виде временных рядов и установление некоторого базового уровня.

Что дальше?

У нас много планов.

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

Эти исследования помогут выявить проблемы баланса микроорганизмов в озере на ранней стадии и сохранить Байкал для будущих поколений.