Ежегодно порядка 200 студентов и выпускников присоединяются к Mars в России в качестве стажеров или участников лидерской программы. Дмитрий Коржиманов, прошел стажировку в IT-хабе Mars этим летом. В нашем блоге Дмитрий рассказывает о проекте, над которым он работал во время стажировки.
Большое количество компаний предлагают стажировки для студентов начиная с третьего курса. Вот и я, как и многие мои однокурсники, оканчивающие третий курс, задался целью найти стажировку на лето. На мехмате МГУ студенты предпочитают IT и банковскую сферы, что совсем неудивительно, ввиду наличия приличного количества математических задач и там, и там. Я рассматривал стажировки в разных компаниях и выбрал Mars, так как меня заинтересовала возможность поработать в IT-проектах на реальном производстве. Ко всему прочему Mars – международная компания, а значит работа предстояла в команде со всего мира.
Если кто-то не знаком с компанией, Mars – одна из крупнейших в мире FMCG-корпораций, которая производит кондитерские изделия, жевательную резинку, продукты питания и корма для домашних животных. В портфеле компании такие известные бренды, как M&M’s, SNICKERS, PEDIGREE, ROYAL CANIN, WHISKAS, ORBIT, SKITTLES, DOLMIO и другие. В России у компании более 6000 сотрудников, 10 производственных площадок, научный центр, а также здесь базируется один из мировых IT-хабов Mars.
Пройдя технические и вербальные тесты, а также интервью с будущим наставником, мне прислали оффер и, о чудо, я стал стажером команды Next Generation Technologies. Этот отдел состоит из 5 человек из разных стран мира и занимается, в первую очередь, внедрением технологий машинного обучения в различные циклы производства и реализации продукции компании.
Честно сказать, я не мастер алгоритмов машинного обучения и на момент начала стажировки у меня не было полного понимания, чем буду заниматься и как буду реализовывать проекты. Да, я обладал неплохой математической подготовкой и даже знал, что такое Random Forest, но на этом мои знания заканчивались. Среди прочего, в Mars возникает большое количество задач, связанных с компьютерным зрением, и наша команда успешно их решает. Так вышло, что первые 2 недели стажировки я разбирался, как устроены нейросети, что такое OpenCV, какие метрики существуют, как работать с PyTorch и TensorFlow и много-много еще с чем. Голова кипела к концу каждого дня, ведь информацию пришлось поглощать в огромных количествах, а идеи некоторых алгоритмов оказались довольно нетривиальными. Благо, на данный момент существует огромное количество действительно полезных ресурсов таких, как Neurohive, Medium и тот же самый Хабр (выражаю огромную благодарность всем, кто пишет здесь статьи на тему машинного обучения, без вас погружение в тему было бы намного более трудным занятием). Благодаря этим ресурсам можно изучать ту или иную тему с довольно высокой скоростью. Не в стороне остается и Coursera, лекции на которой я смотрю до сих пор.
Вникнув в некоторые фундаментальные основы глубокого обучения и немного освоившись, мне предложили принять участие в проекте. Нам предстояло реализовать программу, измеряющую объекты на фотографии. Конечно, возникает вопрос: зачем это нужно FMCG-компании? Однако ответ довольно простой: для ведения статистики размеров сырья и продукции на фабрике. Например, Mars производит M&M’s, и я думаю, многие пробовали M&M’s с арахисом. Однако, чтобы каждая конфета была не слишком большой и не слишком маленькой, арахису тоже следует быть определенного размера.
Как известно, в мире нет ничего идеального и партии приходят на фабрику совершенно разного качества. Поэтому специальному человеку приходится вручную (!) делать выборку из партии орехов и составлять статистику по ним. Естественно, в какой-то момент компания осознала, что процесс довольно неэффективный и было бы неплохо его автоматизировать. Задача по факту довольно простая и все, что тут требуется – научить модель находить орехи или иные объекты, скажем, на листе формата А4, а также напечатанный на ней ориентир заведомо известного размера, по которому пиксели перейдут в реальные единицы измерения. Звучит довольно тривиально, но на деле обычно начинают возникать сложности. Мне поручили заняться реализацией части, относящейся к распознаванию этого самого ориентира и переводу пикселей в миллиметры.
Крупные компании обращают серьезное внимание на соблюдение своей корпоративной идентичности, что сыграло роль и в моем проекте. В качестве ориентира или reference point, который будет печататься на бумаге на фабриках по всему миру, был выбран круг с характерной для компании вписанной в него буквой “М”.
Для решения своей задачи я сразу начал искать хорошие примеры реализации сверточных нейронных сетей, способные быстро и четко находить объекты на фото. Ознакомившись с различными вариантами, я выбрал одну из реализаций Faster R-CNN и изучил ее возможности и архитектуру. Следующим шагом было обучение модели, для этого была сгенерирована примерно сотня фотографий с рандомизированным расположением reference point и соответственно квадрата, описывающий его. На этом этапе мне очень помог пакет reportlab. Это набор инструментов, разработанный специально для генерации документов с настраиваемым расположением объектов на них.
Для аугментации был выбран пакет albumentations, возможности которого довольно впечатляющие. На Github вы можете прочитать о нем подробнее, там в том числе представлено сравнение с альтернативными библиотеками. Я старался сделать преобразования как можно более разнообразными, чтобы не осталось так называемых “черных ящиков”. Повороты, изменение масштаба, изменение контрастности, добавление шума и прочие стандартные приемы. К сожалению, возникла проблема с инструментом поворота (Rotate), которая была мне необходима, ведь никто не давал гарантии правильной ориентации буквы М на фотографии, а модель должна была быть способна распознавать разные варианты ее положения.
Как бы я не пытался найти ошибку, функция из пакета albumentations упорно продолжала делать некорректные преобразования bounding box, смещая его в неверном ключе. Как итог, я решил применить классический пакет imgaug, проблем с которым у меня не возникло.
Обучив сеть на нескольких эпохах, мне стало интересно, какой результат будет выдавать модель на реальных примерах. Распечатав лист бумаги с reference point на нем и сделав несколько фотографий, я принялся тестировать нейросеть. И да, она действительно научилась находить то, что нужно, но делала это далеко не идеально. Те границы, которые выдавала сеть, были слишком неточными для качественного измерения объектов, и тут началось довольно неприятный процесс подгонки параметров в поисках идеальной конфигурации. Я менял шаг обучения, пытался изменить архитектуру сети, доучивать ее, менять настройки аугментации, но средний IoU так и не поднялся выше 0,85.
Результат работы Faster R-CNN
Увы, моя неопытность сыграла со мной злую шутку. Предварительно не занявшись поиском более простых инструментов, я слишком сильно увлекся экспериментами с нейросетью, но как бы я не пытался, она не давала приемлемого результата. В процессе работы еще оказалось, что на производстве попросту не используются цветные принтеры, и все мои старания, казалось, были напрасны. Но тут мой коллега подсказал мне, что можно использовать обычный черный круг и преобразование Хафа из пакета OpenCV для его обнаружения. Это же простое решение я мог использовать и для первоначального варианта, однако не обратил должного внимание на классические инструменты компьютерного зрения. Немного поигравшись с параметрами, я наконец получил то, что хотел, и задача была решена. Следующий этап – создание API с помощью пакета Flask и релиз программы на сервере Azure, но это уже совсем другая история.
Финальный результат с помощью Hough transformation
Помимо задач компьютерного зрения в компании возникают задачи из других областей машинного обучения – от обработки твитов для мониторинга восприятия того или иного продукта, до разработки программ, помогающих ветеринарам эффективнее лечить животных. Что для меня стало приятным сюрпризом – так это исследовательская часть работы. Зачастую задачи звучат очень просто, но неизвестно как найти их качественное решение. Для этого приходится изучать статьи и актуальные методы в области Machine Learning. Так, например, мне пришлось разобраться в байесовских методах машинного обучения, которые очень популярны для решения медицинских задач. Благодаря этому я смог изучить медицинские статьи, описывающие применение этих методов, и помочь команде выбрать правильный вектор разработки.
На данный момент я завершаю свою стажировку. Так как наступает новый учебный год, в сентябре я перешел на неполный рабочий день, что не является какой-либо проблемой. Кроме того, в компании есть возможность работать из дома и, как оказалось, подобная практика здесь довольно сильно распространена. Сейчас наша команда заканчивает проект, описанный мною в статье, и переходит на новый, связанный с компьютерным зрением. Задач действительно много и все они совершенно разные, поэтому скучать не получится.
Сейчас открыт набор на стажировки в Mars, узнать больше и подать заявку можно на: сайте.
ссылка на оригинал статьи https://habr.com/ru/company/marsis/blog/476266/
Добавить комментарий