Michele Damian

Security Agent

Cameras that remember who they’ve seen.

A security camera system that spots people and vehicles on a tiny edge computer, recognizes them across cameras and across days, and answers questions about them in plain English.

What the demo shows

  1. A person walks through camera 1’s view.
  2. Camera 2 picks them up and recognizes them as the same person.
  3. In chat, someone asks who the cameras saw in the last few minutes. The answer names that person.
  4. They set an alert: “tell me when this person comes back.” Camera 1 sees them again, and the alert fires.

The results

  • 2 fps

    Detection and tracking on a Raspberry Pi Zero 2. 512 MB of memory, no GPU, no fan.

  • 5%

    of frames ever reach the cloud. Only genuine movement gets sent.

  • XX%

    Top-1 re-identification across cameras that don’t overlap, over N real crossings.

  • X s

    From a person reappearing on camera to the alert in chat.

  • Capped

    AI cost per event. A fixed frame budget, whether someone walks past or lingers.

  • $X

    Cloud cost per camera, per month.

Three parts, one system

  1. On the camera

    Finds people and vehicles, follows each one from frame to frame, and keeps only the moments where something really moves.

  2. In the cloud

    A vision-language model describes what happened. Appearance signatures link the same person or vehicle across cameras and days, into one searchable history.

  3. In your chat

    Ask questions and set alerts in plain English. Alerts arrive the moment they fire.

It notices what moves, not what flickers.

Swaying branches, passing headlights, a parked car: the pixels change, but nothing is happening. The camera estimates how fast each object really moves through the scene, from a single uncalibrated lens, and wakes the cloud only when it matters.

That’s why 95% of frames never leave the device.

A parked car marked as stationary and ignored, next to a walking person marked as moving car ID:3 stationary person ID:4 moving
The parked car is tracked but never sent. The walking person is.

It knows who it has seen before.

Every person and vehicle gets an appearance signature. When the same one walks into another camera’s view, or comes back next week, the system connects the sightings.

Recurring visitors surface on their own, without anyone labeling them.

The same person seen by camera 1 and then camera 2, keeping the same identity Camera 1, 10:41 person ID:7 Camera 2, 10:42 person ID:7 Same person, two cameras

Three cameras. One car, not three.

A family house on a corner, with a camera on each way in: the driveway, the side gate, the back gate. Each one watches the house’s own ground, and none of their views overlap.

When the same car turns up at the back gate, then the side gate, then the driveway, its appearance signature ties the sightings together. You get one car and where it went, not three unrelated alerts.

Map of a corner house bordered by three streets, with a neighbour's house on the fourth side. Three numbered cameras on the house watch the driveway, the side gate and the back gate; their views don't overlap and stop at the street. A car drives past the back gate, the side gate and the driveway, and each camera picks it up in turn as car ID 12. Driveway Back gate Side gate Maple St Cedar St Birch Ave 1 2 3 car ID:12 20 m
Solid where a camera sees the car, dashed where none does. Same car, ID:12, at every gate.

Ask it. Don’t scrub through footage.

A question in chat becomes a search of the event history that the AI writes, checks and corrects on its own, then answers in plain English. Every search runs read-only, so a question can never change the data.

Alerts work the same way. Describe what you care about in your own words, and every new event is checked against it.

Built with

  • Python
  • OpenCV
  • LiteRT
  • Raspberry Pi
  • Gemini
  • FastAPI
  • Google Cloud Run
  • PostgreSQL + pgvector
  • Discord

Tennis Robot Vision

It knows where the ball will bounce, before it does.

One camera and a small edge computer follow a tennis ball at 50 frames a second, rebuild its flight in 3D, and call the bounce to within 5 inches.

What the demo shows

  1. A player rallies on a real court, filmed by a single camera.
  2. The ball is found and followed in every frame, at full speed.
  3. An overhead map in the corner plots where the ball is on the court, live.

The results

  • 5 in

    Accuracy of the predicted bounce spot, from one camera.

  • 50 fps

    On an NVIDIA Jetson Nano, while the same processor records video.

  • X×

    Faster than YOLO on the same device, and more accurate on tennis balls.

  • X ms

    Before the ball lands. The call is made while it is still in the air.

  • 0

    Manual calibration steps. The procedure it replaced was done by hand.

  • 5

    People on the data team I directed, building tennis datasets that had no public equivalent.

It finds a ball a few pixels wide.

At the far baseline a tennis ball is a smudge, and general-purpose detectors lose it. A detector built for this one job finds it faster and more reliably than YOLO.

When several spots look like a ball, the tracker keeps each possibility open until the laws of motion rule out all but one.

A court with three ball-like candidates; the real ball is confirmed and shown magnified, a few pixels across ball A few pixels across
Three candidates, one ball. The other two don’t move like one.

One camera. The whole court in 3D.

How far away the ball is comes from how big it looks. Where the player stands comes from mapping the image onto the court itself. Both are solved exactly, lens distortion included, so the flight path can be carried forward to the bounce.

Setting up the camera used to be a manual calibration job. It now calibrates itself.

A ball's observed flight over the court, continued as a dashed prediction to its bounce point predicted bounce
Solid: where the ball has been. Dashed: where it will land.

Built with

  • Python
  • OpenCV
  • ONNX
  • NVIDIA Jetson Nano
  • Redis
  • AWS SageMaker Ground Truth
  • Mathematica