Cow detection
Forecast vs. real weather
What the herd is doing
Cows vs. the National Weather Service
Waiting for both forecasts
Next 12 hours
Cows on top, NWS belowLast 12 hours
Farm cams
Click one to show it aboveAppendix: how the forecast is made
1. Finding the cows
The server grabs still frames from each cam's live stream. Each cam has its own timer. It takes a new frame every 10 seconds while cows are in view in daylight, every minute when there are no cows or it is dark at the farm, and every 5 minutes while the cam is down.
Each frame goes to a Roboflow Workflow on Roboflow's serverless API. In the workflow, an RF-DETR Medium object detection model, trained in Roboflow on labeled cow images that include frames from these cams, puts a bounding box around each cow it finds, labels the cow standing, sitting or eating (drinking counts as eating), and gives each box a confidence score. Each behavior has its own confidence cutoff, taken from the model's evaluation, and the workflow drops boxes under it. RF-DETR sometimes boxes one cow twice, so the server drops any box that overlaps a more confident box with an intersection over union (IoU) of 0.7 or more, or sits at least 80% inside one.
2. Replays and camera moves
Explore.org cams loop old highlight clips after dark and whenever a cam is down. The server spots those frames by the highlight badge in a corner of the picture, looking for bright text inside a box that is darker than the strip next to it. A cam that was replaying counts as live again after two frames in a row without the badge, and highlight frames stay out of the forecast while any cam at the farm is live.
Each frame also gets a 64-bit difference hash, a fingerprint made from a 9 × 8 grayscale thumbnail. When more than 12 of the 64 bits change between two frames from one cam, the camera moved or the stream cut to other footage, and the server leaves that pair out of the Restless signal.
3. Signals
Every signal uses the cow boxes from the last 30 minutes of frames at the selected farm.
| Signal | How it is measured |
|---|---|
| Sitting | Sitting boxes divided by all cow boxes |
| Bunched up | In each frame, the average distance from each box center to the center of all the boxes, as a share of the frame. The signal is 1 − (the median of that distance across frames ÷ 0.35), kept between 0 and 1 |
| Restless | Each frame is paired with the same cam's frame from about a minute earlier, and each box is matched to the nearest box in the earlier frame (there is no tracker). For each pair, the average distance the box centers moved. The signal is the median of those distances, scaled to one minute, divided by 0.12 of the frame and capped at 1. Pairs where the view changed, or where the boxes moved more than 15% of the frame on average, are skipped |
| Eating | Eating boxes divided by all cow boxes |
| Sitting trend | Sitting share in the last 15 minutes minus the share in the 45 minutes before that, capped at plus or minus 0.25 |
4. Rain chance
12 + 58 × sitting + 12 × bunched + 10 × restless − 12 × eating + 40 × trend
The result stays between 3% and 97%. From 70% up the call is Rain likely, 50 to 69% is Showers possible, 30 to 49% is Clouds building, and under 30% is Fair and dry.
5. The clock
The inner ring is the NWS hourly chance of rain. The outer ring starts at the cows' current chance and drifts back toward 30% with a 4-hour time constant: the chance h hours out is 30 + (current chance − 30) × e−h/4. The cows-vs-NWS score is 100 minus the average gap between the two rings over the next 6 hours.
6. Groups
Two cows join the same group when the gap between their boxes is less than half a cow length, measured on the smaller cow's longer side. Groups of three or more get a purple outline drawn around their boxes.
7. Scoring against the real weather
For each past hour, the page compares the cows' chance at the start of the hour, and the NWS chance for that hour as forecast before it began, with reports from the nearest NWS station. An hour counts as wet when the station measured rain or reported rain, drizzle, showers, thunder or snow. A forecast is right when it gave 50% or more and the hour was wet, or under 50% and the hour stayed dry. The NWS API only serves current forecasts, so NWS hours are scored from the time this server started logging them.