Как понять что свинюшка готова к любви? Определяем через ML
Привет! Я Ярослав Шмулев, датасаентист, выпускник МФТИ и технический директор студии R77. Мы внедряем AI в корпорации, а сегодня я расскажу, как мы анализировали поведение свинок с помощью ML, чтобы выявить идеальный момент для их оплодотворения.
Сразу скажу, что этот проект мы делали с Вовой Захаровым, когда еще работали в Джете. Так что в кейсе немного пропиарим Джет, немного Русагро Тех — клиента. Расскажем, что интересного было, но без супер конфиденциальных подробностей. Сам проект, кстати, открытый.
Пока накидаю главные тезисы кейса:
- Избавили комбинат от «ручного» определения овуляции свиней
- Проанализировали снимки почти 6000 хрюш с помощью ML
- Научились определять, нравится ли свинкам хряк — по положению в загоне и позам
- Разработали классификатор поз
- Достигли точности обнаружения 0,99+, качества классификации поз — 0,92+
- Выгрузили все данные по особям в табличку для зоотехников
Поймать тот самый момент
Свинки, как и люди, не всегда беременеют с первого раза. Задача — найти лучший момент для их осеменения, чтобы знать, какая из них точно даст потомство.
Если осеменить животное в период овуляции, то метрики комбината, — выживаемость, количество потомства, вероятность зачатия, число животных в помете, — улучшатся. Некоторые показатели вырастут чуть ли не кратно.
Узнаем, как работает биология хрюшек
Когда мы приехали на одну из ферм Русагро, чтобы лучше понять задачу, мы пообщались с зоотехниками, которые самостоятельно определяют готовность свиноматок к осеменению. Они поделились гипотезами, что на это может влиять, и рассказали, как определяют овуляцию.
Всех хрюшек можно разделить на два типа: свиноматки и хряк. Свиноматки находятся в индивидуальных загонах. А хряк гуляет по коридору и проходит мимо свиноматок. Его задача — вызвать реакцию у хрюшек, чтобы определить их готовность к любви.
Определить, готова ли свиноматка, — задача со звездочкой. Пока хряк гуляет по тоннелю, зоотехники внимательно смотрят за реакцией каждой свинки: активна она или нет, как близко подходит к хряку, трется ли задней частью об ограждение, навостряет ли ушки.
Еще есть признаки, которые можно отнести к категории «18+». Один из них связан с визуальными изменениями половых органов свинок, на которые специалисты тоже обращают внимание.
Обычно это делается так: ветеринары запускают «хряка-пробника» по коридору и внимательно наблюдают за поведением каждой свиноматки. Но следить за свиньями, когда их тысячи, тяжело. Поэтому важно автоматизировать процесс — мы сделали это с помощью Computer Vision.
Начали с камер
Мы установили шесть камер на рельсах под потолком, чтобы следить за свинками. Каждая камера охватывает свою зону, и каждое животное попадает только в одну из них. Чтобы захватить больше загона, использовали широкоугольники, но они искажают картинку, создавая эффект «рыбьего глаза».
Мы пробовали исправить это с помощью undistortion и выделили зону интереса — восемь центральных свиноматок (четыре слева и четыре справа). Но это было неэффективно, зато усложнило процесс и увеличило нагрузку. Поэтому оставили всё как есть.
С камерами разобрались: они снимают, что нужно. Данные у нас тоже были: 720 размеченных изображений для обучения (почти 6000 свиней) и ещё 360 для тестирования.
Что именно решили отслеживать
Задача — создать систему, которая определяет состояние каждой свиноматки в любой момент времени. Нам нужно было отслеживать три ключевые вещи:
- В какой позе находится хрюшка?
- В какой части загона стоит (в передней, средней или задней части)?
- Гуляет ли рядом хряк-пробник?
Классифицируем признаки
Всего есть пять положении, в которых может находиться свинья: лежит на животе, лежит на правом/левом боку, сидит или стоит. Еще мы ввели шестои класс и назвали его «нельзя однозначно определить позу». Он встречается довольно часто, и это связано с ракурсом съемки и другими факторами. Их мы обсудим чуть позже.
Далее. Положение в загоне — тут все просто. Всего лишь три варианта: свинья находится спереди, по центру либо сзади. Третий фактор — хряк-пробник. Для каждой свинки мы просто отмечаем, есть ли рядом с ней хряк-пробник или нет.
Определили метрики оценки эффективности
Их было две. Первая — метрика обнаружения, которая показывала, насколько точно мы определяем свинок в их загоне. Доля правильно найденных свиней должна быть 0,95+. Вторая метрика — точность определения поз свиней, требование к ней должно быть 0,90+.
Локализация и классификация
Теперь важно найти свинок и классифицировать их позы (мы назвали это локализацией и классификацией).
Есть два способа это сделать. Первый — использовать детектор, который сразу определяет местоположение конкретной хрюши и понимает, чем она в конкретный момент занята. Второй — сделать две модели: одну для локализации (она просто находит свиней), другую — для классификации поз. Последняя будет работать с фрагментами изображений, вырезанными детектором.
Можно подумать, что проще использовать одну модель, ведь она быстрее и эффективнее с точки зрения производительности. Но мы решили, что две модели смогут дать более точный результат — хотя и будут работать чуть медленнее.
Мы протестировали оба варианта. А ниже, в табличке, записали результаты этих тестов. Важно понимать, что точность классификации здесь объединенная: если детектор не сработал, то точность классификации тоже снижается.
Что касается детектора, то мы попробовали несколько. Первый — Faster RCNN, показал себя не очень (0,816). Второй — детектор семейства Yolo (отвечает и за локализацию, и за классификацию), был получше. Его точность составила 0,925 при требуемых 0,9.
Еще мы рассматривали Yolo для локализации плюс другие классификаторы для обработки кропов. Теоретически, это могло бы быть точнее, но на практике результат был немного хуже (0,897 и 0,903). Поэтому выбрали чисто детектор Yolo.
Узнаем конкретных свиней в лицо
Мы видим свинок на камере, но пока не можем идентифицировать каждую конкретную. Чтобы решить эту проблему, мы разделили область обзора на статические зоны.
Первая зона — это индивидуальные загоны, которые мы пронумеровали от 0 до 7, чтобы каждая камера отслеживала 8 свиней. Внутри каждого загона также есть зоны: Front (перед), Center (центр) и Back (зад). Они помогают понять, где именно находится свинья.
Кроме того, мы выделили зеленую зону, через которую должен пройти хряк. Такие зоны мы настроили для каждой камеры.
Чтобы узнать положение свиней в загоне, мы использовали Bounting Box — прямоугольник, который ограничивает каждую свинью на фото. Его нижнюю часть мы проецировали на зоны Front, Сenter и Back, чтобы точно определить, в какой части загона находится хрюшка.
Детектим хряка и его положение относительно свинок-девочек
Осталась еще одна задача — определить близость хряка по отношению к каждой конкретной свинье. Решение здесь — одноклассовый детектор.
То есть, мы ищем только свиней, но с фокусом на определенную зону. Сначала находим всех свинок, затем проецируем их Bounting Box в статичную область, где обычно проходит хряк.
Как только мы нашли хряка, задача определить, находится ли он рядом с конкретной свиньей, становится простой. Мы берем Bounting Box хряка, проецируем его x-координаты на x-координаты свиней. Если области пересекаются, значит, свинья рядом с хряком.
Что делает свинка?
Иногда мы не понимали, лежат ли наши свинки на животе или на боку. И это стало проблемой.
Мы поняли, что специалисты на производстве и мы, разработчики, по-разному трактуем одну и ту же позу — а это в итоге приводит к непоследовательной разметке данных и ухудшает сходимость моделей.
Читайте дальше, а правильный ответ мы скажем в одном из следующих разделов)
Сделали шпаргалку с позами свиней
Мы решили детально обсудить каждый конкретный случай и каждую свинью с зоотехниками. Это заняло много времени, но в итоге мы сделали целую шпаргалку с позами.
В инструкции мы показали, как свинья может стоять или лежать. Составить такую инструкцию было сложно, но она стала ключом к получению последовательной разметки.
Но давайте вернемся к нашим свинкам из опросника выше. Если посмотреть на верхнюю часть туловища, то можно увидеть, что оно расположено прямо. И вроде бы свинка лежит на животе.
Но если посмотреть на нижнюю часть, то мы видим повернутые влево лапки. Стало быть, свинка лежит и на правом боку. И кажется, что раз туловище расположено прямо, а лапки повернуты набок, то верный ответ «нельзя однозначно определить позу».
Но правильный ответ здесь — «лежит на животе».
Решили переклассифицировать положения свинок
Когда мы доработали модель, учли все комментарии зоотехников по позам и пересобрали решение, оказалось, что на тестовых данных качество немного снизилось. Мы получили точность классификации примерно 0,89, а нужно было 0,9.
Проблема осталась прежней — путаница в классах. Самая частая ошибка была связана с тем, что свинья может лежать на животе или боку одновременно, и иногда сложно точно определить, к какому классу отнести ее позу.
Мы решили объединить три варианта «лежит на животе», «лежат на левом боку» и «лежат на правом боку» в один — просто «лежит».
Теперь у нас четыре основных класса: свинья лежит, сидит, стоит и «нельзя определить позу». Это уменьшило процент поз, которые не удалось распознать — ведь большинство пограничных случаев теперь попадали в класс «лежит».
А зачем вообще вводили так много классификаций вначале?
Заказчик рассматривал гипотезу, что положение на левом или правом боку может влиять на готовность к осеменению, но у нас не было данных, подтверждающих это.
Также мы хотели анализировать динамику движения свинок в положении лежа, например, как часто свинья переворачивается с одного бока на другой. Это могло бы дать зоотехникам дополнительную информацию о животных, чтобы потом как-то интерпретировать их поведение.
Объединили все в одну систему
У нас уже была предобученная модель — одноклассовый детектор, который использовался в других проектах Русагро. Модель обучалась на большом наборе данных и показывала отличные результаты. Мы адаптировали ее под нашу задачу и добавили классификацию поз.
После переразметки данных и объединения классов «лежит» мы добились таких результатов: точность обнаружения свиней — более 0,99, точность классификации поз — более 0,92.
Как это работает? Камеры снимают сцену, а ПО сохраняет изображения через несколько секунд. Затем подключается наш сервис Pigs Insemination, работающий в Docker с Python и Yolo. Он анализирует фото и выдает Excel-файл с данными по каждой свинье.
На каждом снимке определяется: ID загона, поза свиньи, её положение и наличие рядом хряка. Например, видно, что 7 свиней стоят у передней части загона и, возможно, готовы к осеменению, а одна лежит сзади и ещё не готова.
А вот в каком виде данные подгружаются для анализа поведения особей:
Очень удобно — особенно для специалистов, которые принимают решения на основе цифр, а не изображений.
Что в итоге
Сейчас система помогает отслеживать поведение свинок в реальном времени — что удобно, когда поголовье большое. Мы можем использовать эти данные, чтобы предсказать лучший момент для осеменения каждой хрюши. Это гораздо проще, чем раньше, когда специалисты следили за свинками очно.
Пока не можем точно сказать, как разработка повлияла на бизнес-метрики — оставили эту часть аналитикам Русагро. Но как-нибудь спросим у них про цифры и дополним материал)
Подписывайтесь на нас везде
Спасибо, что дочитали! Подписывайтесь на наш телеграм-канал. Там не будет новостей о новом ChatGPT. Только живые кейсы о хардкорной AI-разработке для энтерпрайза.
С людьми так можно?
собираем дата сет