Graphical Model Conversion Platform
Introduction
After reading the previous model-conversion guides, have all those commands started to blur together? Exporting ONNX, locating output nodes, trimming the model, preparing calibration images, editing configuration files, and running Docker commands—missing a single parameter can send you back through the whole process. Sometimes converting a trained .pt model feels harder than training it in the first place.
Do not worry, and put away that command-line checklist. Maix Converter Platform brings the complicated steps together in a Web interface. Upload the model and calibration dataset, select the target device, YOLO version, and input resolution, and the platform will handle model export, node processing, quantization, MUD generation, and result packaging automatically.
There is no need to memorize long commands or repeatedly enter Docker containers. A few clicks and a little patience are enough to produce a YOLO Detect model for MaixCAM, MaixCAM Pro, or MaixCAM2.
Current Support
The platform currently supports the following devices and models:
| Item | Supported |
|---|---|
| Target devices | MaixCAM, MaixCAM Pro, MaixCAM2 |
| Model types | YOLO26, YOLO11, YOLOv8 |
| Tasks | Object detection (Detect) |
| Input models | .pt, .onnx |
| Calibration dataset | A .zip file containing images |
Classification, segmentation, pose estimation, and OBB tasks are not currently supported. For other models or custom conversion parameters, use the manual conversion methods described in the previous guides.
Get the Conversion Platform
Maix Converter Platform is open source. Its source code is available at github.com/sipeed/maix_converter_platform.
Clone the repository with Git:
git clone https://github.com/sipeed/maix_converter_platform.git
cd maix_converter_platform
Prepare the Python Environment
Using Conda to create an independent Python 3.11 environment is recommended to avoid conflicts with existing packages:
conda create -n maix-converter python=3.11 -y
conda activate maix-converter
pip install -r requirements-web.txt
To upload a .pt model and let the platform export it to ONNX automatically, also install Ultralytics and ONNX:
pip install ultralytics onnx
If you only upload an existing .onnx model, ultralytics is not required. Installing onnx is still recommended for custom-trained models because the platform can try to read class names from the model metadata and write them to the MUD file.
Prepare the Docker Environment
The model-conversion toolchains run inside Docker. Install Docker first and verify that the current user can run it:
docker --version
docker ps
If docker ps completes without a permission error, Docker is ready.
Different devices use different conversion toolchains. If you only convert models for one device family, you only need to prepare its corresponding Docker image.
MaixCAM2 Conversion Image
MaixCAM2 uses the Pulsar2 toolchain. The platform expects the image name pulsar2:6.0. For download and import instructions, see Convert an ONNX model for MaixCAM2.
After downloading the image archive, import it and inspect the image name:
docker load -i pulsar2_vxx.tar.gz
docker images
If the imported image is not named pulsar2:6.0, add the expected tag using its actual name. For example:
docker tag pulsar2:3.3 pulsar2:6.0
Finally, verify that Pulsar2 works:
docker run --rm pulsar2:6.0 -c "pulsar2 version"
MaixCAM / MaixCAM Pro Conversion Image
MaixCAM and MaixCAM Pro use the TPU-MLIR toolchain. The platform ultimately uses an image named maixcam-tpumlir:v3.4. First obtain the sophgo/tpuc_dev base image. For download instructions, see Convert an ONNX model for MaixCAM.
After downloading the image archive, import it and check its actual name:
docker load -i tpuc_dev_vxx.tar.gz
docker images
The Dockerfile provided by the conversion platform uses sophgo/tpuc_dev:v3.4 by default. If the imported image already has this name, no changes are needed. Otherwise, add the expected tag based on the name shown by docker images. For example, if the imported image is sophgo/tpuc_dev:latest, run:
docker tag sophgo/tpuc_dev:latest sophgo/tpuc_dev:v3.4
After confirming the base-image name, build the image used by the platform from the repository root:
docker build -f docker/maixcam-tpumlir.Dockerfile -t maixcam-tpumlir:v3.4 .
Inspect the result and verify the conversion command:
docker images
docker run --rm maixcam-tpumlir:v3.4 model_transform.py --help
If the help text for model_transform.py appears, the conversion environment is ready.
Start the Conversion Platform
Enter the repository root and activate the Conda environment created earlier:
cd maix_converter_platform
conda activate maix-converter
Start the Web service:
uvicorn web.app:app --host 0.0.0.0 --port 8000
Open the following address in a browser:
http://127.0.0.1:8000
When accessing the conversion server from another computer, replace 127.0.0.1 with the server's IP address.
Prepare the Model and Calibration Dataset
The platform accepts .pt and .onnx model files:
- When uploading
.pt, the platform uses the width and height entered on the page to export an ONNX model with the corresponding input resolution through Ultralytics. - When uploading
.onnx, the platform proceeds directly to model processing and conversion and uses the model's own static input shape. The width and height entered on the page do not resize the model, so using values that match the actual ONNX input resolution is recommended.
The calibration dataset must be packaged as a .zip file containing images only; annotation files are not required. Supported image formats are .jpg, .jpeg, .png, and .bmp.
Images may be stored directly in the archive:
dataset.zip
000001.jpg
000002.jpg
000003.jpg
The archive may also contain nested directories:
dataset.zip
images/
000001.jpg
000002.jpg
Calibration images should resemble the model's actual deployment environment. For example, if the model will process camera images, prefer images captured by a similar camera under realistic conditions. Start with 50–100 images for a quick test and increase the number as appropriate for the final conversion.
Create a Conversion Job
Open the Web page and complete the form from top to bottom:
| Option | Description |
|---|---|
| Model file | Upload the .pt or .onnx model to convert |
| Calibration dataset | Upload a .zip file containing calibration images only |
| Model name | Base name for generated files, such as yolo11n |
| Target device | Select MaixCAM2 or MaixCAM / Pro for the actual device |
| YOLO version | Must match the version of the uploaded model |
| Image count | Number of calibration images; it cannot exceed the number of valid images in the archive |
| Width and height | Set the exported model input resolution for .pt uploads. For .onnx uploads, the model's own static input shape is used. The platform requires both entered values to be between 32 and 4096 and multiples of 32 |
| Fast mode | Skips some checks to shorten conversion time and is useful for testing the workflow |
Click Start Conversion after completing the form. The page displays upload progress, the current job status, and live conversion logs. Conversion time depends on the model size, calibration image count, and computer performance.
Fast mode is useful for checking the environment and workflow. Before deployment, disable fast mode and perform a complete conversion again.
Download the Conversion Result
After a successful conversion, the Download Result button becomes available. Click it to download a ZIP archive containing the generated model files.
A MaixCAM2 result normally contains:
model_name.mud
model_name_npu.axmodel
model_name_vnpu.axmodel
A MaixCAM or MaixCAM Pro result normally contains:
model_name.mud
model_name.cvimodel
Extract the archive and copy all model files to the same directory on the device. The MaixPy program only needs to load the .mud file, which references the actual model files in the same directory.
The following example uses YOLO11:
from maix import app, camera, display, image, nn
detector = nn.YOLO11(model="/root/models/yolo11n.mud", dual_buff=True)
cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format())
disp = display.Display()
while not app.need_exit():
img = cam.read()
objs = detector.detect(img, conf_th=0.5, iou_th=0.45)
for obj in objs:
img.draw_rect(obj.x, obj.y, obj.w, obj.h, color=image.COLOR_RED)
msg = f"{detector.labels[obj.class_id]}: {obj.score:.2f}"
img.draw_string(obj.x, obj.y, msg, color=image.COLOR_RED)
disp.show(img)
For YOLO26 or YOLOv8, replace nn.YOLO11 with the corresponding MaixPy model interface.
View Jobs and Logs
Each conversion creates an independent job directory under jobs/:
jobs/<job_id>/
The Web page lists recent jobs and provides their status, logs, result downloads, and deletion controls. If a conversion fails, check the live log first or inspect these files in the job directory:
api.log
convert.log
job.json
convert.log contains the main output from the model-conversion toolchain and is usually the best place to diagnose output-node, calibration-dataset, Docker-image, or conversion-parameter problems.
FAQ
Docker Permission Denied
If docker ps reports insufficient permissions, Linux users can add the current user to the Docker group:
sudo usermod -aG docker $USER
Log out and back in after running the command, then check docker ps again.
Docker Image Not Found
If the log contains Unable to find image, inspect the available image names:
docker images
MaixCAM2 requires pulsar2:6.0, while MaixCAM and MaixCAM Pro require maixcam-tpumlir:v3.4. A different repository name or tag prevents the platform from locating the conversion environment.
Not Enough Calibration Images
The Image Count value cannot exceed the number of valid images in the uploaded ZIP archive. If the archive contains only 50 images, do not set the value to 100.
Incorrect Classes in a Custom Model
The platform tries to read class names from the .pt model or ONNX metadata. If the deployed model reports incorrect class names or counts, check whether labels in the generated .mud file matches the trained model.
Directory Mount Failure on Windows
Windows users must ensure that Docker Desktop is running with the WSL2 backend enabled. Keep the project in a short path containing only ASCII characters, such as C:\maix_converter_platform, to avoid Docker bind-mount problems caused by non-ASCII characters, special symbols, or deeply nested paths.
Source Code
To report a problem, suggest an improvement, or request support for additional models, open an Issue in the project repository: