labeled aquarium images.
Explore Bob's Tank
Bob's Turtle Tank
Bob The Turtle's Turtle and Fish Tracker Model
A compact two-class detector trained on aquarium images. This record documents the dataset, method, evidence, and limits.
fish and turtle boxes.
epochs in 9 hours 37 minutes.
pixels at batch size 32.
Technical record
Methods, artifacts, and reproducibility.
The full record covers data preparation, training safeguards, evaluation, saved artifacts, derived figures, and the limits of the evidence.
Dataset
The dataset contains 24,099 labeled objects: 22,843 fish and 1,256 turtles. Class ID 0 is fish; class ID 1 is turtle.
| Split | Images | Boxes | Fish | Turtles |
|---|---|---|---|---|
| Training | 1,176 | 17,309 | 16,511 | 798 |
| Validation | 200 | 4,300 | 4,020 | 280 |
| Test | 200 | 2,490 | 2,312 | 178 |
| Total | 1,576 | 24,099 | 22,843 | 1,256 |
Training contains 74.62% of the images; validation and test each contain 12.69%.
The average is 15.29 labeled objects per image: 14.72 in training, 21.5 in validation, and 12.45 in test.
Fish account for 94.79% of all boxes; turtles account for 5.21%.
The dataset contains about 18.2 fish boxes for every turtle box, an imbalance that affects interpretation of the results.
Data validation
The launcher was designed to refuse a bad run. It verified the train, validation, and test directories; class names and ordering; and expected image and annotation totals.
- Every image required a label file, and every label file required an image.
- Every JPG, JPEG, PNG, BMP, and WebP image was opened to catch corruption.
- Labels had to use the five-field YOLO format with known classes.
- Coordinates had to be normalized; box centers had to remain between 0 and 1; widths and heights had to be positive.
- Stale dataset caches were removed; the starting model and Apple MPS availability were confirmed.
- The run would not start with less than 50 GiB of free disk space.
The held-out test scan found 200 images, 2,490 annotations, zero background-only images, and zero corrupt images.
Training protocol
Ultralytics YOLO11n, the compact nano variant, was used for object detection. Training started from yolo11n.pt with 768 × 768 inputs, a batch size of 32, Apple MPS, and all 100 planned epochs. Validation, plots, every epoch checkpoint, best and last weights, postflight verification, and a separate post-training test evaluation were enabled.
Execution was deterministic with seed 0, automatic optimizer selection, and a cosine learning-rate schedule.
Early stopping and dataset caching were disabled; CPU data-loader workers were set to 0; automatic mixed precision was disabled for MPS reliability.
Mosaic augmentation was set to 0.5 and disabled for the final 20 epochs. Translation was 5%, scale was 25%, and MixUp, CutMix, horizontal flip, and vertical flip were disabled.
caffeinate, permanent logs, orphan protection, and state restoration prevented sleep and returned services to their prior state after training.
Run ID bobs-clean-yolo11n-img768-b32-e100-allckpt-20260709-200639 completed on July 10, 2026 at 5:45:55 a.m. EDT after 9.619 hours: about 9 hours 37 minutes 8 seconds total and 5 minutes 46 seconds per epoch.
Validation and test results
best.pt was selected from validation and evaluated separately on the held-out test set. Both sets are shown because they have different class mixes and visual difficulty.
| Result | Precision | Recall | mAP@50 | mAP@50–95 |
|---|---|---|---|---|
| Overall | 81.5% | 53.8% | 58.9% | 34.6% |
| Fish | 82.1% | 70.4% | 77.7% | 43.8% |
| Turtle | 80.9% | 37.1% | 40.2% | 25.4% |
| Result | Precision | Recall | mAP@50 | mAP@50–95 |
|---|---|---|---|---|
| Overall | 78.1% | 82.4% | 87.2% | 61.7% |
| Fish | 68.1% | 89.5% | 84.6% | 57.0% |
| Turtle | 88.1% | 75.2% | 89.8% | 66.4% |
Precision describes how often a reported detection was correct; recall describes how many labeled objects were found.
mAP@50 uses a 50% box-overlap threshold; mAP@50–95 averages increasingly strict overlap thresholds.
Fish appear in all 200 test images. Turtles appear in 176 of 200 test images, or 88%.
The test split is 92.85% fish and 7.15% turtle by annotation count: roughly 13 fish boxes for every turtle box.
Turtle validation precision indicates that many reported turtle detections were correct, while 37.1% validation recall shows that a meaningful share were missed. The stronger held-out test result is not presented as universal accuracy; lighting, occlusion, object size, visual difficulty, and class balance can vary across splits.
Inference performance
Test pass: 0.2 ms preprocessing, 3.8 ms inference, and 4.8 ms postprocessing, or about 8.8 ms total per image.
Validation pass: 0.2 ms preprocessing, 14.3 ms inference, and 7.3 ms postprocessing, or about 21.8 ms total per image.
Test-pass throughput is about 263 images per second for inference alone and about 114 images per second for the listed full pipeline.
Validation-pass throughput is about 70 images per second for inference alone and about 46 images per second for the listed full pipeline.
Validation image reads measured 912.5 ± 63.8 MB/s, average image size was 387.6 KB, file-access ping was 0.0 ± 0.0 ms, and test-label scanning was around 6,300 images per second. That scan rate measures data access, not model inference. Deployment speed will depend on the computer, video decoding, camera resolution, batch size, and application overhead.
Checkpoints and deliverables
The run retained epoch0.pt through epoch99.pt, best.pt, last.pt, results.csv, training and validation plots, a separate test_metrics.json, permanent terminal output, and a timestamped run directory. Training results are numbered 1 through 100; checkpoint filenames are numbered 0 through 99.
All 100 epoch checkpoints loaded successfully; both best.pt and last.pt were present and valid.
Each full epoch checkpoint is about 20 MB, or roughly 2 GB for all 100 together.
Optimizer state was stripped from best.pt and last.pt, leaving each at about 5.2 MiB on macOS, or roughly 5.5 MB in decimal reporting.
results.csv is about 12 KB; test_metrics.json is 211 bytes. best.pt is the deployment weight and was copied as FINAL_MODEL_best.pt for transfer.
Reproducibility record
The final launcher SHA-256 is b7f04d1a7e2ef340ff9dc2e18de0e72a0dd959ecff75ba5b7bf56030ee95b7fe. The complete archive was copied to an external SSD and verified with SHA-256 4d7e0993777904a923eb4549de7ddd7a48cd392199d145f9aa55b91998c1f62e.
The run presented 117,600 baseline training-image views across 100 epochs and about 1.73 million labeled-object views before augmentation.
It ran about 37 mini-batches per epoch, or about 3,700 mini-batches across the completed run.
It processed about 69.36 billion resized input pixels across those baseline image presentations.
Effective wall-clock throughput was around 3.4 training images per second when validation, checkpointing, plots, and other overhead were included.
Final validation and test passes evaluated 400 images and 6,790 labeled objects: 6,332 fish boxes and 458 turtle boxes.
The strongest class mAP@50 was 89.8% on turtles; the highest recall was 89.5% on fish; the highest precision was 88.1% on turtles.
The model has 101 fused layers, 2,582,542 parameters, and 6.3 GFLOPs. The run used Ultralytics 8.4.90 with Python 3.14.6 and PyTorch 2.12.1 on Apple MPS. The framework's “0 gradients” line describes the final fused inference/validation pass, not an absence of gradients during training.
Model selection
An unlabeled completion row for the same 200 validation images and 4,300 instances reports 77.1% precision, 52.0% recall, 55.8% mAP@50, and 30.9% mAP@50–95.
The best checkpoint improved precision by 4.4 percentage points, recall by 1.8 points, mAP@50 by 3.1 points, and mAP@50–95 by 3.7 points. The selected best checkpoint is deployed.
Limitations
- mAP is not one generic accuracy percentage.
- 87.2% is mAP@50 on the held-out project test split, not universal real-world accuracy.
- The curated project test set is not an external third-party benchmark.
- Validation and test differ substantially, especially for turtles.
- The fish-heavy class imbalance and 37.1% turtle validation recall remain material limits.