基于 YOLO11 的规模化禽舍鸡只行为视觉监测平台:从模型到 Streamlit 全流程实战

基于 YOLO11 的规模化禽舍鸡只行为 视觉 监测平台:从模型到 Streamlit 全流程实战

关键词:YOLO11、智慧养殖、家禽行为识别、Streamlit、目标检测、Ultralytics

一、背景

1.1 行业痛点

中国是全球最大的肉鸡 / 蛋鸡养殖国,规模化禽舍单栋的存栏量普遍在数万只以上。在这种"高密度 + 全封闭"的养殖环境里,鸡只的行为状态是判断其健康程度、饲喂效率与福利水平的最直观指标:

  1. 靠人工巡检的局限:饲养员每天最多 2~3 次巡舍,很难捕捉到"某一栏鸡进食量突然下降""某区域长时间无活跃个体"等关键异常;
  2. 传统传感器精度差:靠饮水器流量、料盘称重等间接指标推算行为,存在严重的时滞与噪声;
  3. 数据无法量化为生产力指标:行为数据没结构化,营养师 / 兽医也难以基于"今天进食占比 vs 站立占比"这种维度反向优化饲喂方案。

把摄像头 + AI 视觉感知接到禽舍后,用一台普通工控机就能 7×24 实时统计鸡群的进食 / 休息 / 站立比例 ,进而对接到饲喂控制器、环境调控器,是当前禽业数字化的标准动作。本项目就是这条路线下的一个完整落点:基于 YOLO11n,识别进食 / 休息 / 站立三类典型鸡只行为,并提供一个开箱即用的 Streamlit 可视化界面。

视频演示与源码 下载

www.bilibili.com/video/BV1qK...

包含:

📦 完整项目源码 📦 预训练 模型权重

🗂️ 数据集数据集

1.2 项目运行效果

1.3 项目介绍

核心创新点:

维度 设计
类目设计 把"鸡只检测 + 行为分类"合并为一个 3 类检测任务,便于密集场景下的统计
模型选型 YOLO11n,参数量约 2.6 M,单图 CPU < 100 ms,可部署在禽舍边缘工控机
部署形态 Streamlit 单页应用 + 本地 best.pt,零依赖中间件,便于离线现场部署
输入兼容 图片 / 批量图片(含 zip)/ 视频 / 摄像头四种输入复用同一推理引擎
适配场景 标准化笼养、平养、散养三种禽舍布局均已在训练集中覆盖

功能概览:

  • 🍚 单图检测:上传禽舍画面 → 实时返回带框图 + 行为类别 / 置信度 / 坐标明细
  • 📚 批量检测:单次最多 200 张,输出汇总表 + 行为分布柱状图 + zip 下载
  • 🎬 视频检测:mp4 / avi / mov / mkv 通通可读,逐帧推理后落盘新视频
  • 📷 摄像头实时检测:可对接禽舍 IPC 的 RTSP 流,做实时行为感知

3 种行为类别:

类别 描述
进食 采食槽周边的低头啄食行为
休息 卧地或蹲伏的静息状态
站立 直立、走动或观察的活跃状态

技术栈:

层 选型
模型框架 Ultralytics 8.3 + PyTorch
视觉算法 YOLO11n(Anchor-Free,C2f Backbone,Decoupled Head + DFL)
Web 前端 Streamlit 1.35 + 自定义 HTML 主题(暖橙 + 麦黄,呼应饲料色)
视频 / 图像 OpenCV、imageio-ffmpeg
数据可视化 Plotly / Streamlit 原生 chart
配置管理 单一 configs/project.yaml,行业话术 / UI / 推理阈值统一收口

二、设计框架

2.1 系统架构

scss 复制代码
            ┌──────────────────────────────────────────┐
            │      Streamlit Web 前端(单页 SPA)       │
            │  · 养殖控制台 / 单图 / 批量 / 视频 / 摄像头 │
            │  · 侧栏 · 阈值 · 行为类别图鉴 · 模型缓存    │
            └────────────────────┬─────────────────────┘
                                 │ Python 调用
                                 ▼
            ┌──────────────────────────────────────────┐
            │   推理服务层(infer_image_path 等)       │
            │  · bytes / Path / frame → tensor          │
            │  · 推理结果 → 标注图 + DataFrame          │
            └────────────────────┬─────────────────────┘
                                 │
                                 ▼
            ┌──────────────────────────────────────────┐
            │    YOLO11n 推理引擎(model/best.pt)      │
            │  Backbone (C2f+SPPF) → Neck (FPN/PAN)     │
            │   → Decoupled Head(DFL + cls)           │
            └──────────────────────────────────────────┘
                                 │
                                 ▼
            (可对接:饲喂控制器 / 环境调控器 / 健康预警)

2.2 YOLO11 网络结构

ini 复制代码
输入 640×640×3
   │
   ▼
[Backbone]
  Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF
        多尺度卷积 + 跨阶段特征融合,对密集小目标更稳
   │
   ▼
[Neck]   FPN 上采样 + PAN 下采样:P3 / P4 / P5 三级金字塔
        密集小鸡 → P3 层;大鸡 / 近景 → P4/P5
   │
   ▼
[Head]  Decoupled Head(cls 头 / reg 头解耦)
        回归头采用 DFL(Distribution Focal Loss)
        Anchor-Free,输出 (cx, cy, w, h, cls × 3)
   │
   ▼
[NMS]    iou=0.7, conf=0.30  → 最终检测框

2.3 检测流程

scss 复制代码
禽舍摄像头帧 / 单张图片
        │
        ▼
   Letterbox 640×640 + RGB
        │
        ▼
    YOLO11n forward
        │
        ▼
   Detect Head 输出 (cls × 3)
        │
        ▼
   conf 过滤 + NMS
        │
        ▼
result.plot() 画框 + "进食/休息/站立"
        │
        ▼
Streamlit 双列展示 + DataFrame + 行为分布柱状图
        │
        ▼
(可扩展:行为占比时间序列 → 饲喂 / 环境调控)

三、代码结构(核心 50 行 + 解析)

项目目录:

bash 复制代码
鸡行为检测/
├── app/streamlit_app.py        # Web 入口
├── configs/project.yaml         # 行业话术 / UI / 训练 / 推理参数
├── model/best.pt                # 训练好的 YOLO11n 权重
├── scripts/                     # train / validate / export 等
├── data/dataset/                # 训练 / 验证 / 测试集
└── 鸡行为检测/                   # 原始数据集(含 train / valid / test 切分)

最核心的 50 行------模型加载 + 单图推理 + Streamlit 单图 Tab:

python 复制代码
# === 1. 模型加载(带 streamlit 资源缓存,避免每次刷新重载)=============
@st.cache_resource(show_spinner=False)
def load_model(model_path: str) -> YOLO:
    return YOLO(model_path)

# === 2. 单图推理:路径 → 标注图 + 检测明细 DataFrame ===================
def infer_image_path(model: YOLO, image_path: Path, conf: float):
    result = model.predict(str(image_path), conf=conf, verbose=False)[0]
    annotated = result.plot()                         # BGR ndarray,已画框
    rows = []
    if result.boxes is not None:
        for box in result.boxes:
            cls_id = int(box.cls.item())
            x1, y1, x2, y2 = [float(v) for v in box.xyxy[0].tolist()]
            rows.append({
                "class_id": cls_id,
                "class_name": result.names[cls_id],   # "进食" / "休息" / "站立"
                "confidence": round(float(box.conf.item()), 4),
                "x1": round(x1, 1), "y1": round(y1, 1),
                "x2": round(x2, 1), "y2": round(y2, 1),
            })
    # BGR → RGB 给 Streamlit;rows 转 DataFrame 给表格组件
    return annotated[:, :, ::-1], pd.DataFrame(rows)

# === 3. bytes → 临时文件 → 复用同一函数 ================================
def run_image_inference(model: YOLO, image_bytes: bytes, conf: float, suffix=".jpg"):
    with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as f:
        f.write(image_bytes); tmp = Path(f.name)
    try:
        return infer_image_path(model, tmp, conf)
    finally:
        tmp.unlink(missing_ok=True)

# === 4. Streamlit 单图 Tab:上传 → 推理 → 双列展示 =====================
model = load_model(str(MODEL_PATH))
uploaded = st.file_uploader("上传鸡舍画面", type=IMAGE_UPLOAD_TYPES)
conf = st.sidebar.slider("置信度阈值", 0.05, 0.95, DEFAULT_CONF, 0.01)

if uploaded is not None:
    annotated, df = run_image_inference(model, uploaded.getvalue(), conf,
                                        suffix=Path(uploaded.name).suffix)
    col1, col2 = st.columns(2)
    col1.image(uploaded, caption="原图")
    col2.image(annotated, caption="检测结果(带行为标签)")
    st.dataframe(detections_to_display(df))
    render_detection_analysis(df)

5 段解析:

  1. @st.cache_resource 把 YOLO(model_path) 的耗时锁在第一次访问,对 7×24 长时间运行的禽舍监控场景尤其重要------一次启动一直跑。
  2. result.plot() 直接返回带颜色框 + 行为类别 + 置信度的 BGR ndarray,3 种行为对应 3 种颜色(呼应 UI 配置里的 behaviors 段),即使一张图上有几十只鸡也能一眼分清谁在干嘛。
  3. 把每个 box 的 cls / conf / xyxy 拍成 dict,再拼成 DataFrame------后续表格、CSV 下载、行为占比柱状图、长时间维度趋势全部复用同一份结构。
  4. run_image_inference 走临时文件而非 numpy 数组,是为了让 Ultralytics 内部的 EXIF / orientation 处理逻辑生效,对禽舍顶装 / 侧装摄像头不同朝向都更稳。
  5. Streamlit 的 cache_resource + file_uploader + dataframe 组合,让一个产品级行为监测页面只需 11 行代码------这就是 Streamlit 在养殖 AI 场景能快速出活的核心原因。

四、训练效果

模型在自建的鸡只行为 数据集上训练 200 epoch(YOLO11n、640 输入、 batch 16),最优一轮指标如下:

指标 数值
Precision 0.9034
Recall 0.9791
mAP@0.5 0.9621
mAP@0.5:0.95 0.9151

从训练曲线看,box / cls / dfl 三路 loss 在前 50 epoch 快速收敛,之后稳步下降;mAP@0.5 在第 100 epoch 后突破 0.95,最终稳定在 0.96 左右;归一化混淆矩阵中"进食 / 休息 / 站立"三类对角线均在 0.9 以上,仅"休息"与"站立"在小部分边界姿态(趴卧但抬头)上存在轻微互混,这与人类肉眼判断的混淆模式一致。

值得一提的是 mAP@0.5:0.95 高达 0.915------这意味着即使在严格 IoU 阈值下,模型对鸡只检测框中心位置的回归依然非常稳定,能够支撑后续基于位置的统计分析(如"站立鸡只在采食槽方向的密集程度")。

五、项目总结

做对了什么:

  • 把"鸡只检测 + 行为分类"合并成一个 3 类检测任务,避免了"先检测目标再分类行为"的两阶段管线,整体延迟降低、部署更简单;
  • 选择 YOLO11n 而非更大的 v8s/v8m,模型 6 MB、CPU 单图 80 ms 内完成推理,可在禽舍边缘工控机离线运行,不依赖云端;
  • 用一份 project.yaml 把"行业话术 / UI 主题色 / 训练超参 / 推理阈值 / 行为定义"全部收口,迁移到鸭、鹅、猪等其他畜禽的行为监测只需替换数据集与重新训练。

还能怎么做:

  • 接入 ByteTrack 多目标跟踪,让每只鸡获得稳定 ID,从"群体行为占比"升级为"个体行为时长统计";
  • 把行为占比时间序列对接饲喂控制器,实现"休息比例突然升高 → 自动降低料量"的反馈闭环;
  • 异常预警:当"站立 + 进食"占比连续 N 分钟低于阈值时,主动推送饲养员复核------这是当前畜禽福利监测最有商业价值的方向之一。
相关推荐
柠檬味拥抱1 小时前
火灾智能检测预警系统:从 YOLO11n 训练到 Streamlit 全链路实战【实战源码】
后端
言午说数据1 小时前
Paimon把LSM搬进湖里的得与失
大数据·后端
故图1 小时前
JDBC 读 ResultSet 读到一半,报 stream closed
后端
武子康1 小时前
AI Agent 设备指令超时后,重试会执行两次吗?
人工智能·后端·agent
全栈弄潮儿1 小时前
Python实战第6期:列表与元组
后端·python·编程语言
用户817595220131 小时前
QNAP NAS 部署 Vaultwarden:使用 Cloudflare Tunnel 实现外网访问与手机同步
后端
嘿嘿嘿9151 小时前
Java 第四周学习笔记:多态、接口、内部类与 String
后端
彩雲演文1 小时前
51单片机万年历Proteus仿真跑通实录:LCD12864B+DS1302+DHT11,带农历和闹钟(效果图+接线表+全套源码)
后端
ThinkerQAQ_1 小时前
并发编程(十):BlockingQueue 与 Channel 的实现——从 Runtime 到 CPU
后端