一个基于 YOLO11 的羊只计数项目,优先保证召回率,支持数据训练、模型验证,以及图片、视频和摄像头输入的推理计数。
- 图片羊只检测与计数
- 视频逐帧检测与基于跟踪的去重计数
- 摄像头实时统计当前帧数量与累计出现数量
- 默认采用偏高召回参数:低
conf、vid_stride=1、stream_buffer=True
SheepCount/
├── main.py
├── run_image_test.py
├── train.py
├── val.py
├── requirements.txt
├── dataset/
├── outputs/
├── examples/
├── weights/
└── src/
├── config.py
├── detector.py
├── counter.py
└── visualize.py
建议使用 Python 3.10+。
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt阶段化执行说明见 PROJECT_PLAN.md。
推荐流程如下:
- 采集图片或视频帧
- 标注羊只框
- 按 YOLO 格式整理到
dataset/ - 训练
YOLO11 - 验证召回率
- 用训练好的
best.pt做计数推理
数据目录格式见 dataset/README.md 和 dataset/sheep.yaml。
python train.py \
--data "dataset/sheep.yaml" \
--model "yolo11n.pt" \
--epochs 100 \
--imgsz 1280 \
--batch 16 \
--single-cls训练完成后,常用权重会在:
runs/sheep/train6/weights/best.pt
python val.py \
--data "dataset/sheep.yaml" \
--model "runs/sheep/train6/weights/best.pt" \
--imgsz 1280 \
--conf 0.05python main.py \
--mode image \
--source "examples/sheep.jpg" \
--model "runs/sheep/train6/weights/best.pt"如果你不想每次手动输入命令,可以直接修改 run_image_test.py 顶部的参数,然后在 IDE 中点击运行它。脚本会自动读取图片、调用模型,并把结果保存到 outputs/。
python main.py \
--mode video \
--source "examples/sheep.mp4" \
--model "runs/sheep/train6/weights/best.pt" \
--showpython main.py \
--mode camera \
--source 0 \
--model "runs/sheep/train6/weights/best.pt" \
--show--model:YOLO11 权重路径或模型名--class-name:目标类别名,默认是sheep--conf:置信度阈值,越低越偏向高召回--iou:NMS IoU 阈值--imgsz:推理尺寸,适当增大有助于小目标召回--tracker:视频/摄像头跟踪配置,默认bytetrack.yaml--vid-stride:视频抽帧步长,默认1--stream-buffer/--no-stream-buffer:是否缓存流帧--no-save:只运行,不保存输出文件--show:弹窗显示视频或摄像头结果
训练相关常用参数:
train.py --data:数据集 YAMLtrain.py --single-cls:只有羊一个类别时建议开启train.py --imgsz:训练尺寸,适当增大更利于小目标召回train.py --close-mosaic:最后若干 epoch 关闭 mosaic,帮助收敛val.py --conf:验证时置信度阈值,低一些更便于观察召回
默认输出到 outputs/:
- 图片模式:保存带框结果图和一个 JSON 摘要
- 视频/摄像头模式:保存带框视频和一个 JSON 摘要
标准输出会打印本次计数结果的 JSON,便于后续接入其他系统。
如果你更关心“尽量别漏羊”,建议优先这样调:
- 将
--conf调低到0.05 ~ 0.15 - 保持
--vid-stride 1 - 提高
--imgsz,例如1280或更高 - 对摄像头或视频流保持
--stream-buffer
这会带来几个副作用:
- 误检会增加
- 相互遮挡时可能出现重复框
- 视频累计计数依赖跟踪稳定性,严重遮挡下仍可能重复计数或漏计
如果你的目标是“宁可多报一点,也尽量别漏羊”,建议训练时注意:
- 尽量覆盖不同光照、远近、遮挡、密集度场景
- 给小目标羊和边缘羊足够多的标注样本
- 验证集不要只放容易样本
- 优先观察
Recall,再兼顾mAP50 - 如果召回不够,优先补数据,其次再调训练尺寸和增强
如果直接使用通用预训练权重,项目能先把流程跑通,但不一定能在你的羊场场景里获得足够高的召回率。要进一步提高效果,建议这样做:
- 采集你自己的羊群数据
- 用羊只数据集微调
YOLO11 - 根据现场机位再调
conf、imgsz和 tracker 参数
- 当前版本已经包含基础训练与验证流水线
- 如果自定义权重里的类别名不是
sheep,请通过--class-name指定实际类别名