Когда дело доходит до сочетания микроконтроллеров (MCU) и искусственного интеллекта (ИИ), мы вступаем в захватывающую область. Традиционно для приложений ИИ требовалась вычислительная мощность мэйнфреймов или облачных серверов, но по мере развития технологий ИИ теперь может быть встроен в микроконтроллеры. Это открывает новые возможности для встраиваемых систем, устройств Интернета вещей, робототехники и множества других приложений.
MCU AI означает искусственный интеллект на микроконтроллерах. Он внедряет модели машинного обучения и глубокого обучения в мощные микроконтроллеры с ограниченными ресурсами для достижения интеллектуального принятия решений и восприятия. Вот некоторые ключевые аспекты MCU AI:
MCU AI может применяться в самых разных областях, вот несколько примеров:
авторНачните глубже вникать во встроенныеAIэто поле,Но прежде чем учиться, сначала поймите, как им пользоваться.,беги вставай. В этой статье рассказывается о том, как пересадить рамку вывода TinyMaix в RT-THREAD и запустить ее.
TinyMaix: это проект, завершенный Sipeed за два выходных свободного времени. Это легкая библиотека машинного обучения с открытым исходным кодом, специально разработанная для микроконтроллеров и сверхлегких нейронных сетей для микроконтроллеров. Библиотека вывода TinyML позволяет выполнять легкое глубокое обучение. модели на любом микроконтроллере. Ссылка на открытый исходный код TinyMaix: https://github.com/sipeed/tinymaix.
TinyMaix можно просто понимать как библиотеку матричных и векторных вычислений. В настоящее время она поддерживает следующее вычислительное оборудование:
#define TM_ARCH_CPU (0) //default, pure cpu compute
#define TM_ARCH_ARM_SIMD (1) //ARM Cortex M4/M7, etc.
#define TM_ARCH_ARM_NEON (2) //ARM Cortex A7, etc.
#define TM_ARCH_ARM_MVEI (3) //ARMv8.1: M55, etc.
#define TM_ARCH_RV32P (4) //T-head E907, etc.
#define TM_ARCH_RV64V (5) //T-head C906,C910, etc.
#define TM_ARCH_CSKYV2 (6) //cskyv2 with dsp core
#define TM_ARCH_X86_SSE2 (7) //x86 sse2
Для микроконтроллеров серии ARM-Cortex могут поддерживаться чистые вычисления ЦП и SIMD-вычисления. Часть вычислений ЦП не имеет особых зависимостей (все коды вычислений реализованы в стандарте C). В части SIMD некоторые расчетные коды реализованы с использованием встроенной сборки языка C. ЦП должен поддерживать соответствующие инструкции ассемблера для нормальной компиляции и работы.
TinyMaix в настоящее время поддерживает два уровня: 1. Выберите минимальный код и буфер. 2. Выберите скорость, для которой требуется больше кода и буфера.
#define TM_OPT0 (0) //default, least code and buf
#define TM_OPT1 (1) //opt for speed, need more code and buf
#define TM_OPT2 (2) //TODO
TinyMaix поддерживает квантование с разной разрядностью:
#define TM_MDL_INT8 0
#define TM_MDL_INT16 1
#define TM_MDL_FP32 2
#define TM_MDL_FP16 3
#define TM_MDL_FP8_143 4 //experimental
#define TM_MDL_FP8_152 5 //experimental
Основной API, предоставляемый платформой TinyMaix приложениям верхнего уровня, в основном находится в файле tinymaix.h в хранилище кода, где:
/******************************* MODEL FUNCTION ************************************/
tm_err_t tm_load (tm_mdl_t* mdl, const uint8_t* bin, uint8_t*buf, tm_cb_t cb, tm_mat_t* in); //load model
void tm_unload(tm_mdl_t* mdl); //remove model
tm_err_t tm_preprocess(tm_mdl_t* mdl, tm_pp_t pp_type, tm_mat_t* in, tm_mat_t* out); //preprocess input data
tm_err_t tm_run (tm_mdl_t* mdl, tm_mat_t* in, tm_mat_t* out); //run model
/******************************* STAT FUNCTION ************************************/
#if TM_ENABLE_STAT
tm_err_t tm_stat(tm_mdlbin_t* mdl); //stat model
#endif
/******************************* UTILS FUNCTION ************************************/
uint8_t TM_WEAK tm_fp32to8(float fp32);
float TM_WEAK tm_fp8to32(uint8_t fp8);
Модель здесь обычно представляет собой модель формата TinyMaix, созданную путем преобразования сценария предварительно обученной модели;
#define TM_ARCH R_TINYMAIX_USING_ARCK_TYPE
#define TM_OPT_LEVEL R_TINYMAIX_USING_OPTION_LEVEL
#define TM_MDL_TYPE R_TINYMAIX_USING_MODULE_TYPE
#define TM_INLINE rt_inline
#define TM_WEAK rt_weak
#define tm_malloc(x) rt_malloc(x)
#define tm_free(x) rt_free(x)
#define TM_PRINTF(...) rt_kprintf(__VA_ARGS__)
#define TM_GET_US() rt_tick_get_millisecond() / 1000;
#define TM_DBGT_INIT() uint32_t _start,_finish;\
float _time;\
_start = TM_GET_US();
#define TM_DBGT_START() _start = TM_GET_US();
#define TM_DBGT(x) {\
_finish=TM_GET_US();\
_time = (float)(_finish-_start) / 1.0;\
TM_PRINTF("===%s use %.3f ms\n", (x), _time);\
_start=TM_GET_US();\
}
int cifar10(int argc, char** argv)
int mnist(int argc, char** argv)
int vww(int argc, char** argv)
MSH_CMD_EXPORT(cifar10, TinyMaix cifar10 example);
MSH_CMD_EXPORT(mnist, TinyMaix mnist example);
MSH_CMD_EXPORT(vww, TinyMaix vww example);
Рабочая среда примера: STM32F401RE, ядро M4, тактовая частота: 84 МГц, ОЗУ: 96 КБ, Flash: 512 КБ.