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.

emlearn logo

Status

Actively maintained since 2018.

License

emlearn is MIT licensed.

Key features

Convert machine learning models to C

Embedded-friendly Inference

  • Portable C99 code
  • No dynamic allocations
  • Small code size (from 2kB FLASH)
  • Small RAM size (from 50 bytes RAM)
  • Support integer/fixed-point math (some models)
  • No libc required (some models)

Easy to integrate in project

Feature extraction and data processing utilities

  • Infinite Impulse Response (IIR) filters
  • Fast Fourier Transform (FFT)
  • Read/write CSV files, with streaming support

Model validation tools

  • Access generated C classifier via Python, to verify prediction correctness
  • Estimate model computational cost and size (using scikit-learn compatible metrics). Example.
  • Measure tools for model program/FLASH size. Example.

Platform support

Should work anywhere that has working C99 compiler. Tested running on a large range of bare-metal, RTOS and desktop operating systems. Such as ESP8266, ESP32, AVR Atmega (8 bit), ARM Cortex M (STM32), Linux, Mac OS and Windows.

Projects using emlearn

emlearn has been used in many projects by many different developers, across a range of usecases and applications. See the Made with emlearn section in documentation.

Model support

Classification:

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

Regression:

  • eml_trees: sklearn.RandomForestRegressor, sklearn.ExtraTreesRegressor, sklearn.DecisionTreeRegressor
  • eml_net: Keras.Sequential with fully-connected layers

Unsupervised / Outlier Detection / Anomaly Detection

  • eml_distance: sklearn.EllipticEnvelope (Mahalanobis distance)
  • eml_mixture: sklearn.GaussianMixture, sklearn.BayesianGaussianMixture

Documentation

For full documentation see examples, the user guide.

Other learning resources

emlearn and emlearn-micropython has been covered in the following presentations.

  • Microcontrollers + Machine Learning in 1-2-3 (PyData Global 2024). Slides etc
  • Sensor data processing on microcontrollers with MicroPython and emlearn (PyConZA 2024). Slides etc
  • 6 years of open source TinyML with emlearn - a scikit-learn for microcontrollers (TinyML EMEA 2024) YouTube video | Slides etc
  • emlearn - Machine Learning for Tiny Embedded Systems (Embedded Online Conference 2024). Youtube video | Slides etc
  • Machine Learning on microcontrollers using MicroPython and emlearn (PyCon DE & PyData Berlin 2024). Slides etc | YouTube video.

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', name='sonar')
  1. Use the C code

Simple classifiers

#include "sonar.h"

const int32_t length = 60;
int16_t values[length] = { ... };

// using generated "inline" code for the decision forest
const int32_t predicted_class = sonar_predict(values, length):

// ALT: using the generated decision forest datastructure
const int32_t predicted_class = eml_trees_predict(&sonar, length):

Neural net regressor

Copy the generated .h file, the eml_net.h and eml_common.h into your project, then

#include "nnmodel.h" // the generated code basedon on keras.Sequential

float values[6] = { ... };

const float_t predicted_value = nnmodel_regress1(values, 6);
if (predicted_value == NAN) {
    exit(-1);
}
// Process the value as needed

// Or, passing in a result array directly if more than 1 output is generated
float out[2];
EmlError err = nnmodel_regress(values, 6, out, 2);
if (err != EmlOk)
{
    // something went wrong
}
else {
    // predictions are in the out array
}

For a complete runnable code see Getting Started.

Contributing

See docs/CONTRIBUTING.md for contribution guidelines, and docs/developing.md for how to develop.

Contributors

Jon Nordby
Mark Cooke

Citations

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

@misc{emlearn,
  author       = {Nordby, Jon AND Cooke, Mark AND Horvath, Adam},
  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}
}

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.23.2.tar.gz (82.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

emlearn-0.23.2-py3-none-any.whl (78.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: emlearn-0.23.2.tar.gz
  • Upload date:
  • Size: 82.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for emlearn-0.23.2.tar.gz
Algorithm Hash digest
SHA256 bc18c156e571cb77344adeaa911a073e16dcb1f4f37239ede947ca665e0e08bc
MD5 effbf5838ab21d82b9d54d5b1d1eb53d
BLAKE2b-256 130c44519039bc9153df5bae4cee7ca81f53e8b9a05f1c7d465668430d10ced4

See more details on using hashes here.

File details

Details for the file emlearn-0.23.2-py3-none-any.whl.

File metadata

  • Download URL: emlearn-0.23.2-py3-none-any.whl
  • Upload date:
  • Size: 78.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for emlearn-0.23.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d50982a7b3808823c943d0858e1ce7862ae88d2009d2d548e951434e3c4774cd
MD5 081b9ca9c1b800949f78eb56499fbb35
BLAKE2b-256 b49362f8ed58397cf68eb3b91cd330f274e2b12cff38f838bbf399366daf0875

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