基于 YOLO11 的狗的 6 种行为识别系统:从模型到 Streamlit 全流程实战

发布时间:2026/10/5 2:09:22
基于 YOLO11 的狗的 6 种行为识别系统:从模型到 Streamlit 全流程实战 基于 YOLO11 的狗的 6 种行为识别系统从模型到 Streamlit 全流程实战关键词YOLO11、狗行为识别、宠物 AI、Streamlit、目标检测、Ultralytics一、背景1.1 行业痛点随着城市养宠人群的快速增长宠物视觉智能已经从猫狗品种识别延伸到了更精细的行为分析家庭场景主人不在家时狗是吠叫、奔跑还是趴卧是不是长时间没进食要不要远程关注一下宠物店 / 寄养机构能不能用一个摄像头自动统计每只狗的活跃 / 静息时长作为日报推送给主人训练学校 / 行为科研行为标注完全依赖人工逐帧打标几个小时视频要花一整天能不能让模型先做一遍粗标流浪动物收容所同时看护几十只狗工作人员很难持续观察每只狗的状态变化需要异常预警。把目标检测 行为分类合并到 YOLO11 这类 Anchor-Free 检测器里用一张图就能同时给出狗在哪里和它在做什么是当前最简洁的工程方案。本项目就是这条路线下的一个完整落点基于 YOLO11n识别狗的吠叫、进食、趴卧、奔跑、端坐、站立这 6 种典型行为并提供一个开箱即用的 Streamlit 可视化界面。视频演示与源码下载https://www.bilibili.com/video/BV14kHB6yE4F/包含完整项目源码预训练模型权重️数据集1.2 项目运行效果1.3 项目介绍核心创新点维度设计类目设计把目标检测 行为分类合并为一个 6 类检测任务避免两阶段管线带来的延迟模型选型YOLO11n参数量约 2.6 MCPU 实时、Apple Silicon / NVIDIA GPU 加速可选部署形态Streamlit 单页应用 本地 best.pt零数据库、零中间件开箱即用输入兼容图片 / 批量图片含 zip/ 视频 / 摄像头 4 种输入复用同一推理引擎中英映射标签内含中英双映射 emoji模型权重切换不影响 UI 显示功能概览单图检测拖拽上传 → 实时返回带框图 行为类别 / 置信度 / 坐标明细批量检测单次最多 200 张输出汇总表 行为分布柱状图 zip 打包下载视频检测mp4 / avi / mov / mkv逐帧推理后落盘新视频便于监控录像离线分析摄像头实时检测可对接家庭摄像头 / 宠物店 IPC做实时行为感知6 种行为类别吠叫 ‍、进食 、趴卧 、奔跑 、端坐 、站立 。技术栈层选型模型框架Ultralytics 8.3 PyTorch视觉算法YOLO11nAnchor-FreeC2f BackboneDecoupled Head DFLWeb 前端Streamlit 1.35 自定义 HTML 主题暖橙 蓝灰呼应狗毛色与项圈视频 / 图像OpenCV、imageio-ffmpeg数据可视化Plotly / Streamlit 原生 chart配置管理单一configs/project.yaml行业话术 / UI / 推理阈值统一收口二、设计框架2.1 系统架构┌──────────────────────────────────────────┐ │ Streamlit Web 前端单页 SPA │ │ · 6 类行为图鉴 / 单图 / 批量 / 视频 / 摄像头 │ │ · 侧栏 · 阈值 · 类别筛选 · 模型缓存 │ └────────────────────┬─────────────────────┘ │ Python 调用 ▼ ┌──────────────────────────────────────────┐ │ 推理服务层infer_image_path 等 │ │ · bytes / Path / frame → tensor │ │ · 推理结果 → 标注图 DataFrame │ └────────────────────┬─────────────────────┘ │ ▼ ┌──────────────────────────────────────────┐ │ YOLO11n 推理引擎model/best.pt │ │ Backbone (C2fSPPF) → Neck (FPN/PAN) │ │ → Decoupled HeadDFL cls │ └──────────────────────────────────────────┘2.2 YOLO11 网络结构输入 640×640×3 │ ▼ [Backbone] Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF │ ▼ [Neck] FPN 上采样 PAN 下采样P3 / P4 / P5 三级金字塔 │ ▼ [Head] Decoupled Headcls 头 / reg 头解耦 回归头采用 DFLDistribution Focal Loss Anchor-Free输出 (cx, cy, w, h, cls × 6) │ ▼ [NMS] iou0.7, conf0.25 → 最终检测框2.3 检测流程图像 / 监控视频帧 │ ▼ Letterbox 640×640 RGB │ ▼ YOLO11n forward │ ▼ Detect Head 输出 (cls × 6) │ ▼ conf 过滤 NMS │ ▼ result.plot() 画框 行为类别 置信度 │ ▼ Streamlit 双列展示 DataFrame 行为分布图三、代码结构核心 50 行 解析项目目录狗行为识别/ ├── app/streamlit_app.py # Web 入口 ├── configs/project.yaml # 行业话术 / UI / 训练 / 推理参数 ├── model/best.pt # 训练好的 YOLO11n 权重 ├── scripts/ # train / validate / export 等 ├── data/dataset/ # 训练 / 验证 / 测试集 └── 狗狗的6种行为识别数据集/ # 原始数据集含训练 / 验证 / 测试切分最核心的 50 行——模型加载 单图推理 Streamlit 单图 Tab# 1. 模型加载带 streamlit 资源缓存避免每次刷新重载st.cache_resource(show_spinnerFalse)defload_model(model_path:str)-YOLO:returnYOLO(model_path)# 2. 单图推理路径 → 标注图 检测明细 DataFrame definfer_image_path(model:YOLO,image_path:Path,conf:float):resultmodel.predict(str(image_path),confconf,verboseFalse)[0]annotatedresult.plot()# BGR ndarray已画框rows[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_idint(box.cls.item())x1,y1,x2,y2[float(v)forvinbox.xyxy[0].tolist()]rows.append({class_id:cls_id,class_name:result.names[cls_id],# eg. 端坐 / sittingconfidence:round(float(box.conf.item()),4),x1:round(x1,1),y1:round(y1,1),x2:round(x2,1),y2:round(y2,1),})# BGR → RGB 给 Streamlitrows 转 DataFrame 给表格组件returnannotated[:,:,::-1],pd.DataFrame(rows)# 3. bytes → 临时文件 → 复用同一函数 defrun_image_inference(model:YOLO,image_bytes:bytes,conf:float,suffix.jpg):withtempfile.NamedTemporaryFile(deleteFalse,suffixsuffix)asf:f.write(image_bytes);tmpPath(f.name)try:returninfer_image_path(model,tmp,conf)finally:tmp.unlink(missing_okTrue)# 4. Streamlit 单图 Tab上传 → 推理 → 双列展示 modelload_model(str(MODEL_PATH))uploadedst.file_uploader(上传一张包含狗的图片,typeIMAGE_UPLOAD_TYPES)confst.sidebar.slider(置信度阈值,0.05,0.95,DEFAULT_CONF,0.01)ifuploadedisnotNone:annotated,dfrun_image_inference(model,uploaded.getvalue(),conf,suffixPath(uploaded.name).suffix)col1,col2st.columns(2)col1.image(uploaded,caption原图)col2.image(annotated,caption检测结果带行为标签)st.dataframe(detections_to_display(df))render_detection_analysis(df)5 段解析st.cache_resource把YOLO(model_path)的耗时锁在第一次访问之后所有 session 共享同一份模型实例避免每次切换 Tab 都重载这对宠物店多用户场景尤其友好。result.plot()直接返回带颜色框 行为类别 置信度的BGR ndarray自动按class_id上色6 种行为对应 6 种颜色肉眼一目了然。把每个box的cls / conf / xyxy拍成dict再拼成DataFrame——后续表格、CSV 下载、行为分布柱状图、视频时间线全部复用同一份结构。中英映射 emoji 通过apply_class_display二次处理模型权重输出英文sittingUI 自动映射成 端坐方便切换到双语版本权重时无需改 UI 代码。Streamlit 的cache_resource file_uploader dataframe组合让一个产品级行为识别页面只需 11 行代码——这是 Streamlit 在 AI 应用快速出活的关键。四、训练效果模型在自建的狗狗 6 种行为识别数据集上完成 YOLO11n 训练并保存best.pt。在测试集上检测效果良好可稳定识别狗的吠叫、进食、趴卧、奔跑、端坐、站立 6 类典型行为已能满足家庭宠物远程关注、宠物店行为日报、收容所异常预警等场景的初筛感知使用需要。从单图检测样例上文「项目运行效果」截图可以看到在室内地板、户外草地、笼内环境等不同背景下模型都能准确给出框 行为类别 置信度。五、项目总结做对了什么把狗的检测 行为分类合并成一个 6 类检测任务避免了先检测目标再分类行为的两阶段管线整体延迟降低、部署更简单用一份project.yaml把行业话术 / UI 主题色 / 中英类别映射 / 训练超参 / 推理阈值全部收口迁移到猫的行为识别、马的行为识别等场景只需替换数据集与重新训练单图、批量、视频、摄像头四种输入复用同一个infer_image_path后期接 RTSP 摄像头流时只需把摄像头帧喂进来即可。还能怎么做在数据集层面持续补充夜间 / 多狗同框 / 视角畸变鱼眼摄像头等场景把奔跑/站立这类高动态相似行为的判别力进一步拉开接入时序信息如 ByteTrack 跟踪 LSTM 平滑把单帧的瞬时行为升级成持续 N 秒的稳定行为更贴合主人/兽医关心的行为时长把检测结果 时间戳推送到家用 IoT 看护盒子对长时间未进食异常吠叫超过 X 分钟等场景生成主动提醒。一句话总结YOLO11 Streamlit 让宠物行为视觉感知从一个研究课题变成了一份 yaml 一份 best.pt 一份 streamlit_app.py的工程化标准动作本文给出了一份可以直接 fork 落地的样板。