Downloads · 30 days
291
100% of all-time downloads
CowcatcherAI/Cowcatcher
Cowcatcher is a object detection model from CowcatcherAI. Use it when you need objects located in an image. It is set up for ultralytics. The card lists the license as agpl-3.0.
<p align="left" <a href="https://jacobsfarm.github.io/website/"<img src="https://img.shields.io/badge/Website-cowcatcherai.com-blue?logo=googlechrome&logoColor=white" alt="Website"</a <a href="https://huggingface.co/s…
Downloads · 30 days
291
100% of all-time downloads
All-time downloads
291
Public
Repo size
511 MB
Likes
0
Public
Click a slice to open those files.
.pt511 MB · 100%
From the Hugging Face model README
Check out the website for all the information: cowcatcherai.com The website is available in multiple languages such as Deutsch, Français, Nederlands, and Español.
Cowcatcher is a vision model that detects mounting behaviour in cattle from camera images. Mounting is one of the clearest visual signals that a cow is in heat, so a reliable detector lets a barn camera flag oestrus automatically instead of relying on someone watching the herd.
All models are single-class (mounting) Ultralytics models, trained at 640 px on farm camera footage
from multiple dairy and beef sites, in daylight, night/IR and robot-barn conditions.
Latest and best model: cowcatcherV17.2.pt. It is the only model in the comparison that produces
zero false alarms on the null set, at any threshold from 0.50 upward.
| File | Task | Base | Train imgsz / epochs | Size | Notes |
|---|---|---|---|---|---|
cowcatcherV17.2.pt | Detection | yolo26m | 640 / 50 | 44 MB | Recommended. Best precision and best confidence separation |
cowcatcherV17.pt | Detection | yolo26m | 640 / 400 | 131 MB | Previous main model, higher recall at low thresholds |
cowcatcherV16.pt | Detection | yolo26m | 640 / 400 | 88 MB | Highest recall at 0.88, but 21 false alarms |
cowcatcherV15.pt | Detection | yolo12m | 640 / 100 | 81 MB | Older generation |
cowcatcherV14.pt | Detection | yolo12m | 640 / 100 | 41 MB | Older generation, very few false alarms but low recall |
cowcatcherV13.pt | Detection | yolo12m | 640 / 100 | 81 MB | Oldest published model, kept for reference |
cowcatcherV1-seg.pt | Segmentation | yolo11m | 640 / 100 | 45 MB | Experimental mask model, not part of the benchmark below |
All six detection models are published here and all six appear in the benchmark tables below.
pip install ultralytics
from ultralytics import YOLO
model = YOLO("cowcatcherV17.2.pt")
# Single image
results = model.predict("barn_frame.jpg", conf=0.50)
for r in results:
for box in r.boxes:
print("mounting", float(box.conf), box.xyxy.tolist())
# Live camera / RTSP stream
for result in model.predict(source="rtsp://camera/stream", stream=True, conf=0.50):
if len(result.boxes):
print("Mounting detected")
For cowcatcherV17.2 the false-positive count stays at 0 across the entire 0.50–0.99 sweep, so the
threshold only trades away recall. F1 peaks at 0.50; anything up to ~0.80 is still a sensible
operating point if you want extra headroom.
| Threshold | Found (TP) | Missed (FN) | False alarms | Recall | Precision | F1 |
|---|---|---|---|---|---|---|
| 0.50 | 896 | 4 | 0 | 99.56% | 100% | 99.78% |
| 0.60 | 892 | 8 | 0 | 99.11% | 100% | 99.55% |
| 0.70 | 879 | 21 | 0 | 97.67% | 100% | 98.82% |
| 0.80 | 869 | 31 | 0 | 96.56% | 100% | 98.25% |
| 0.88 | 822 | 78 | 0 | 91.33% | 100% | 95.47% |
| 0.92 | 638 | 262 | 0 | 70.89% | 100% | 82.96% |
| 0.95 | 125 | 775 | 0 | 13.89% | 100% | 24.39% |
Every model in this repository was trained with the same script (train.py) — only the base
checkpoint and the epoch count change per version.
from ultralytics import YOLO
# Load model
model = YOLO("yolo26m.pt")
# Train with added augmentation
model.train(
data="dataset.yaml",
imgsz=640,
batch=16,
epochs=50,
patience=10,
#fraction=0.05, # currently uses 100% of the dataset; 0.8 = 80% of the set
save_period=5,
workers=0,
device=0,
#close_mosaic=10,
# Augmentation settings
augment=True, # General augmentation on/off
degrees=10, # Rotation up to 10 degrees
translate=0.1, # Translation up to 10%
scale=0.5, # Scaling between 0.5 and 1.5
fliplr=0.5, # 50% chance of horizontal flip
hsv_h=0.015, # Minor hue variations
hsv_s=0.7, # Saturation variations
hsv_v=0.4, # Brightness variations
mosaic=1.0 # Mosaic augmentation (combines 4 images)
)
Per-version settings — everything else in the script stays identical:
| Model | Base checkpoint | Epochs |
|---|---|---|
cowcatcherV17.2.pt | yolo26m.pt | 50 |
cowcatcherV17.pt | yolo26m.pt | 400 |
cowcatcherV16.pt | yolo26m.pt | 400 |
cowcatcherV15.pt | yolo12m.pt | 100 |
cowcatcherV14.pt | yolo12m.pt | 100 |
cowcatcherV13.pt | yolo12m.pt | 100 |
cowcatcherV1-seg.pt | yolo11m-seg.pt | 100 |
dataset.yaml points at the single-class (mounting) farm-camera dataset, which is not published here.
patience=10 stops a run early once validation stops improving, so the effective epoch count can be
lower than the number listed. Training ran on a single GPU (device=0), with workers=0 for Windows
compatibility.
Test set: 1000 held-out images — 900 real mounting events and 100 null/noise images (cattle, barns and robots without mounting). Six models evaluated on 2026-07-23.
Of the 900 mounting events, 11 are found by no model at 0.88, and 536 are missed by at least one model.
| Model | Recall % | Precision % | F1 % | False alarms | Missed | Accuracy % | ms/image |
|---|---|---|---|---|---|---|---|
| cowcatcherV17.2 | 91.33 | 100.00 | 95.47 | 0 | 78 | 92.2 | 24.1 |
| cowcatcherV16 | 96.33 | 97.64 | 96.98 | 21 | 33 | 94.6 | 24.4 |
| cowcatcherV17 | 86.89 | 99.11 | 92.60 | 7 | 118 | 87.5 | 24.3 |
| cowcatcherV15 | 74.44 | 97.95 | 84.60 | 14 | 230 | 75.6 | 27.3 |
| cowcatcherV14 | 65.00 | 99.66 | 78.68 | 2 | 315 | 68.3 | 27.4 |
| cowcatcherV13 | 50.11 | 99.34 | 66.62 | 3 | 449 | 54.8 | 29.0 |
Note that 0.88 is a legacy production threshold. It suits V16, but it sits far above the optimum for V17.2 — see the next table.
| Model | Best threshold | Found | Missed | False alarms | Recall % | Precision % | F1 % |
|---|---|---|---|---|---|---|---|
| cowcatcherV17.2 | 0.50 | 896 | 4 | 0 | 99.56 | 100.00 | 99.78 |
| cowcatcherV17 | 0.50 | 897 | 3 | 14 | 99.67 | 98.46 | 99.06 |
| cowcatcherV14 | 0.50 | 886 | 14 | 24 | 98.44 | 97.36 | 97.90 |
| cowcatcherV16 | 0.80 | 891 | 9 | 33 | 99.00 | 96.43 | 97.70 |
| cowcatcherV15 | 0.61 | 894 | 6 | 41 | 99.33 | 95.61 | 97.44 |
| cowcatcherV13 | 0.50 | 867 | 33 | 24 | 96.33 | 97.31 | 96.82 |
The gap between the mean confidence on real mounts and on null images decides how easy the model is to threshold. V17.2 is in a different class here: it is almost silent on noise (mean 0.008) while staying confident on real events (mean 0.918).
| Model | Avg conf — real mounts | Avg conf — null noise | Margin |
|---|---|---|---|
| cowcatcherV17.2 | 0.9180 | 0.0079 | 0.9101 |
| cowcatcherV17 | 0.9026 | 0.1469 | 0.7557 |
| cowcatcherV14 | 0.8718 | 0.2215 | 0.6503 |
| cowcatcherV13 | 0.8409 | 0.2250 | 0.6159 |
| cowcatcherV16 | 0.9316 | 0.4190 | 0.5126 |
| cowcatcherV15 | 0.8893 | 0.3875 | 0.5018 |
The same effect shows in the safety margin (5th percentile of real mounts minus 95th percentile of nulls). Every other model is negative — its distributions overlap — while V17.2 reaches +0.827:
| Model | Lowest conf on a real mount | Highest conf on a null | P05 mounts | P95 nulls | Safety margin |
|---|---|---|---|---|---|
| cowcatcherV17.2 | 0.1558 | 0.4382 | 0.8450 | 0.0176 | +0.8274 |
| cowcatcherV16 | 0.0051 | 0.9304 | 0.8866 | 0.9130 | −0.0264 |
| cowcatcherV17 | 0.4547 | 0.9107 | 0.8251 | 0.8907 | −0.0656 |
| cowcatcherV15 | 0.4584 | 0.9060 | 0.8194 | 0.8965 | −0.0772 |
| cowcatcherV14 | 0.0004 | 0.8925 | 0.7553 | 0.8407 | −0.0854 |
| cowcatcherV13 | 0.0001 | 0.8995 | 0.6154 | 0.8643 | −0.2489 |
Number of null images falling in each confidence bin — lower and further left is better.
| Bin | V13 | V14 | V15 | V16 | V17 | V17.2 |
|---|---|---|---|---|---|---|
| 0.00–0.20 | 68 | 70 | 51 | 47 | 79 | 99 |
| 0.20–0.60 | 11 | 6 | 6 | 7 | 9 | 1 |
| 0.60–0.86 | 15 | 19 | 28 | 17 | 4 | 0 |
| 0.86–0.94 | 6 | 5 | 15 | 29 | 8 | 0 |
| 0.94–1.00 | 0 | 0 | 0 | 0 | 0 | 0 |
cowcatcherV17.2. Best F1, zero false alarms, widest usable threshold window.
Pick this unless you have a specific reason not to.cowcatcherV16 still has the highest raw recall at the legacy 0.88 threshold, but pays for it with
21 false alarms out of 100 nulls and heavily overlapping confidence distributions.AGPL-3.0.
These weights are trained with Ultralytics, which is licensed under AGPL-3.0. Every checkpoint in this repository carries the Ultralytics AGPL-3.0 notice in its metadata, so the derived weights inherit that license.
In practice this means that if you use these models in a network-accessible service, AGPL-3.0 requires you to make the corresponding source of that service available to its users. If that does not work for your deployment, Ultralytics sells a commercial Enterprise License that removes the copyleft obligation — see ultralytics.com/license.