Export 101#
[1]:
%pip install requests numpy ipywidgets ipycanvas
Requirement already satisfied: requests in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (2.32.3)
Requirement already satisfied: numpy in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (2.2.6)
Collecting ipywidgets
Downloading ipywidgets-8.1.7-py3-none-any.whl.metadata (2.4 kB)
Collecting ipycanvas
Downloading ipycanvas-0.13.3-py2.py3-none-any.whl.metadata (6.3 kB)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from requests) (3.4.2)
Requirement already satisfied: idna<4,>=2.5 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from requests) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from requests) (2.4.0)
Requirement already satisfied: certifi>=2017.4.17 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from requests) (2025.4.26)
Requirement already satisfied: comm>=0.1.3 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipywidgets) (0.2.2)
Requirement already satisfied: ipython>=6.1.0 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipywidgets) (8.37.0)
Requirement already satisfied: traitlets>=4.3.1 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipywidgets) (5.14.3)
Collecting widgetsnbextension~=4.0.14 (from ipywidgets)
Downloading widgetsnbextension-4.0.14-py3-none-any.whl.metadata (1.6 kB)
Collecting jupyterlab_widgets~=3.0.15 (from ipywidgets)
Downloading jupyterlab_widgets-3.0.15-py3-none-any.whl.metadata (20 kB)
Requirement already satisfied: pillow>=6.0 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipycanvas) (11.2.1)
Requirement already satisfied: decorator in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (5.2.1)
Requirement already satisfied: exceptiongroup in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (1.3.0)
Requirement already satisfied: jedi>=0.16 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (0.19.2)
Requirement already satisfied: matplotlib-inline in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (0.1.7)
Requirement already satisfied: pexpect>4.3 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (4.9.0)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (3.0.51)
Requirement already satisfied: pygments>=2.4.0 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (2.19.1)
Requirement already satisfied: stack_data in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (0.6.3)
Requirement already satisfied: typing_extensions>=4.6 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from ipython>=6.1.0->ipywidgets) (4.14.0)
Requirement already satisfied: wcwidth in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets) (0.2.13)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets) (0.8.4)
Requirement already satisfied: ptyprocess>=0.5 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets) (0.7.0)
Requirement already satisfied: executing>=1.2.0 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (2.2.0)
Requirement already satisfied: asttokens>=2.1.0 in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (3.0.0)
Requirement already satisfied: pure-eval in /home/docs/checkouts/readthedocs.org/user_builds/eclipse-aidge/envs/stable/lib/python3.10/site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (0.2.3)
Downloading ipywidgets-8.1.7-py3-none-any.whl (139 kB)
Downloading jupyterlab_widgets-3.0.15-py3-none-any.whl (216 kB)
Downloading widgetsnbextension-4.0.14-py3-none-any.whl (2.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 61.3 MB/s eta 0:00:00
Downloading ipycanvas-0.13.3-py2.py3-none-any.whl (125 kB)
Installing collected packages: widgetsnbextension, jupyterlab_widgets, ipywidgets, ipycanvas
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4/4 [ipycanvas]
Successfully installed ipycanvas-0.13.3 ipywidgets-8.1.7 jupyterlab_widgets-3.0.15 widgetsnbextension-4.0.14
Note: you may need to restart the kernel to use updated packages.
Download the model#
[2]:
import aidge_core
file_url = "https://huggingface.co/EclipseAidge/LeNet/resolve/main/lenet_mnist.onnx?download=true"
file_path = "lenet_mnist.onnx"
aidge_core.utils.download_file(file_path, file_url)
lenet_mnist.onnx: 100%|██████████| 349k/349k [00:00<00:00, 101MB/s]
Load the model in Aidge and manipulate it#
[3]:
import aidge_backend_cpu
import aidge_onnx
import aidge_export_cpp
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[3], line 3
1 import aidge_backend_cpu
2 import aidge_onnx
----> 3 import aidge_export_cpp
ModuleNotFoundError: No module named 'aidge_export_cpp'
[4]:
model = aidge_onnx.load_onnx("lenet_mnist.onnx")
[5]:
# Remove Flatten node, useless in the CPP export
aidge_core.remove_flatten(model)
# Configuration for the model + forward dimensions
model.compile("cpu", aidge_core.dtype.float32, dims=[[1, 1, 28, 28]])
[6]:
!rm -rf lenet_export_fp32
[7]:
# Generate scheduling of the model
scheduler = aidge_core.SequentialScheduler(model)
scheduler.generate_scheduling()
Export the model#
[8]:
export_folder = "lenet_export_fp32"
aidge_core.export_utils.scheduler_export(
scheduler,
export_folder,
aidge_export_cpp.ExportLibCpp,
memory_manager=aidge_core.mem_info.generate_optimized_memory_info,
memory_manager_args={"stats_folder": f"{export_folder}/stats", "wrapping": False }
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[8], line 6
1 export_folder = "lenet_export_fp32"
3 aidge_core.export_utils.scheduler_export(
4 scheduler,
5 export_folder,
----> 6 aidge_export_cpp.ExportLibCpp,
7 memory_manager=aidge_core.mem_info.generate_optimized_memory_info,
8 memory_manager_args={"stats_folder": f"{export_folder}/stats", "wrapping": False }
9 )
NameError: name 'aidge_export_cpp' is not defined
Draw your own number#
[9]:
from ipywidgets import HBox, VBox, Button, Layout
from ipycanvas import RoughCanvas, hold_canvas
img_name = "my_number.png"
canvas = RoughCanvas(width=28, height=28, sync_image_data=True)
button_gen = Button(description="Generate PNG")
button_clear = Button(description="Clear")
drawing = False
position = None
shape = []
def on_erase_button_clicked(b):
canvas.clear()
def on_generate_button_clicked(b):
try:
canvas.to_file(img_name)
print(f"Image generated to {img_name} !")
except:
print("Draw a number before generating the image.")
button_clear.on_click(on_erase_button_clicked)
button_gen.on_click(on_generate_button_clicked)
def on_mouse_down(x, y):
global drawing
global position
global shape
drawing = True
position = (x, y)
shape = [position]
def on_mouse_move(x, y):
global drawing
global position
global shape
if not drawing:
return
with hold_canvas():
canvas.stroke_line(position[0], position[1], x, y)
position = (x, y)
shape.append(position)
def on_mouse_up(x, y):
global drawing
global position
global shape
drawing = False
with hold_canvas():
canvas.stroke_line(position[0], position[1], x, y)
shape = []
canvas.on_mouse_down(on_mouse_down)
canvas.on_mouse_move(on_mouse_move)
canvas.on_mouse_up(on_mouse_up)
canvas.stroke_style = "#000000"
VBox((canvas, HBox((button_gen, button_clear))),
layout=Layout(height='auto', width="300px"))
[9]:
Generate inputs for testing the model from your drawing#
[10]:
aidge_tensor = None
try:
number_np = canvas.get_image_data()
# We got a numpy array with the shape of (28,28,4)
# Transform it to (28,28)
x = number_np[:, :, 3].astype("float32")
aidge_tensor = aidge_core.Tensor(x / 255)
except:
print("Please draw a number in the previous cell before running this one.")
Please draw a number in the previous cell before running this one.
Generate a main that will do an inference on the drawing.
[11]:
if aidge_tensor:
aidge_core.export_utils.generate_main_cpp(export_folder, model, inputs_tensor=aidge_tensor)
else:
print("Please draw a number before generating the export.")
Please draw a number before generating the export.
Compile the export and test it#
[12]:
!cd lenet_export_fp32 && make
/usr/bin/sh: 1: cd: can't cd to lenet_export_fp32
[13]:
!./lenet_export_fp32/bin/run_export
/usr/bin/sh: 1: ./lenet_export_fp32/bin/run_export: not found