👽 Sipeed MaixCAM
Edge computer vision at the source. Run local vision models on a Sipeed MaixCAM and send the resulting structured detection events to your private Companion Memory. Raw video and camera frames stay on the device.
Overview
Companion Capture for MaixCAM is a MaixPy v4 app for the Sipeed MaixCAM and MaixCAM Pro. It runs the models you enable on the camera’s live feed, logs every detection as a JSON event in a per-session file on the SD card, and, when you configure it, uploads each finished session to your Companion Memory capture ingest API.
It’s a capture surface, like the Companion desktop capture app. It isn’t a Companion Hub app: you install it on the camera, not from the Hub app store, and the camera talks to Companion Memory directly with an API key.
Status: prototype. You can’t install it yet. It has no public download or store listing, and its source repository is private, so you can run it only if Companion Intelligence gives you access. To ask about access or follow progress, join the Discord . The app is version 1.2.0 and isn’t validated on hardware: the project’s own changelog says it hasn’t been checked against a real MaixCAM, a live Companion Memory, or real model files, only against what runs off-device in its unit tests.
The app doesn’t have a Hub dashboard, a model manager, multi-camera management, MQTT output to Home Assistant, or an RTSP stream. It doesn’t ship models: you copy the model files to the device yourself. It uploads JSON detection events only, never images.
Key features
- On-device inference — models run on the MaixCAM’s NPU with the
maixruntime. No raw video leaves the device. - 13 selectable models — 8 computer vision, 3 audio, and 2 media entries, chosen on a touch setup screen. See Models.
- Session logs — each capture session writes one JSON file under
/sd/logs/with a session ID, start and end times, and every detection event. - Sync to Companion Memory — optional. When enabled, each ended session’s events upload to
/v1/events. Uploads wait while Wi-Fi is down and retry with backoff. Nothing is deleted locally until a batch is confirmed uploaded. - Thermal throttling — AI inference is skipped for a frame when the CPU is at or above the configured temperature (75 °C by default).
Supported hardware
| Device | Status |
|---|---|
| Sipeed MaixCAM | Target device. It has 256 MiB of RAM shared between the camera, NPU, and model weights, so enable only the models you need. |
| Sipeed MaixCAM Pro | Target device |
Both run MaixPy v4 (MaixCDK-based) firmware. You also need an SD card for the configuration file and session logs. For the hardware, see the Sipeed MaixCAM documentation .
Models
The setup screen groups models as follows. Every model you enable loads into the same small memory pool at startup, so a device with two or three models on runs faster than one with all of them.
| Group | Models |
|---|---|
| Computer vision | Object Classification, Face Recognition, Face Emotion Detection, Object Tracking and Counting, OCR (Optical Character Recognition), Hand Landmarks Detection, Human Pose Classification, Hand Gesture Classification |
| Audio | Audio Recording, Audio Playback, Real-time Voice Recognition |
| Media | Video Recording, Video Playback |
On a fresh install these are on: Object Classification, Face Recognition, Face Emotion Detection, Audio Recording, Audio Playback, Real-time Voice Recognition, Video Recording, and Video Playback.
The app expects these model files, in MaixPy’s .mud format, at these default paths. A missing file disables only that model.
| Model | Default path |
|---|---|
| Object Classification (YOLOv8) | /root/models/yolov8n.mud |
| Face Recognition | /root/models/retinaface.mud |
| Face Emotion Detection | /root/models/face_emotion.mud |
| OCR | /root/models/pp_ocr.mud |
| Hand Landmarks Detection | /root/models/hand_landmarks.mud |
| Human Pose Classification | /root/models/yolov8n_pose.mud |
Object Tracking and Counting needs no model file. Hand Gesture Classification falls back to a geometric check on the hand landmarks when its model file doesn’t load. Real-time Voice Recognition needs a keyword-spotting model and a keyword table that the app doesn’t supply, so it does nothing until you provide both.
Architecture
Inference happens on the camera. Only JSON detection events cross the network.
flowchart TD
CAM["MaixCAM<br/>camera → NPU inference"] --> DL["Session log<br/>JSON on the SD card"]
DL -->|"session ends"| UP["Uploader<br/>retries with backoff"]
UP -->|"HTTPS · x-api-key<br/>POST /v1/events"| M["Companion Memory<br/>capture ingest"]Setup
You need a MaixCAM or MaixCAM Pro, an SD card, and a Companion Memory instance the camera can reach over Wi-Fi if you want sync.
Update the MaixPy firmware
Update the camera with the MaixVision IDE or the official MaixPy image. The maix module ships with that firmware. It isn’t a pip package.
Copy the model files to the camera
Push the .mud file for each model you plan to enable to its default path (see Models).
Connect the camera to Wi-Fi
Set up Wi-Fi in the camera’s built-in Settings app, using the QR or manual option, before you launch Companion Capture.
Copy the app and run it once
Copy the app’s src/ folder to the camera and run it. The first run creates /sd/companion_config.json with defaults, and the Companion Capture Setup screen appears. The src/ folder comes from the app’s private source repository, so you need access to it.
Choose your models and start
On the setup screen, tap a model’s checkbox to toggle it. ALL ON and ALL OFF select every model. Tap START to save your selection and launch the app, or CANCEL to exit without changing anything.
Connect Companion Memory (optional)
Create a Companion Memory API key with the Capture scope and Read & write capability. See Get your API keys. Then set these values under network in /sd/companion_config.json and restart the app:
"network": {
"upload_enabled": true,
"endpoint_url": "https://companion.example.com",
"api_key": "YOUR_CAPTURE_KEY"
}endpoint_url is your Companion Memory’s base URL, with no path. The app adds /v1/events itself and retries under /api if the first path returns 404.
Usage
- Start or stop a capture session — touch the top-left corner of the screen. While capturing, every enabled model runs on the live camera feed, and any detection is logged as a JSON event.
- Exit the app — touch the top-right corner.
- Status bar — shows the frame rate, the number of active models, the capture state, and, during a session, the events logged this session and in total.
When a session ends, its file is queued for upload if sync is on. Uploaded sessions move to an uploaded/ folder under the log path, compressed by default, and the app keeps the ten most recent session files.
What Companion Memory receives
Each detection is sent as one capture event with source_system set to ci-maixcam, a kind such as object_detection, a timestamp, a title, the detector’s own event as the payload, and the highest detection confidence when there is one. Companion Memory stores the payload opaquely, so you can find events by kind and title but not by the labels inside them. The camera never uploads images.
Troubleshooting
A model never produces events
Check that its .mud file exists at the configured path. A missing file is logged and that model stays disabled while the app keeps running. If the file loads but nothing is detected, lower the model’s confidence_threshold in the configuration file.
Sync isn’t happening
network.upload_enabled must be true and network.endpoint_url must be a real Companion Memory address. It is empty by default. Sync is skipped while Wi-Fi is disconnected and resumes on its own. Confirm the API key has the Capture scope: a rejected key logs an HTTP 401 or 403 and keeps retrying.
The app is slow, or runs out of memory Turn off models you don’t need on the setup screen. Only the models you enable are loaded.
Storage is filling up The app keeps only the ten most recent session files and archives uploaded sessions. Check the SD card’s free space if sessions keep piling up while sync is off.
Links
- Sipeed MaixCAM documentation
- CCTV Camera Database — open dataset of IP camera specifications; search, filter, and compare camera models
- Get your API keys
- Companion Memory
- How the Companion devices compare