Skip to main content

Machine learning for microcontrollers and embedded systems

Project description

Tests DOI

emlearn

Machine learning for microcontroller and embedded systems. Train in Python, then do inference on any device with a C99 compiler.

Key features

Embedded-friendly Inference

  • Portable C99 code
  • No libc required
  • No dynamic allocations
  • Single header file include
  • Support integer/fixed-point math (some methods)

Convenient Training

  • Using Python with scikit-learn or Keras
  • The generated C classifier is also accessible in Python

MIT licensed

Can be used as an open source alternative to MATLAB Classification Trees, Decision Trees using MATLAB Coder for C/C++ code generation. fitctree, fitcensemble, TreeBagger, ClassificationEnsemble, CompactTreeBagger

Status

Minimally useful

Classifiers:

  • eml_trees: sklearn.RandomForestClassifier, sklearn.ExtraTreesClassifier, sklearn.DecisionTreeClassifier
  • eml_net: sklearn.MultiLayerPerceptron, Keras.Sequential with fully-connected layers
  • eml_bayes: sklearn.GaussianNaiveBayes

Unsupervised / Outlier Detection / Anomaly Detection

  • eml_distance: sklearn.EllipticEnvelope (Mahalanobis distance)

Feature extraction:

  • eml_audio: Melspectrogram

Tested running on AVR Atmega, ESP8266, ESP32, ARM Cortex M (STM32), Linux, Mac OS and Windows.

Installing

Install from PyPI

pip install --user emlearn

Usage

The basic usage consist of 3 steps:

  1. Train your model in Python
from sklearn.ensemble import RandomForestClassifier
estimator = RandomForestClassifier(n_estimators=10, max_depth=10)
estimator.fit(X_train, Y_train)
...
  1. Convert it to C code
import emlearn
cmodel = emlearn.convert(estimator, method='inline')
cmodel.save(file='sonar.h')
  1. Use the C code
#include "sonar.h"

const int32_t length = 60;
int32_t values[length] = { ... };
const int32_t predicted_class = sonar_predict(values, length):

For full code see the examples.

Contributors

Jon Nordby
Mark Cooke

Citations

If you use emlearn in an academic work, please reference it using:

@misc{emlearn,
  author       = {Jon Nordby},
  title        = {{emlearn: Machine Learning inference engine for 
                   Microcontrollers and Embedded Devices}},
  month        = mar,
  year         = 2019,
  doi          = {10.5281/zenodo.2589394},
  url          = {https://doi.org/10.5281/zenodo.2589394}
}

Made with emlearn

emlearn has been used in the following works.

  • C-AVDI: Compressive Measurement-Based Acoustic Vehicle Detection and Identification by Billy Dawton et.al. Implemented detection and classification of passing motorcycles and cars from sound. Used compressed sensing system using an analog frontend and ADC running at a low samplerate. Used a emlearn RandomForest on a Teensy microcontroller to perform the classification.
  • An End-to-End Framework for Machine Learning-Based Network Intrusion Detection System by Gustavo de Carvalho Bertoli et.al. Implemented a TCP Scan detection system. It used a Decision Tree and used emlearn to generate code for a Linux Kernel Module / Netfilter to do the detection. It was tested on a Rasperry PI 4 single-board-computer, and the performance overhead was found to be negligble.
  • Towards an Electromyographic Armband: an Embedded Machine Learning Algorithms Comparison by Danilo Demarchi, Paolo Motto Ros, Fabio Rossi and Andrea Mongardi. Detected different hand gestures based on ElectroMyoGraphic (sEMG) data. Compared the performance of different machine learning algorithms, from emlearn and Tensorflow Lite. Found emlearn RandomForest and Naive Bayes to give good accuracy with very good power consumption.
  • TinyML-Enabled Frugal Smart Objects: Challenges and Opportunities by Ramon Sanchez-Iborra and Antonio F. Skarmeta. Created a model for automatically selecting which radio transmission method to use in an IoT device. Running on Arduino Uno (AVR8) device. Tested Multi-layer Perceptron, Decision Tree and Random Forest from emlearn. Compared performance with sklearn-porter, and found that Random Forest to be faster in emlearn, while Decision Tree faster in sklearn-porter. Compared emlearn MLP to MicroMLGen’s SVM, and found the emlearn MLP to be more accurate and lower inference time.
  • A Machine Learning Approach for Real Time Android Malware Detection by Ngoc C. Lê et al. Created a C++ model for detecting malware. Used a set of hand-engineered features and a Random Forest from emlearn as the classifier. Running on Android devices.
  • RIOT OS has a package for emlearn. RIOT OS emlearn package example. Their build system automatically runs this test on tens of different hardware boards.

If you are using emlearn, let us know! You can for example submit a pull request for inclusion in this README, or create an issue on Github.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

emlearn-0.14.1.tar.gz (71.1 kB view details)

Uploaded Source

File details

Details for the file emlearn-0.14.1.tar.gz.

File metadata

  • Download URL: emlearn-0.14.1.tar.gz
  • Upload date:
  • Size: 71.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.8.1 pkginfo/1.7.0 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.7

File hashes

Hashes for emlearn-0.14.1.tar.gz
Algorithm Hash digest
SHA256 f7aa57569bfacfb2297e9b508703d598419da2582b88b3d5fef072f108a8ae60
MD5 3222abdf3ef6612d3a3729e8daf04e03
BLAKE2b-256 9001c52c1dff64d71ef2db339d59a7d03f6a192b1f42743a24927470f1b9fa08

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page