Как понять что свинюшка готова к любви? Определяем через ML

Привет! Я Ярослав Шмулев, датасаентист, выпускник МФТИ и технический директор студии R77. Мы внедряем AI в корпорации, а сегодня я расскажу, как мы анализировали поведение свинок с помощью ML, чтобы выявить идеальный момент для их оплодотворения.

Сразу скажу, что этот проект мы делали с Вовой Захаровым, когда еще работали в Джете. Так что в кейсе немного пропиарим Джет, немного Русагро Тех — клиента. Расскажем, что интересного было, но без супер конфиденциальных подробностей. Сам проект, кстати, открытый.

Пока накидаю главные тезисы кейса:

  • Избавили комбинат от «ручного» определения овуляции свиней
  • Проанализировали снимки почти 6000 хрюш с помощью ML
  • Научились определять, нравится ли свинкам хряк — по положению в загоне и позам
  • Разработали классификатор поз
  • Достигли точности обнаружения 0,99+, качества классификации поз — 0,92+
  • Выгрузили все данные по особям в табличку для зоотехников

Поймать тот самый момент

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

Как понять что свинюшка готова к любви? Определяем через ML

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

Узнаем, как работает биология хрюшек

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

Всех хрюшек можно разделить на два типа: свиноматки и хряк. Свиноматки находятся в индивидуальных загонах. А хряк гуляет по коридору и проходит мимо свиноматок. Его задача — вызвать реакцию у хрюшек, чтобы определить их готовность к любви.

Как понять что свинюшка готова к любви? Определяем через ML

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

Еще есть признаки, которые можно отнести к категории «18+». Один из них связан с визуальными изменениями половых органов свинок, на которые специалисты тоже обращают внимание.

Как понять что свинюшка готова к любви? Определяем через ML

Обычно это делается так: ветеринары запускают «хряка-пробника» по коридору и внимательно наблюдают за поведением каждой свиноматки. Но следить за свиньями, когда их тысячи, тяжело. Поэтому важно автоматизировать процесс — мы сделали это с помощью Computer Vision.

Начали с камер

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

Как понять что свинюшка готова к любви? Определяем через ML

Мы пробовали исправить это с помощью undistortion и выделили зону интереса — восемь центральных свиноматок (четыре слева и четыре справа). Но это было неэффективно, зато усложнило процесс и увеличило нагрузку. Поэтому оставили всё как есть.

С камерами разобрались: они снимают, что нужно. Данные у нас тоже были: 720 размеченных изображений для обучения (почти 6000 свиней) и ещё 360 для тестирования.

Что именно решили отслеживать

Задача — создать систему, которая определяет состояние каждой свиноматки в любой момент времени. Нам нужно было отслеживать три ключевые вещи:

  • В какой позе находится хрюшка?
  • В какой части загона стоит (в передней, средней или задней части)?
  • Гуляет ли рядом хряк-пробник?

Классифицируем признаки

Всего есть пять положении, в которых может находиться свинья: лежит на животе, лежит на правом/левом боку, сидит или стоит. Еще мы ввели шестои класс и назвали его «нельзя однозначно определить позу». Он встречается довольно часто, и это связано с ракурсом съемки и другими факторами. Их мы обсудим чуть позже.

Как понять что свинюшка готова к любви? Определяем через ML

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

Определили метрики оценки эффективности

Их было две. Первая — метрика обнаружения, которая показывала, насколько точно мы определяем свинок в их загоне. Доля правильно найденных свиней должна быть 0,95+. Вторая метрика — точность определения поз свиней, требование к ней должно быть 0,90+.

Как понять что свинюшка готова к любви? Определяем через ML

Локализация и классификация

Теперь важно найти свинок и классифицировать их позы (мы назвали это локализацией и классификацией).

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

Как понять что свинюшка готова к любви? Определяем через ML

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

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

Как понять что свинюшка готова к любви? Определяем через ML

Что касается детектора, то мы попробовали несколько. Первый — Faster RCNN, показал себя не очень (0,816). Второй — детектор семейства Yolo (отвечает и за локализацию, и за классификацию), был получше. Его точность составила 0,925 при требуемых 0,9.

Еще мы рассматривали Yolo для локализации плюс другие классификаторы для обработки кропов. Теоретически, это могло бы быть точнее, но на практике результат был немного хуже (0,897 и 0,903). Поэтому выбрали чисто детектор Yolo.

Узнаем конкретных свиней в лицо

Мы видим свинок на камере, но пока не можем идентифицировать каждую конкретную. Чтобы решить эту проблему, мы разделили область обзора на статические зоны.

Как понять что свинюшка готова к любви? Определяем через ML

Первая зона — это индивидуальные загоны, которые мы пронумеровали от 0 до 7, чтобы каждая камера отслеживала 8 свиней. Внутри каждого загона также есть зоны: Front (перед), Center (центр) и Back (зад). Они помогают понять, где именно находится свинья.

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

Чтобы узнать положение свиней в загоне, мы использовали Bounting Box — прямоугольник, который ограничивает каждую свинью на фото. Его нижнюю часть мы проецировали на зоны Front, Сenter и Back, чтобы точно определить, в какой части загона находится хрюшка.

Детектим хряка и его положение относительно свинок-девочек

Осталась еще одна задача — определить близость хряка по отношению к каждой конкретной свинье. Решение здесь — одноклассовый детектор.

Как понять что свинюшка готова к любви? Определяем через ML

То есть, мы ищем только свиней, но с фокусом на определенную зону. Сначала находим всех свинок, затем проецируем их Bounting Box в статичную область, где обычно проходит хряк.

Как только мы нашли хряка, задача определить, находится ли он рядом с конкретной свиньей, становится простой. Мы берем Bounting Box хряка, проецируем его x-координаты на x-координаты свиней. Если области пересекаются, значит, свинья рядом с хряком.

Что делает свинка?

Иногда мы не понимали, лежат ли наши свинки на животе или на боку. И это стало проблемой.

Как понять что свинюшка готова к любви? Определяем через ML

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

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

Читайте дальше, а правильный ответ мы скажем в одном из следующих разделов)

Сделали шпаргалку с позами свиней

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

Как понять что свинюшка готова к любви? Определяем через ML

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

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

Как понять что свинюшка готова к любви? Определяем через ML

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

Но правильный ответ здесь — «лежит на животе».

Решили переклассифицировать положения свинок

Когда мы доработали модель, учли все комментарии зоотехников по позам и пересобрали решение, оказалось, что на тестовых данных качество немного снизилось. Мы получили точность классификации примерно 0,89, а нужно было 0,9.

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

Как понять что свинюшка готова к любви? Определяем через ML

Мы решили объединить три варианта «лежит на животе», «лежат на левом боку» и «лежат на правом боку» в один — просто «лежит».

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

Как понять что свинюшка готова к любви? Определяем через ML

А зачем вообще вводили так много классификаций вначале?

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

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

Как понять что свинюшка готова к любви? Определяем через ML

Объединили все в одну систему

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

После переразметки данных и объединения классов «лежит» мы добились таких результатов: точность обнаружения свиней — более 0,99, точность классификации поз — более 0,92.

Как это работает? Камеры снимают сцену, а ПО сохраняет изображения через несколько секунд. Затем подключается наш сервис Pigs Insemination, работающий в Docker с Python и Yolo. Он анализирует фото и выдает Excel-файл с данными по каждой свинье.

Как понять что свинюшка готова к любви? Определяем через ML

На каждом снимке определяется: ID загона, поза свиньи, её положение и наличие рядом хряка. Например, видно, что 7 свиней стоят у передней части загона и, возможно, готовы к осеменению, а одна лежит сзади и ещё не готова.

Как понять что свинюшка готова к любви? Определяем через ML

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

Как понять что свинюшка готова к любви? Определяем через ML

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

Что в итоге

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

Как понять что свинюшка готова к любви? Определяем через ML

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

Подписывайтесь на нас везде

Спасибо, что дочитали! Подписывайтесь на наш телеграм-канал. Там не будет новостей о новом ChatGPT. Только живые кейсы о хардкорной AI-разработке для энтерпрайза.

11
4 комментария

С людьми так можно?

2

собираем дата сет

2