Computer Vision
Teaching Milestone to See Animals
A YOLO detector on the video server's own GPU turns everything that crosses the home cameras into labeled, searchable bookmarks in Milestone XProtect. The deer was the hard part.
- Integration paths tried
- 3
- Labels for one deer
- 3
- Cats called cats
- 100%
Problem
Milestone XProtect is the platform I provision for enterprise clients, and it is also what records the six cameras at my house. Out of the box, its search understands two kinds of object, people and vehicles, and only when the cameras report them. Consumer cameras do not. Whatever crossed the front yard at half past midnight was in the recording somewhere, and finding it meant scrubbing through hours of video.
The goal: every person, vehicle and animal on the front yard becomes a labeled, click-to-play bookmark in Milestone, with the detection boxes visible on playback, on hardware already on hand. Animals were the point. The deer, the neighborhood cats, the dogs.
The capture above is the detector’s own output on a June afternoon. Every box is right except one, and that one is the story of this page.
Approach
The detector is YOLO11, a real-time object detection model, running on the Milestone server’s own GPU, which until then had never done anything but record video. Each camera produces two outputs. The first is a copy of the feed with the boxes and motion trails drawn on, which Milestone records like any other camera, so playback shows exactly what the detector saw. The second is a one-line event for every detection, which a Milestone rule turns into a bookmark on the right camera. Search, open the bookmark, watch the moment.
An early version bookmarked a parked car all night. The final one only fires when an object is new or actually moving.
Milestone offers two official ways to feed it events from outside, and both rejected the integration for different reasons. The third, a plain-text event port, accepted the first message sent to it. Three paths tried, one that worked, and the dead ends documented so they never need to be walked again.
There is no deer in COCO, the dataset the model learned from. It knows cats, dogs, horses, sheep, cows, even zebras and giraffes, but a whitetail is none of those. Faced with a shape it half recognizes, the model picks the nearest thing, and the nearest thing changes with the pose. One deer, one continuous track: a dog, then a horse at 67 percent, then a sheep two seconds later, then a horse again. The cats, which are in COCO, were cats every single time.
None of that indecision reaches Milestone. Every animal class collapses to a single label, ANIMAL, before the event leaves the detector, so the bookmark reads “Animal · Driveway” whether the model saw a horse or a sheep. The clip below is the whole lesson in two and a half minutes, with the cats as the control group.
Result
Proven end to end on the two cameras that matter most: detections in, bookmarks on the right camera, annotated playback recording alongside the originals. The limit turned out to be memory, not compute. The server has 16 GB of RAM, Milestone already uses half of it, and the two detector processes took the rest while the GPU sat at 38 percent with room to spare. The GPU was sized carefully. The host around it was not.
A memory upgrade brings it back. The integration path is settled, and Milestone can already do the one thing it could not: find the animals.