Задача
Наша компания занимается разработкой ПО и промышленной видеоаналитикой — это когда видеокамеры в сочетании с софтом автоматизируют процессы контроля и управления на крупных предприятиях. Более 20 лет исследований и работы с CV, AI, ML принесли нам опыт, которым мы готовы делиться.
Наши продукты не применяются для распознавания номеров машин, чтобы открывать шлагбаум. Они решают более сложные, а подчас нереальные задачи. Одна из таких случилась с нами относительно недавно.
Для выполнения задачи мы использовали специально обученную нейронную сеть и инструмент трекинга — слежения за каждой свинкой персонально. Концепция такова: над коридором, где проходят животные из транспортировщика в ангар, устанавливается видеокамера. Сверху компьютерное зрение видит движение, распознает в нем каждую свинью в отдельности и следит за ее траекторией движения. Если хрюша прошла от левой части экрана в правую и окончательно исчезла из кадра — срабатывает счетчик.
Важно обратить внимание, что свиньи не двигаются линейно по прямой слева направо, это то еще броуновское движение. Поэтому использовали именно трекинг и отказались от идеи подсчета животного по факту пересечения условной линии в центре кадра. Пересечение могло быть неоднократным — туда-сюда, и это все один и тот же свин.
Инструменты реализации
Распознавала в кадре свинью специально обученная нейронная сеть. Выбор ее архитектуры, фреймворка для обучения делался на этапе планирования. При этом учитывались знания разработчика о том, как обучать и настраивать ту или иную нейронную сеть, нужные гиперпараметры.
Гиперпараметры — это набор параметров для алгоритмов машинного обучения, которые определяют общие свойства. Например, размерность входного слоя нейросети, скорость обучения. В процессе нейронной моделью определяется функция стоимости.
Это функция от набора данных, которые в текущий момент обрабатываются. При анализе ошибки потерь функции, можно сделать вывод, качественно мы обучаемся или нет. Цель — минимизация этой ошибки. Чем ниже потери, тем меньше расхождения данных от сети и размеченных данных.
Сначала мы выбрали 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.
Главное, понять, где ошибается сеть. Скорректировать ее ошибки и увеличить точность до необходимой можно на новых размеченных данных.
Сеть в рамках своих знаний-умений обрабатывает кадры. Затем на основе признаков изображения расставляет весовые коэффициенты для каждых данных. Сравнивает свои результаты с результатами, которые были даны ей человеком на разметке. Сопоставляет, а затем с использованием специальных механизмов начинает обратное распространение ошибки, чтобы ее минимизировать.
Тестировщики усердно вычисляли свиней, на которых происходит ошибка, находили закономерности и причины.
Третий шаг. Человек — не свинья
Нейронная сеть «смотрит» примитивами — геометрическими фигурами. Для нее здание — это прямоугольник, изыски архитектурного декора она уже не оценит. Розовая свинка — это светлый овал. И когда в кадре появился сотрудник в белом халате, нейросеть радостно причислила его к тому же классу. А иногда и делала ложные срабатывания на каски и лопатки, которыми направляли животных.
В погоне за точностью мы выставляли высокие пороги достоверности. Порог 0,8 означает: если нейросеть уверена, что определила именно свинью на 80% и более — данные отображались, если меньше 80% — игнорировались.
Человек в белой спецодежде, с точки зрения нейронной сети, очень похож на целевой объект
Более того, как бы ни была печальна реальность — не все свиньи попадали в колбасу. Часть из-за своего физического состояния отказывалась двигаться в потоке, а иногда и двигаться вообще. Умерших и забитых вручную в коридоре свиней нужно было также удалять фильтрацией. Тут вводили специальные пороги для трекера. Они учитывали ситуацию и отсекали неподвижную хрюшу, которую утащили за пределы зоны коридора.
Тестировщики принесли на рабочее место валерьянку и пустырник.
Четвертый шаг. Хрюши бывают разные
Взяли новое видео. Прогнали данные. Нейронная сеть показала себя «свиным расистом» и не считала за хрюш тех, кто не чисто розовый. Надо сказать, что чистыми в принципе свиньи бывают не каждый раз, а у некоторых — порода от рождения подразумевает разный цвет, а то и черную шерсть.
Добавляем новый объем репрезентативных изображений в дата-сет — теперь с разноцветными, грязными и мохнатыми животными. Отправляем нейросеть учить матчасть заново.
Свинья с бурыми пятнами
Тестировщики вместо овец на ночь начали считать свиней.
Пятый шаг. Свинское поведение
Нейронная сеть хорошо решает задачу детекции и классификации — увидеть и сказать: «Это свинья». Однако задача касалась именно учета — «сколько точно вешать в граммах». Хрюши ведут себя по-свински. Это плотное, хаотичное движение бок о бок, рыло о рыло, иногда выход за кадр и появление обратно раз 15.
Учить софт быть Вангой тоже пришлось в несколько итераций. В свинячьем случае просто продлить вектор по прямой не получится. Сначала делали расчет близости объектов, затем уже принимались во внимание скорость, ускорения, инерционность, допустимый сектор движения, предикативность, радиус возможной посадки. И так до достижения необходимой нам точности.
Здесь вы можете посочувствовать нашим окончательно «усвинячевшимся» тестировщикам. Они вынуждены были смотреть видео по нескольку раз и считать снова и снова, покадрово листая и считая вручную животных, сбиваясь в хаосе туш, изобретая новые формулировки в русском языке.
Посчитать хрюш в движении с первого раза было очень непросто
Цифры и факты
На презентации пилота заказчику нейронная сеть показала точность 98%. Достичь этой планки позволила скрупулезная работа над показателем на каждом этапе задачи. Невозможно доработать до максимальной детекции, но не протречить, или хорошо протречить, но использовать посредственный детектор.
Учеба нашей нейросети была основательной. У нас ушло около 10 терабайт видеоматериалов, шесть месяцев времени, а дата-сет состоял из более 110 тысяч изображений самых различных свиней.
Ни один тестировщик не пострадал.
«Свинку жалко»
Задача автоматического учета приемки животных на АПК стоит в нашем опыте на особенном месте.
- Во-первых, озадачила точность в 99,9% при абсолютной однотипности и кучности считаемых объектов. Многие просто не верили, что это реально.
- Во-вторых, эти однотипные объекты не двигались ни по алгоритму, ни по команде, а как захотелось.
- В-третьих, некоторые разработчики просто отказывались работать с контентом по морально-этическим причинам. Одно дело видеть на столе колбасу и копченый окорок, другое — смотреть на живых свиней и производственный процесс.
Конкретно эту обученную нейронную сеть не получится масштабировать на учет других животных. Разве что попытаться считать схожих по размеру и цвету овец и быть готовым к снижению точности результата. Но наработанные принципы, алгоритмы работы и трекинг прекрасно ложатся в новые похожие задачи. После хрюш нам любая задача по плечу.
Материал был обновлен в 18:08 6 сентября 2019 года.
Фото в материале: Freepik
Фото на обложке: Unsplash