Tensor Camera icon TENSOR CAMERA

iOS · free · your model, your machine

Point your phone
at something.
See what your
model thinks.

Tensor Camera turns your phone into a live viewfinder for a machine learning model running on your own computer. Frames go out, predictions come back, and you watch it happen in real time.

Nothing is uploaded anywhere. Your frames go to your server and nowhere else.

A black labrador filling the camera viewfinder
CONNECTED
PREDICTION
DOG 94%
cat 4%background 2%
your laptop
$ tensorcamera serve

  Tensor Camera server on ws://192.168.2.118:8080
  model: your-classifier.keras

  Scan this with the app:
  ✓ phone connected · 15 fps · 68 ms

How it works

Three moving parts. You only write one.

Your model stays on your machine, in whatever framework you already use. The app is the eye; the protocol is the wire between them.

01

Start your model

Wrap it in six lines of Python, or run a pretrained one with a single command. The server prints a QR code when it's ready.

02

Scan to connect

Point the phone at the code on your screen. No IP addresses, no port numbers, no typing on a phone keyboard.

03

Point it at the world

Frames stream to your model and predictions come straight back to the viewfinder, labelled and scored, live.

What it does

A viewfinder that can also act.

LIVE PREDICTIONS

Your model, at arm's length

The label fills the screen so you can read it while holding the phone out at a subject. Confidence, runners-up and frame rate sit underneath. If predictions stop arriving, it says so instead of showing you a stale answer.

label · confidence · top-k · fps · staleness
ACTIONS

When this, do that

Build a rule in one sentence: when dog is detected above 80%, play a sound. Or speak, vibrate, flash the torch, or POST to a webhook with the label and confidence filled in. Rules run on the phone, so they keep working if the connection drops.

sound · speak · haptic · torch · webhook
COLLECT

Build the dataset too

No server, no signal, no problem. Name a label, press start, and move around the subject while it captures. Export a folder that ImageFolder and Keras load with no preprocessing — one directory per class, exactly as they expect.

pantry_items/peanut_butter/0001.jpg
SETUP

Scan, don't type

The server prints a QR code carrying its address and, if you set one, its auth token. Saved servers reconnect with one tap the next day. Works on your Wi-Fi or against a cloud box over wss://.

ws:// local · wss:// cloud · token in the keychain
OPEN PROTOCOL

Write the server in anything

The wire format is documented and versioned, so the Python package is a convenience, not a requirement. If it speaks the protocol, the app talks to it — Node, Go, Rust, Java, whatever you already have your model in. Old servers keep working too: the handshake falls back for anything predating it.

Read the protocol spec ›  ·  Socket.IO · JPEG or raw float32 frames

Screens

Built to be read from across the room.

Dark, high contrast, and legible over any scene the camera is pointed at.

Collecting a hundred labelled photos of a crisp packet, sped up twelve times

Collect · sped up 12×

A hundred labelled photos in about two minutes.

Type a label, press start, and move around the subject while it captures. The prompts keep asking for variety — closer, further, different angle, different light — because a hundred identical frames teach a model nothing.

Then type the next label and go again. Export the folder and it trains as-is.

The rule editor, building a rule as a sentence
Rules, written as sentences
Scanning the QR code printed by the server
Scanning the code off the terminal
The sound library, empty and waiting for an import
Sounds your rules can play
Settings, showing stream quality and diagnostics
Quality, permissions, diagnostics

For developers

Six lines and a decorator.

The package handles the handshake, decodes frames to numpy, prints the QR code, and keeps the phone from sending faster than your model can think. You write the part that's actually about your model.

MIT
licence
3.9+
python
0
accounts required
from tensorcamera import TensorCamera

cam = TensorCamera(labels=["dog", "cat"])

@cam.on_frame
def predict(frame):
    # frame.array -> numpy, HWC, RGB
    label, score = my_model(frame.array)
    return {"label": label, "confidence": score}

cam.serve()  # prints a QR code