Колонки

Как мы обучили нейронку распознавать свиней с точностью 99,9%

Колонки
Фарид Нигматуллин
Фарид Нигматуллин

Генеральный директор компании «ВидеоМатрикс»

Полина Константинова

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

Как мы обучили нейронку распознавать свиней с точностью 99,9%

Задача

Наша компания занимается разработкой ПО и промышленной видеоаналитикой — это когда видеокамеры в сочетании с софтом автоматизируют процессы контроля и управления на крупных предприятиях. Более 20 лет исследований и работы с CV, AI, ML принесли нам опыт, которым мы готовы делиться. 

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

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

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

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

Инструменты реализации

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

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

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

Сначала мы выбрали Single Shot Detector 300х300, дающий примерную точность на старте 50%. Этот детектор смог потянуть CPU на сервере заказчика, GPU был приобретен уже позже. Разница между центральным и графическим процессором — как минимум в скорости обработки кадра. Условно: на CPU один кадр обрабатывается 30 секунд, на GPU — секунду.

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

Если будем каждый раз размечать картинку и обучать сеть на новом, то просто не хватит времени разработки — перестраиваться с одного фреймворка на другой и обратно. Для SSD-детектора используется XML-разметка. Она представляет из себя документ, в котором для каждого изображения указаны координаты описывающего прямоугольника и различные параметры изображения (ширина, высота, прочее). Такой учебник для нейронной сети.

Пример файла разметки

Кроме XML, есть JSON -азметки (для сетей PyTorch, TensorFlow), есть просто текстовые файлы (для сети YOLO, мы их тоже иногда используем). Есть экзотические форматы разметок для работы в MATLAB, но они специфические и мало популярные. 

Основа выбрана. Дальше начинается циклический процесс: разметить на картинке свиней — дать посмотреть разметку нейронной сети — запустить ее на тестовом видео от заказчика — посмотреть результат — найти причины ошибок — скорректировать — повторить цикл. И так до точности 99%.

Первый шаг

После первой разметки и этапа обучения нейронная сеть показала точность 60%. Работы предстояло еще немало.

Пример кучности свиней — попробуй различить кто-где

Сеть прекрасно видела одну-две свиньи в кадре, но как только их набегала толкающаяся хаотичная толпа, нейронная модель «сдавалась». При этом функционал трекера делал упор именно на обработку скоплений, что в дальнейшем сильно помогло. 

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

Второй шаг. Есть счастье в GPU

Надо сказать отдельное спасибо заказчику, который безукоризненно поставлял новые объемы видеосъемки с производства для обучения и тестирования нейросети, а вскоре и приобрел GPU. Так мы смогли перейти на модель большей размерности — SSD 512.

После очередной итерации обучения, как различать в массиве одинаковых спин каждую отдельную свинью, нейронная сеть показала результат 95%. Оставалось чуть-чуть и одновременно очень много — еще 4% до цели. 

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

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

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

Третий шаг. Человек — не свинья

Нейронная сеть «смотрит» примитивами — геометрическими фигурами. Для нее здание — это прямоугольник, изыски архитектурного декора она уже не оценит. Розовая свинка — это светлый овал. И когда в кадре появился сотрудник в белом халате, нейросеть радостно причислила его к тому же классу. А иногда и делала ложные срабатывания на каски и лопатки, которыми направляли животных. 

В погоне за точностью мы выставляли высокие пороги достоверности. Порог 0,8 означает: если нейросеть уверена, что определила именно свинью на 80% и более — данные отображались, если меньше 80% — игнорировались.

Человек в белой спецодежде, с точки зрения нейронной сети, очень похож на целевой объект

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

Тестировщики принесли на рабочее место валерьянку и пустырник. 

Четвертый шаг. Хрюши бывают разные

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

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

Свинья с бурыми пятнами

Тестировщики вместо овец на ночь начали считать свиней. 

Пятый шаг. Свинское поведение

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

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

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

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

Посчитать хрюш в движении с первого раза было очень непросто

Цифры и факты

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

Для достигнутых нами в окончательном итоге 99,9% нельзя компенсировать одно другим, срабатывает только суммарный синергетический эффект всех составляющих.

Учеба нашей нейросети была основательной. У нас ушло около 10 терабайт видеоматериалов, шесть месяцев времени, а дата-сет состоял из более 110 тысяч изображений самых различных свиней.

Ни один тестировщик не пострадал. 

«Свинку жалко»

Задача автоматического учета приемки животных на АПК стоит в нашем опыте на особенном месте. 

  1. Во-первых, озадачила точность в 99,9% при абсолютной однотипности и кучности считаемых объектов. Многие просто не верили, что это реально.
  2. Во-вторых, эти однотипные объекты не двигались ни по алгоритму, ни по команде, а как захотелось.
  3. В-третьих, некоторые разработчики просто отказывались работать с контентом по морально-этическим причинам. Одно дело видеть на столе колбасу и копченый окорок, другое — смотреть на живых свиней и производственный процесс.

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

Материал был обновлен в 18:08 6 сентября 2019 года.
Фото в материале: Freepik
Фото на обложке: Unsplash

Нашли опечатку? Выделите текст и нажмите Ctrl + Enter

Материалы по теме

  1. 1 Словарь: чем различаются машинное и глубокое обучение
  2. 2 В сети появилось приложение, «раздевающее» женщин с помощью нейросети
  3. 3 Нейросеть научили генерировать случайные резюме
  4. 4 Как Uber применяет в бизнесе машинное обучение
  5. 5 Дышащие куклы, VR и нейросети-сценаристы — как технологии меняют индустрию кино

Актуальные материалы —
в Telegram-канале @Rusbase

ПРОГРАММЫ И КУРСЫ

21 октября — 9 декабря 2019

Управление проектами

21 — 22 октября 2019

NIFI: Кластер Apache NiFi

22 октября 2019 — 22 января 2020

iOS разработчик с нуля до junior