В настоящее время основным ограничением для работы нейронных сетей в периферийных средах, таких как raspberry pi, является ограниченное аппаратное обеспечение. Сети, которые имеют много параметров или используют сложную логику в своей обработке, требуют большого объема памяти и вычислительной мощности. Чтобы удовлетворить эту потребность, появились различные методы оптимизации, такие как сокращение и квантование, чтобы оптимизировать эти сети, однако не всегда возможно поддерживать качество. Но возможно ли запустить эффективную сеть хорошего качества в ограниченной пограничной среде? В этом посте мы обсудим ESPNetv2, сеть, в основе которой лежит легкость по конструкции, но при этом сохраняется уровень качества, равный (или даже выше) современным сетям глубокого обучения, таким как Yolov2 и Mobilenetv1.

В день написания этого поста существует еще одно ограничение на запуск нейронных сетей в среде raspberry pi, и это ограничение касается совместимости фреймворков глубокого обучения с архитектурой Pi. ESPNetv2 полностью построен на PyTorch, структура которого пока недоступна для архитектур armv7l. Для этого мы используем метод кросс-компиляции для создания предварительно скомпилированных файлов PyTorch и Torchvision .whl в архитектуре armv7l. Если у вас есть время, эти библиотеки можно скомпилировать вручную, однако некоторые процессы компиляции могут занять дни (и завершиться сбоем из-за нехватки памяти). Другой библиотекой, у которой еще нет версии для armv7l, является OpenCV, которая также требуется для запуска ESPNetv2, и для нее мы подготовили сценарий установки с необходимыми шагами, однако этот сценарий может занять некоторое время в зависимости от среды. Судя по нашим тестам на raspberry pi 3 модели B+, этот процесс может занять до 7 часов. Полное руководство о том, как легко установить Pytorch, Torchvision и OpenCV на raspberry pi, можно найти здесь. С помощью этих файлов вы сможете запускать не только ESPNetv2, но и большинство других сетей, использующих инфраструктуру Pytorch (и они достаточно малы для работы в этой среде).

Ниже вы можете проверить некоторые результаты, касающиеся средней средней точности (mAP) сети ESPNetv2, которая является показателем качества для измерения точности модели, выполняющей обнаружение объектов, т. е. чем выше, тем лучше. И количество операций с плавающей запятой в секунду (FLOPS), которое является метрикой, которая сообщает нам количество умножений, которые происходят в секунду на машине, то есть чем меньше, тем лучше. Эта таблица была взята из официальной статьи сети.

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

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

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

Учитывая объяснение, давайте перейдем к главному пункту этого поста. Как запустить эту сеть в среде Raspberry Pi? Просто, если вы прочитали руководство о том, как установить зависимости, необходимые для запуска ESPNetv2 на raspberry pi (и смогли их установить), вам просто нужно перенаправить в официальный сетевой репозиторий на github, загрузить его и запустить демонстрационный файл. однако для задачи обнаружения объектов в день публикации этого поста у ESPNetv2 были некоторые проблемы, связанные с ошибкой сегментации, когда вы пытаетесь сделать выводы о raspberry pi, к счастью, у нас был процесс отладки сети, и мы смогли решить эту проблему. Мы сделали запрос на включение в репозиторий, чтобы исправить эту проблему, которая уже связана с кодом ESPNetv2.

Чтобы выполнить обнаружение объектов на raspberry pi с помощью ESPNetv2, просто загрузите его репозиторий и выполните следующую команду:

$ python3 detection_demo.py

Без параметров эта команда будет делать выводы об изображениях, содержащихся в папке sample_images, и сохранять такие выводы в папке vis_detect. Вы можете передать этому скрипту несколько параметров, например — im-dir, чтобы выбрать собственную папку с изображениями, — im-size, чтобы выбрать предварительно обученную модель с изображениями размером 300 пикселей или 512 пикселей, среди других параметров. Мы настоятельно рекомендуем открыть сценарий обнаружения_demo.py в предпочитаемом вами редакторе кода и проверить, какие параметры вам доступны.

Ознакомьтесь со сравнением ниже, когда делаете вывод об одном и том же образе на моделях SSD-Mobilenet v1 и ESPNetv2.

Заметно превосходное качество обнаружения ESPNetv2, которое, помимо обеспечения более точного обнаружения, также имеет большую глубину обнаружения объектов.

И готово! Вы только что запустили чрезвычайно эффективную сеть с высокой точностью обнаружения, и все это в ограниченной среде Raspberry Pi!