Стажировка в Mars Digital Technologies. Как мы применяли глубокое обучение на производстве M&M’s



    Всем привет!

    Ежегодно порядка 200 студентов и выпускников присоединяются к Mars в России в качестве стажеров или участников лидерской программы. Дмитрий Коржиманов, прошел стажировку в IT-хабе Mars этим летом. В нашем блоге Дмитрий рассказывает о проекте, над которым он работал во время стажировки.


    Большое количество компаний предлагают стажировки для студентов начиная с третьего курса. Вот и я, как и многие мои однокурсники, оканчивающие третий курс, задался целью найти стажировку на лето. На мехмате МГУ студенты предпочитают IT и банковскую сферы, что совсем неудивительно, ввиду наличия приличного количества математических задач и там, и там. Я рассматривал стажировки в разных компаниях и выбрал Mars, так как меня заинтересовала возможность поработать в 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, узнать больше и подать заявку можно на: сайте.
    Mars
    40,69
    Mars IT, Mars Digital, Mars Ступино
    Поделиться публикацией

    Комментарии 2

      0
      Сложно читать сплошное полотно текста. Даже если бы было разбито на бОльшое число параграфов — было бы уже сильно лучше. А лучше побольше картинок, конечно. Банально даже фотография рабочего места стажёра.
        0
        Артем, спасибо за комментарий.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое