Я обнаружил, что NCNN - это быстрая кроссплатформенная структура развертывания модели глубокого обучения. Особенно для мобильных приложений. NCNN активно используют openMP для ускорения работы нейронной сети.

Контрольный показатель:

Я протестировал производительность крошечной модели yolov2 при развертывании на Samsung S7 (телефон на базе Android qualcomm 820 SOC) с тензорным потоком, тензорным потоком lite и NCNN. Модель представляет собой простую игрушечную танковую детекторную модель yolov2 tiny с одним классом детектирования.

╔═══════════╦════════════════════╦═══════════════╗
║Deployment ║  Inference Time.   ║  Performance  ║
║           ║     (ms)           ║               ║
╠═══════════╬════════════════════╬═══════════════╣
║ Tensorflow║      45            ║    Good       ║
║ TFLite    ║      38            ║    Poor       ║
║ NCNN      ║      16            ║     OK        ║
║           ║                    ║               ║
╚═══════════╩════════════════════╩═══════════════╝

Где производительность - результат субъективного тестирования. Модель обучается с использованием darket, а ее cfg-файлы и файлы весов конвертируются в pb-файл tensorflow с помощью утилиты darflow. Затем pb преобразуется в tflite и ncnn для развертывания с TFLite и NCNN.

Пожалуйста, имейте в виду, что NCNN активно использует средства параллельных вычислений, такие как OpenMP, хотя он также имеет неоновую оптимизацию для ARM SOC. Когда вы устанавливаете его для работы в нескольких потоках, вы видите более быстрое время вывода, а также более высокую загрузку процессора. Следовательно, из-за этого увеличится энергопотребление вывода NCNN. В этом смысле он отличается от других реализаций, таких как Quacomm SNPE, который при работе на GPU или DSP действительно снижает энергопотребление с помощью SOC.

NCNN работает быстро. Однако преобразовать другие модели в NCNN для списания непросто. Я расскажу, как сделать преобразование модели для NCNN на примере yolov2 tiny model.

Преобразование модели для NCNN

Шаг 1: Загрузите и скомпилируйте NCNN с:

репозиторий github NCNN



Это система сборки на основе файлов, которую относительно легко скомпилировать для разных платформ. Если вы выполняете преобразование на Mac, следуйте инструкциям по сборке MacOS. Убедитесь, что в CMakeFile.txt включено построение инструментальной части. Вам понадобится caffe2ncnn & ncnn2mem. Я расскажу об использовании утилит.

Примечание: если вы хотите развернуть преобразованные модели NCNN на Android или iOS, вам также потребуется выполнить сборку для этих целей.

Шаг 2. Загрузите и установите caffe

Скомпилировать и установить caffe очень сложно. Пожалуйста, обратитесь к инструкциям для вашей платформы, чтобы скомпилировать и установить caffe в вашу систему, в которой вы хотите провести преобразование модели (uBuntu / Mac / Windows и т. Д.)

Репозиторий git расположен по адресу: Caffe at Github.



Вам действительно нужно кофе, чтобы совершить преобразование.

Шаг 3: Установите Pytorch-Caffe в Darknet Convert:



Это набор скриптов Python для преобразования модели. В частности, вам понадобится darknet2caffe.py. Но это зависит от кофе, установленного на шаге 2.

Шаг 4: конверсии

Предположим, что файлы вашей модели yolov2 tiny - это yolov2-tiny-voice.cfg, yolov2-tiny-voice.weights и labels.txt (для метки объекта обнаружения).

1). Преобразуйте модель даркнета в кафе:

$ python darknet2caffe.py yolov2-tiny-voice.cfg yolov2-tiny-voice.weights yolov2-tiny-voice.prototxt yolov2-tiny-voice.caffemodel

После выполнения этой команды модель yolov2-tiny конвертируется в формат модели кафе.

2). Редактирование файла модели caffe prototxt

Этот шаг очень важен. Благодаря этому преобразованная модель кафе будет совместима и развернута в NCNN.

Откройте yolov2-tiny-voice.prototxt и преобразуйте эти строки для входного слоя:

input: «данные»
input_dim: 1
input_dim: 3
input_dim: 416
input_dim: 416

to:

слой {
name: «data»
type: «Input»
top: «data»
input_param {shape: {dim: 1 dim: 3 dim: 416 dim: 416 }}
}

Вам также нужно будет отредактировать последний слой в yolov2-tiny-voice.prototxt и изменить его с:

слой {
bottom: «layer15-conv»
top: «layer16-region»
name: «layer16-region»
type: «Region»
region_param {
якоря: «1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52»
классы: 20
число: 5
}
}

на следующее:

слой {
name: «detect_out»
тип: «YoloDetectionOutput»
внизу: «layer15-conv»
вверху: «detect_out»
включить {
этап: ТЕСТ
}

yolo_detection_output_param {
num_classes: 20
coords: 4
trust_threshold: 0.5
#nms_threshold: 0.2
biases: 1.08
biases: 1.19
biases : 3,42
смещения: 4,41
смещения: 6,63
смещения: 11,38
смещения: 9,42
смещения: 5,11
смещения: 16,62
смещения: 10,52
}
}

* Примечание: при копировании и вставке приведенного выше кода не забудьте отредактировать символ двойной кавычки: «. Это должны быть двойные кавычки, как принято в обычном языке программирования.

Параметр «доверительный_порог: 0,5» можно изменить на значение достоверности, которое вы предпочитаете.

Теперь мы готовы преобразовать модель кафе в NCNN.

3). Преобразуйте caffe в NCNN, используя следующую команду:

$. / caffe2ncnn yolov2-tiny-voice.prototxt yolov2-tiny-voice.caffemodel yolov2-tiny_voc.param yolov2-tiny_voc.bin

Где создается caffe2ncnn при построении NCNN. Результат этого шага:

yolov2-tiny_voc.param и yolov2-tiny_voc.bin

Файл .param - это файл описания сети, а файл bin - файл весов.

К настоящему времени вы можете развернуть и использовать модель NCNN. Однако, если вы хотите развернуть модель для платформы Android, вам нужно будет преобразовать файл .param в зашифрованный двоичный файл с помощью следующей команды:

./ncnn2mem yolov2-tiny_voc.param yolov2-tiny_voc.bin yolov2-tiny_voc.id.h yolov2-tiny_voc.mem.h

где ncnn2mem создается при сборке пакета NCNN.

Пример проекта на Android

У меня есть образец приложения для Android, которое открывает камеру Android и передает изображение в ncnn для вывода. Пожалуйста, проверьте это на github:



Приложение поддерживает несколько моделей NCNN через различные варианты сборки. В приложение включены 2 преобразованные модели NCNN: ssdmobilenet и yolov2-tiny. Вы можете добавлять свои собственные модели и использовать это приложение для тестирования.

Заключительные примечания

Не все модели будут работать после преобразования в NCNN. Я обнаружил, что NCNN использует многоуровневую структуру нейронной сети типа caffe. Совместимость хороша для кофе. Преобразовать модель из тензорного потока, такую ​​как модель SSDMobilenet, практически невозможно. Но это выполнимо, если вы используете реализацию SSDMobilenet в caffe, после чего вы можете преобразовать полученную модель caffe в NCNN. Тогда это будет работать. NCNN НЕ поддерживает прямое преобразование из tenorflow в NCNN, хотя в каталоге инструментов репозитория NCNN есть tensorflow2ncnn, но это не сработало для меня, выдавая много ошибок неподдерживаемых слоев или заметок.

Я не пробовал использовать другие модели глубокого обучения, такие как VGG, alexnet, которые NCNN утверждает, что поддерживает. Буду держать вас в курсе, когда у меня будут результаты для других типов моделей глубокого обучения.