This repository is an example on how to add a custom learning block to Edge Impulse. This repository is using YOLOv5 (an object detection model), but the same principles apply to other transfer learning models.
Download the repo and run the following from the root folder:
edge-impulse-blocks init
edge-impulse-blocks push
As a primer, read the Custom learning blocks page in the Edge Impulse docs. (see run.sh):
- Convert the training data / training labels into YOLOv5 format using extract_dataset.py.
- Train YOLOv5 model (using https://github.com/ultralytics/yolov5).
- Convert the YOLOv5 model into TFLite format.
- Done!
Note on epoch count: YOLOv5 might take a while to converge, especially on large images. Play around with epoch count, or lower the resolution of your input until you have something that works.
You run this pipeline via Docker. This encapsulates all dependencies and packages for you.
-
Install Docker Desktop.
-
Install the Edge Impulse CLI v1.16.0 or higher.
-
Create a new Edge Impulse project, and make sure the labeling method is set to 'Bounding boxes'.
-
Add and label some data.
-
Under Create impulse set the image size to e.g. 160x160, 320x320 or 640x640, add an 'Image' DSP block and an 'Object Detection' learn block.
-
Open a command prompt or terminal window.
-
Initialize the block:
$ edge-impulse-blocks init
-
Fetch new data from an object detection project via:
$ edge-impulse-blocks runner --download-data data/
-
Build the container:
$ docker build -t yolov5 .
-
Run the container to test the script (you don't need to rebuild the container if you make changes):
$ docker run --shm-size=1024m --rm -v $PWD:/scripts yolov5 --data-directory data/ --epochs 30 --model-size n --out-directory out/
-
This creates an .onnx file and two .tflite files (both quantized and unquantized) in the 'out' directory.
If you have extra packages that you want to install within the container, add them to requirements.txt
and rebuild the container.
To get up-to-date data from your project:
-
Install the Edge Impulse CLI v1.16 or higher.
-
Open a command prompt or terminal window.
-
Fetch new data via:
$ edge-impulse-blocks runner --download-data data/
Note: to fetch data from another project run the following:
$ edge-impulse-blocks --clean # Then follow the steps provided $ edge-impulse-blocks runner --download-data data/ # Then choose your project
You can also push this block back to Edge Impulse, that makes it available like any other ML block so you can retrain your model when new data comes in, or deploy the model to device. See Docs > Adding custom learning blocks for more information.
-
Push the block:
$ edge-impulse-blocks push
-
The block is now available under any of your projects, via Create impulse > Add learning block.
This repository is licensed under The Clear BSD License, but is utilizing the GPLv3 licensed ultralytics/yolov5 repository (from a commit before this repository was changed to AGPL) at arm's length.