Привет! Я Ярослав Шмулев, датасаентист, выпускник МФТИ и технический директор студии 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-разработке для энтерпрайза.
С людьми так можно?
собираем дата сет