Я обнаружил, что 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 с:
Это система сборки на основе файлов, которую относительно легко скомпилировать для разных платформ. Если вы выполняете преобразование на 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 утверждает, что поддерживает. Буду держать вас в курсе, когда у меня будут результаты для других типов моделей глубокого обучения.