1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/RT-Thread-Mirror-nnom

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Нейросеть на микроконтроллере (NNoM)

NNoM — это библиотека высокоуровневых нейросетей для инференса, разработанная специально для микроконтроллеров.

  • [Лицензия]

NNoM выпущена под лицензией Apache 2.0 начиная с версии nnom-V0.2.0. Информация о лицензии и авторских правах содержится в коде.

Основные возможности

  • Развёртывание модели Keras в NNoM одной строкой кода.
  • Поддержка сложных структур: Inception, ResNet, DenseNet, Octave Convolution и др.
  • Удобные интерфейсы.
  • Высокопроизводительный бэкенд.
  • Встроенная предварительная компиляция — нулевая потеря производительности интерпретатора во время выполнения.
  • Встроенные инструменты оценки: анализ времени выполнения, Top-k, матрица путаницы и т. д.

Структура NNoM показана ниже:

Более подробно см. в Руководстве по разработке.

Обсуждения приветствуются с использованием проблем. Также приветствуются пулреквесты. QQ/TIM группа: 763089399.

Последние обновления — v0.4.x

Рекуррентные слои (RNN) (0.4.1)

Рекуррентные слои (Simple RNN, GRU, LSTM) реализованы в версии 0.4.1. Поддерживаются опции statful и return_sequence.

Новый структурированный интерфейс (0.4.0)

В NNoM появился новый слойный интерфейс под названием Structured Interface, все они имеют суффикс _s. Он предназначен для использования одной C-структуры для предоставления всей конфигурации слоя. В отличие от API слоёв, который удобен для человека, этот структурированный API более удобен для машин.

Поканальная квантизация (0.4.0)

Новый структурированный API поддерживает поканальную квантизацию (поосевую) и расширения для свёрточных слоёв.

Новые скрипты (0.4.0)

Начиная с версии 0.4.0, NNoM будет использовать структурированный интерфейс по умолчанию для генерации заголовка модели weights.h. Скрипты, соответствующие структурированным интерфейсам, — nnom.py, а Layer Interface, соответствующий nnom_utils.py.

Почему NNoM?

Цель NNoM — предоставить лёгкий, удобный и гибкий интерфейс для быстрого развёртывания на MCU.

Сегодня нейронные сети становятся шире, глубже и плотнее.

[1] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., ... & Rabinovich, A. (2015). Going deeper with convolutions. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1–9).

[2] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770–778).

[3] Huang, G., Liu, Z., Van Der Maaten, L., & Weinberger, K. Q. (2017). Densely connected convolutional networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4700–4708).

После 2014 года развитие нейронных сетей было больше сосредоточено на оптимизации структуры для повышения эффективности и производительности, что особенно важно для небольших платформ, таких как микроконтроллеры. Однако доступные NN-библиотеки для MCU слишком низкоуровневые, что делает их использование со сложными структурами очень сложным.

Поэтому мы создали NNoM, чтобы помочь разработчикам встраиваемых систем быстрее и проще развёртывать модели NN непосредственно на микроконтроллерах. NNoM управляет структурой, памятью и всем остальным за разработчика. Всё, что вам нужно сделать, это ввести новые измерения и получить результаты.

Установка

NNoM можно установить как пакет Python.

pip install git+https://github.com/majianjia/nnom@master

Для NNoM требуется Tensorflow версии <= 2.14. Существует несколько вариантов установки, см. документацию TensorFlow.

Например:

pip install 'tensorflow-cpu<=2.14.1'
``` **Поддержка версий Python**

Версия 2.14 поддерживает Python до версии 3.11. Версия Python 3.12 не поддерживается.

## Доступ к файлам C

Заголовки и исходный код на языке C в NNoM распределены в пакете Python `nnom_core`. Вы можете найти его местоположение, выполнив следующую команду:

python -c "import nnom_core; print(nnom_core.path[0])"

В вашей системе сборки добавьте каталоги `inc/` и `port/` в качестве включаемых каталогов и скомпилируйте файлы `src/*.c`.

## Документация

**Руководства**
* «5 минут с NNoM» (на английском языке) — [docs/guide_5_min_to_nnom.md](docs/guide_5_min_to_nnom.md).
* Временное руководство — [docs/A_Temporary_Guide_to_NNoM.md](docs/A_Temporary_Guide_to_NNoM.md).
* Руководство по портированию и оптимизации — [docs/Porting_and_Optimisation_Guide.md](docs/Porting_and_Optimisation_Guide.md). 
* Руководство RT-Thread (на китайском языке) — https://majianjia.github.io/nnom/rt-thread_guide/.
* Пример RT-Thread-MNIST (на китайском языке) — docs/example_mnist_simple_cn.md.

## Производительность

Существует множество статей, сравнивающих NNoM с другими известными инструментами для микроконтроллеров, такими как TensorFlow LiteSTM32Cube.AI и др.

Рафаэль Зингг и другие из Цюрихского университета прикладных наук сравнивают nnom с tflite, cube и e-Ai в своей статье «Искусственный интеллект на микроконтроллерах» («Artificial Intelligence on Microcontrollers») — https://github.com/InES-HPMM/Artificial_Intelligence_on_Microcontrollers/blob/master/Artificial_Intelligence_on_Microcontrollers.pdf. Блог — https://blog.zhaw.ch/high-performance/2020/05/14/artificial-intelligence-on-microcontrollers/.

Утман Али из Политехнического университета Турина провёл сравнение в диссертации «О развёртывании искусственных нейронных сетей (ANN) в недорогих встраиваемых системах» («On the deployment of Artificial Neural Networks (ANN) in low cost embedded systems») — https://webthesis.biblio.polito.it/19692/1/tesi.pdf.

Обе статьи показывают, что NNoM не только сравним с другими популярными фреймворками, но и имеет более быстрое время вывода и иногда меньший объём памяти.

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

## Примеры

**Примеры с документацией**
Пожалуйста, ознакомьтесь с примерами (https://github.com/majianjia/nnom/tree/master/examples) и выберите один для начала работы.

## Доступные операции

Руководство по API — https://majianjia.github.io/nnom/.
> *Примечание: NNoM теперь поддерживает форматы HWC и CHW. Некоторые операции могут не поддерживать оба формата в настоящее время. Пожалуйста, проверьте таблицы для текущего статуса.*

| Слои | Структурный API |API слоя |Комментарии|
| --- | --- | --- |---|
| Свёрточный  |conv2d_s()|Conv2D()|Поддержка 1/2D, поддержка расширений (Новинка!)|
| Свёртка с транспонированием (Новинка!) |conv2d_trans_s()|Conv2DTrans()|В разработке.|
| Поэлементное свёртное |dwconv2d_s()|DW_Conv2D()|Поддержка 1/2D|
| Полностью связанный |dense_s()| Dense()||
| Лямбда |lambda_s()| Lambda() |Один вход / один выход анонимной операции| 
| Пакетная нормализация |N/A| N/A||
| Уплощение|flatten_s()| Flatten()||
| Изменение формы (Новинка!)|reshape_s()| N/A||
| SoftMax|softmax_s()| SoftMax()| Только слой SoftMax имеет API слоя| 
| Активация|N/A| Activation()||
| Ввод/вывод |input_s()/output_s()| Input()/Output()||
| Увеличение частоты дискретизации |upsample_s()|UpSample()||
| Нулевое заполнение | zeropadding_s()|ZeroPadding()||
| Обрезка |cropping_s() |Cropping()||

**Слои RNN**

| Слоёв | Статус | Структурный API |Комментарии|
| --- | ------ | ---|---|
| Рекуррентный слой NN (Новинка!) | Альфа | rnn_s()||
| Простая ячейка (Новинка!) | Альфа | simple_cell_s()||
| Ячейка ГРУ (Новинка!) | Альфа | gru_cell_s()||
| Ячейка LSTM (Новинка!) | Альфа| lstm_s()||

**Активации**

Активацию можно использовать отдельно как слой или можно присоединить к предыдущему слою как [«actail»](docs/A_Temporary_Guide_to_NNoM.md#addictionlly-activation-apis), чтобы уменьшить затраты памяти.

В настоящее время нет структурированного API для активации, поскольку активация обычно не используется в качестве слоя.

| Активационный | Структурный API |Слой API|Активация API|Комментарии|
| --- |--- |--- ||---|
| ReLU  | N/A | N/A |||

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/RT-Thread-Mirror-nnom.git
git@api.gitlife.ru:oschina-mirror/RT-Thread-Mirror-nnom.git
oschina-mirror
RT-Thread-Mirror-nnom
RT-Thread-Mirror-nnom
master