
简介这份资源是一套基于YOLOv8的宠物行为分析系统完整项目包面向计算机、人工智能、通信工程、自动化等专业的在校学生与教师适合作为毕业设计、课程设计或大作业的参考方案也便于初学者进阶学习。压缩包共97个文件约24.21MB以70个Python源码文件为核心辅以4个pt模型权重、5个xml配置、12个pyc编译文件及少量txt说明与mp4演示视频覆盖模型训练、检测推理与可视化界面等模块。项目包含源码、完整数据集、可视化页面和部署说明可生成核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果及标签分布图并附有README.txt帮助快速上手。目前已有46人学习关注代码经测试运行成功拿来即可运行也可在此基础上修改扩展实现其他功能适合需要完整项目流程与可视化展示的读者参考使用。1. 宠物行为分析系统到底在做什么从一段猫抓沙发视频说起家里养猫的人大概率都经历过出门上班八小时回来发现沙发又被挠了但你不知道它到底是焦虑、无聊还是单纯磨爪子。把摄像头录下来的视频一帧帧翻眼睛都看花了也总结不出规律。基于YOLOv8的宠物行为分析系统要解决的正是这件事——让模型自动从视频里识别出猫狗在干什么把「抓挠、进食、睡觉、奔跑、排泄」这些动作打上标签再配一个可视化界面把时间线和统计图摆出来。它适合两类人一类是毕设或课程设计需要完整可跑项目的学生另一类是家里有宠物、想低成本搭一套行为记录工具的开发者。整套方案的核心链路是YOLOv8做目标检测、行为分类做时序判断、前端做可视化部署门槛不高一张GTX 1660 Ti就能跑推理。2. YOLOv8做宠物行为检测模型选型与数据标注的取舍2.1 为什么是YOLOv8而不是YOLOv5或Faster R-CNN宠物行为分析的第一步是「看到宠物在哪」这一步必须用目标检测。YOLOv8相比YOLOv5在相同精度下参数量更小官方提供的n/s/m/l/x五个尺度里nano和small版本在GTX 1660 Ti这种6GB显存的卡上跑640×640推理能稳定在60 FPS以上足够处理家用摄像头的25 FPS视频流。Faster R-CNN精度不差但两阶段检测的推理速度在消费级显卡上很难做到实时做行为分析时还要叠加时序模型算力会直接吃紧。选YOLOv8还有一个现实原因Ultralytics的Python API封装得足够干净训练、验证、导出ONNX一条命令搞定对毕设场景来说能省掉大量调框架的时间。行为分析不是单纯的目标检测。检测只回答「猫在画面哪个位置」行为分类要回答「这只猫在做什么」。常见做法是检测框裁剪出宠物区域再送进一个轻量分类网络比如MobileNetV3或YOLOv8-cls做动作分类或者用检测框的时序轨迹做规则判断——比如连续多帧检测框位移超过阈值就判定为「奔跑」检测框长时间不动且姿态低就判定为「睡觉」。前者精度高但需要额外标注分类数据集后者实现简单但容易误判。我一般建议毕设场景先用「检测规则」跑通全流程再考虑升级到分类网络。2.2 数据集准备标注格式与目录结构宠物行为数据集通常分两部分检测数据集标注宠物位置和行为分类数据集标注动作类别。如果只做检测规则方案只需要检测数据集。标注工具用LabelImg或Roboflow导出YOLO格式的txt标注文件。目录结构按Ultralytics的要求组织pet_behavior_dataset/ ├── images/ │ ├── train/ │ │ ├── cat_001.jpg │ │ └── dog_002.jpg │ └── val/ │ ├── cat_101.jpg │ └── dog_102.jpg ├── labels/ │ ├── train/ │ │ ├── cat_001.txt │ │ └── dog_002.txt │ └── val/ │ ├── cat_101.txt │ └── dog_102.txt └── data.yamldata.yaml是训练配置的核心内容如下path: ./pet_behavior_dataset train: images/train val: images/val nc: 2 names: 0: cat 1: dognc是类别数这里只区分猫和狗。如果要做多宠物个体区分可以把每只宠物的名字作为类别但类别数超过10之后标注成本会明显上升毕设场景不建议。names的顺序必须和标注文件里的class_id严格对应标错顺序是新手最常见的翻车点训练出来的模型会把猫认成狗。标注时有两个边界要注意一是遮挡场景宠物钻到沙发底下只露出尾巴这种帧建议直接跳过不标强行标注会让模型学到错误的特征二是夜间红外画面如果数据集里全是白天彩色图模型在夜间灰度图上精度会断崖式下跌最好在采集阶段就覆盖白天/夜晚两种光照。2.3 训练命令与关键参数Ultralytics的训练入口非常直接一条命令启动yolo detect train \ modelyolov8s.pt \ datapet_behavior_dataset/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/pet_behavior \ nameexp1modelyolov8s.pt表示从官方预训练权重开始微调小数据集上比从头训练收敛快得多。epochs100是经验值宠物检测数据集通常在3000张以内100轮足够收敛再多容易过拟合。batch16在6GB显存上跑640尺寸刚好如果爆显存就降到8。device0指定第一块GPUCPU训练会慢到无法接受。训练过程中重点关注mAP50-95和box_loss两条曲线如果box_loss震荡不降大概率是学习率太大或者标注框有大量越界。训练完成后权重保存在runs/pet_behavior/exp1/weights/best.pt这个文件就是后续推理和部署要用的模型。3. 行为识别逻辑怎么写从检测框到时序判断3.1 检测结果后处理把bbox变成行为标签YOLOv8推理输出的是每帧的检测框列表每个框包含坐标、置信度和类别。行为判断需要在这些框上叠加时序逻辑。核心思路是维护一个滑动窗口记录最近N帧里每只宠物的检测框中心点和面积变化import numpy as np from collections import deque class BehaviorTracker: def __init__(self, window_size30, move_threshold15): self.window deque(maxlenwindow_size) self.move_threshold move_threshold def update(self, center_x, center_y, area): self.window.append((center_x, center_y, area)) if len(self.window) self.window.maxlen: return unknown return self._classify() def _classify(self): centers np.array([(x, y) for x, y, _ in self.window]) displacement np.linalg.norm(centers[-1] - centers[0]) area_change abs(self.window[-1][2] - self.window[0][2]) / self.window[0][2] if displacement self.move_threshold * 3: return running elif displacement self.move_threshold: return walking elif area_change 0.3: return grooming else: return restingwindow_size30对应约1秒的视频30 FPS窗口太短会把单帧抖动误判为运动太长则反应迟钝。move_threshold15是像素阈值需要根据摄像头分辨率和宠物在画面中的占比调整——1080p画面里猫的检测框宽度大概200像素15像素的位移对应轻微移动。area_change用来区分「静止但姿态变化」的动作比如猫蜷缩舔毛时检测框面积会缩小可以据此和完全静止的睡觉区分开。这套规则逻辑的优点是零训练成本、可解释性强缺点是阈值需要针对具体场景调。如果摄像头是俯拍位移判断很准如果是侧拍宠物朝向镜头走动时位移会偏小需要把阈值调低。3.2 可视化界面用Gradio快速搭一个能看的Demo毕设和课程设计对界面的要求是「能演示、能交互」不需要上React或Vue。Gradio是最省事的方案几十行代码就能做出视频上传、实时推理、结果展示的完整界面import gradio as gr import cv2 from ultralytics import YOLO model YOLO(runs/pet_behavior/exp1/weights/best.pt) tracker BehaviorTracker() def analyze_video(video_path): cap cv2.VideoCapture(video_path) fps cap.get(cv2.CAP_PROP_FPS) results_log [] frame_idx 0 while cap.isOpened(): ret, frame cap.read() if not ret: break if frame_idx % int(fps) 0: results model(frame, verboseFalse) for box in results[0].boxes: x1, y1, x2, y2 box.xyxy[0].tolist() cx, cy (x1 x2) / 2, (y1 y2) / 2 area (x2 - x1) * (y2 - y1) behavior tracker.update(cx, cy, area) results_log.append(f{frame_idx // int(fps)}s: {behavior}) frame_idx 1 cap.release() return \n.join(results_log) demo gr.Interface( fnanalyze_video, inputsgr.Video(label上传宠物视频), outputsgr.Textbox(label行为时间线, lines20), title宠物行为分析系统 ) demo.launch(server_name0.0.0.0, server_port7860)frame_idx % int(fps) 0表示每秒只推理一帧这是性能和精度的折中——行为分析不需要逐帧检测1秒粒度足够。server_name0.0.0.0让界面可以被局域网内其他设备访问方便答辩时用手机演示。Gradio的gr.Video组件会自动处理视频上传和格式转换省掉自己写文件上传逻辑的麻烦。如果要做更专业的界面可以用PyQt5或Streamlit但Gradio在「快速出效果」这件事上没有对手。答辩场景下老师更关心行为识别逻辑是否合理而不是界面用了什么框架。4. 部署踩坑记录从环境配置到推理加速4.1 避坑CUDA版本和PyTorch对不上现象pip install ultralytics之后运行推理报RuntimeError: CUDA error: no kernel image is available for execution on the device。原因PyTorch默认安装的是CPU版本或者CUDA版本和显卡驱动不匹配。GTX 1660 Ti是Turing架构需要CUDA 11.x以上但很多教程给的安装命令装的是CUDA 10.2版本。解决先用nvidia-smi看驱动支持的CUDA版本然后去PyTorch官网找对应命令。比如驱动支持CUDA 11.8就装pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118再装ultralytics。装完用python -c import torch; print(torch.cuda.is_available())验证输出True才算对。4.2 避坑视频推理时显存持续增长现象处理长视频时显存占用越来越高最后OOM崩溃。原因YOLOv8的model()调用默认会保留计算图循环里不断累积。另外OpenCV的VideoCapture没有及时释放帧内存。解决推理时加torch.no_grad()上下文并且每处理100帧调用一次torch.cuda.empty_cache()。如果还是涨把model(frame)改成model.predict(frame, verboseFalse)predict接口内部做了内存管理。4.3 避坑行为标签抖动严重现象可视化时间线上行为标签每秒都在跳一会儿「walking」一会儿「resting」。原因滑动窗口太小单帧检测框的微小抖动被放大成行为变化。另外YOLOv8在宠物被遮挡时可能漏检导致窗口内数据不连续。解决把window_size从30调到60并且在检测丢失时用上一帧的框做填充而不是直接跳过。更稳妥的做法是加一个「状态保持」逻辑新行为连续出现3次才切换标签避免单帧噪声触发状态跳变。4.4 避坑Gradio界面在服务器上无法访问现象本地跑Gradio正常部署到云服务器后浏览器打不开。原因Gradio默认只监听127.0.0.1而且云服务器的安全组没开放7860端口。解决demo.launch(server_name0.0.0.0, server_port7860)然后在云服务器控制台的安全组规则里放行7860端口的TCP入站。如果还不行检查服务器防火墙ufw status用ufw allow 7860放行。4.5 避坑换摄像头后精度暴跌现象训练时用的手机拍摄视频换成家用监控摄像头后模型几乎认不出宠物。原因监控摄像头的视角、焦距、色彩风格和训练数据差异太大模型过拟合到了训练集的成像特征。解决在监控摄像头下重新采集200-300张图用训练好的模型做预标注人工修正后加入训练集做增量训练。yolo detect train modelbest.pt datadata.yaml epochs3030轮就能明显改善。这也是「YOLOv8训练自己的数据集」这个热词背后的真实需求——没有哪个预训练模型能直接适配所有摄像头。5. 把系统跑在RK3588上边缘部署的量化与转换技巧如果想把宠物行为分析从PC搬到RK3588这类边缘板子上核心工作是模型格式转换和量化。RK3588的NPU对ONNX支持最好但YOLOv8直接导出的ONNX在NPU上跑会有算子不支持的问题需要走RKNN工具链。第一步是把PyTorch权重导出为ONNXyolo export modelbest.pt formatonnx imgsz640 opset12 simplifyTrueopset12是RKNN工具链兼容性最好的版本simplifyTrue会做算子融合减少后续转换的报错。第二步是在RKNN-Toolkit2里加载ONNX并做量化。量化需要准备一个校准集从训练集里抽200张图就够了from rknn.api import RKNN rknn RKNN() rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588) rknn.load_onnx(modelbest.onnx) rknn.build(do_quantizationTrue, datasetcalibration.txt) rknn.export_rknn(best.rknn)mean_values和std_values要和训练时的归一化参数一致YOLOv8默认是0-1归一化所以std用255。do_quantizationTrue开启INT8量化模型体积会缩小到FP32的四分之一左右推理速度提升2-3倍但精度会掉1-2个点。如果对精度敏感可以先用do_quantizationFalse跑FP16确认精度后再试INT8。量化后的精度验证不能只看mAP还要看行为标签的准确率。我一般会拿一段标注好的测试视频分别用PC端PyTorch模型和RK3588上的RKNN模型跑一遍对比行为时间线的一致率。如果一致率低于85%说明量化损失太大需要调整校准集或者改用混合量化。RK3588上跑YOLOv8还有一个坑NPU的输入尺寸必须是64的倍数640×640没问题但如果想改成416×416来提速需要重新导出ONNX并重新量化不能直接改推理代码里的尺寸。最后说一个我自己的习惯每次部署到新硬件之前先用一张固定图片跑推理把输出结果和PC端对比确认数值误差在可接受范围内再上视频。这个「单图对齐」步骤帮我省过很多次排查时间比直接跑视频然后对着异常结果猜原因高效得多。希望帮到你。本文还有配套的精品资源点击获取