Вт. Фев 20th, 2024

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

Сен 6, 2019

[ad_1]

Задача

Наша компания занимается разработкой ПО и промышленной видеоаналитикой — это когда видеокамеры в сочетании с софтом автоматизируют процессы контроля и управления на крупных предприятиях. Более 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. В-третьих, некоторые разработчики просто отказывались работать с контентом по морально-этическим причинам. Одно дело видеть на столе колбасу и копченый окорок, другое — смотреть на живых свиней и производственный процесс.

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

Related Post