资讯动态

基于YOLOv10的奶牛行为检测系统:数据集构建、模型训练到UI界面实战

发布时间:2026/10/17 2:59:27 来源:尧图企业网站定制
基于深度学习的奶牛行为检测系统YOLOv10YOLO数据集UI界面Python项目源码模型最近因为项目需要我完整搭建了一套基于YOLOv10的奶牛行为检测系统从数据集准备、模型训练、界面封装到最终部署整个过程踩了不少坑也积累了不少心得。这里把完整的实现思路和实操细节整理出来希望能给正在做农业智能化项目、动物行为分析或者目标检测相关方向的朋友提供一份可以直接参考的实战经验。这套系统主要解决的是奶牛异常行为识别问题比如产前站立时间骤增、采食行为减少、反刍规律被打乱、趴卧时间异常等这些行为指标能非常有效地预示产科疾病和热应激状态。传统做法靠人工观察费时费力且难以连续监控这套系统通过摄像头实时捕捉画面自动识别奶牛当前的姿态和行为种类并在界面上展示统计结果可以直接部署在养殖场环境里。1. 整体设计与技术选型1.1 为什么选YOLOv10而不是其他目标检测模型最初我考虑过几个方案Faster-RCNN、YOLOv8和YOLOv5。Faster-RCNN精度虽高但推理速度太慢在养殖场这种单机设备上很难跑实时视频流。YOLOv8在实际测试中表现不错但后来对比YOLOv10之后发现v10在同一个数据集上的mAP50基本持平但推理速度提升了将近30%模型参数量也略有下降对于需要长期持续运行的检测系统来说这个效率差异很关键。YOLOv10的核心改进在于它抛弃了传统的非极大值抑制NMS采用了一致的双重分配策略。简单理解就是旧版模型一个目标会预测出很多个候选框需要NMS做去重YOLOv10通过一对一匹配让每个目标只保留一个最合适的框省去了NMS这层后处理推理过程更快也更干净。实际使用中这个特性还带来一个好处——预测框的置信度分数更有代表性在行为统计时可直接用分数做判断阈值。1.2 系统架构划分我把整个系统拆成三个模块模型推理模块加载YOLOv10权重对视频帧/图片流做检测输出行为类别、坐标框和置信度。业务逻辑模块把检测结果按时间窗做统计分析计算各类行为的持续时长、频次判断是否出现异常行为模式。界面展示模块基于PyQt5构建显示实时视频、检测画面、行为统计图表和异常告警。这样的划分好处在后期维护上很明显。模型升级时只需要替换推理模块的权重文件界面上任何变化都不会影响检测逻辑。我当时训练过程中换了好几个版本的权重如果代码不分离每一次换模型都要把界面逻辑重新调一遍想想都头大。2. 数据集准备与标注2.1 数据来源与采集规范数据集的质量直接决定模型的性能上限这行话听了无数次但自己做的时候才有切身体会。我使用的视频素材一部分来自某实验基地的牛舍监控另一部分是自己去合作牧场采集的。采集时需要注意几个点摄像头安装高度建议在2.5米到3米之间俯视角度45度左右这样既能拍到奶牛的背部轮廓又不会因为牛个体之间相互遮挡导致标注困难。覆盖光照变化白天强光、傍晚逆光、夜间红外补光都要覆盖。后期发现夜间红外画面模型效果明显差于白天就是因为训练数据里夜间比例太少后来专门补了一批夜间视频做标注。场景多样性不同牛舍的地面颜色、围栏样式、垫料材质都会影响模型的泛化效果。我有一版模型在一个场地测试效果好换到另一个场地mAP从0.92掉到0.71就是因为训练集场景太单一。2.2 行为类别定义与标注细节标注时定义了6个类别站立、趴卧、采食、行走、反刍、排泄。你可能觉得6类看起来不多但实际标注时最难区分的是站立和采食因为奶牛采食时身体也是站着的区别仅在头部是否靠近饲槽区域。我在标注时定的规则是只要头部在饲槽检测区域内并且嘴部有明显咀嚼动作就标为采食否则标为站立。趴卧和反刍是另一个容易混淆的点。反刍可以发生在站立状态下也可以发生在趴卧状态下。我在行为分类上做了取舍姿态和行为分成两个维度模型只输出姿态类别站立/趴卧/行走反刍、采食这类行为通过视频时间序列的变化规律做二次判断。这样做能大幅降低标注难度准确率也更高。标注工具使用的是某标注软件支持YOLO格式输出。矩形框的标注原则是紧贴牛体轮廓但耳朵和尾巴不完全包进框内这种做法能减少背景干扰训练出来的框更贴合身体躯干。每张图平均标注耗时约20秒最终数据集总量为12000张图像其中训练集9600张验证集2400张。2.3 数据增强策略单纯增加数据量不是唯一途径数据增强同样关键。我使用的增强策略包括随机翻转概率0.5HSV色域变换H通道变化量±20S和V通道±30随机缩放0.5到1.5倍Mosaic增强组合4张图需要注意奶牛行为检测场景里不能使用旋转增强。因为牛在画面里始终是水平方向站立或趴卧旋转90度或180度会生成大量实际不存在的位置关系样例对提升模型效果没有帮助反而可能干扰学习。这一点是我对比实验之后得出的结论添加旋转增强后mAP反而下降了2个百分点。3. YOLOv10模型训练全流程3.1 环境配置与依赖安装Python版本建议3.8到3.10CUDA用到11.8以上即可。我当前跑通的环境配置是Python 3.9 CUDA 11.8 PyTorch 2.0 显卡为单张12GB显存。依赖安装比较简单YOLOv10的官方开源工程拉下来后执行pip install -r requirements.txt这里有一个小坑如果你的PyTorch版本是2.0以上需要特别注意torchvision的配套版本否则会在数据加载阶段报错。建议直接用官方文档推荐的一对版本号不要各自升级到最新实测最稳。3.2 训练参数配置训练命令yolo train datacow_behaviors.yaml modelyolov10s.pt epochs120 batch16 imgsz640 device0参数选择的几个关键考量模型规模用的yolov10s也就是small版本。牛体目标在画面中尺寸较大不需要依赖模型的超大感受野v10s的参数量已足够检测精度与v10m差距只有1到2个点但推理速度快了接近40%。在实时视频流场景中帧率体验远比这1到2个点的精度重要。输入分辨率640x640是一个性价比平衡点。试过1280分辨率训练在验证集上mAP提升不到3%但推理耗时直接翻倍视频流掉帧明显。如果训练集的标注框都比较小调高分辨率才划算奶牛检测不适用。batch size设置需要根据显存动态调整12GB显存最高可以跑batch32但为了留出显存做运行时的视频流缓存我压到了16。训练时间大约3.5小时跑完120个epoch。3.3 训练阶段的Loss变化与早停观察Loss曲线是判断模型是否过拟合的最直接方式。训练过程中最初的20个epochbox_loss和cls_loss下降非常快到60个epoch左右开始放缓。验证集的mAP50在第85个epoch达到峰值0.942随后出现轻微下降趋势说明模型开始出现早期过拟合训练提前终止在88个epoch。关键经验不要一味追求跑满epoch。我第一版训了150个epoch保存的best.pt反而不如早停的权重效果好过拟合后模型对训练集中的光照条件和场地特征产生了偏差换到新场景表现变差。YOLOv10工程里自带早停机制patience参数默认是100但我建议你结合自己的验证集loss变化来手动确认early stop不要盲信默认参数。3.4 模型评估指标这个场景下最值得关心的是F1-score和假阳性率而不仅仅是mAP。奶牛行为检测系统做出的是管理型决策误报异常行为会导致牧场管理人员产生安全疲劳所以必须把假阳性控制在很低水平。我的验证集结果行为类别PrecisionRecallmAP50站立0.9450.9310.962趴卧0.9520.9480.971行走0.9010.8850.929采食0.9340.9170.948排泄动作0.8670.8320.891整体mAP50为0.94对日常监控环境下的实时检测已经够用。排泄行为的精度明显低于其他类别主要原因是该行为持续时间极短通常只有3到5秒标注时由于视频帧率问题容易漏标导致正样本数量比其他类别少约40%。4. UI界面设计与交互逻辑4.1 界面框架选择PyQt5界面我用的是PyQt5综合考虑稳定性和社区活跃度后做出的选择。PyQt5的QThread信号槽机制非常适合视频流场景检测线程在后台持续处理帧数据通过信号把结果传回主线程更新UI不会出现界面卡死。这个方案比OpenCV自带的HighGUI好用太多HighGUI做简单的图片展示没问题但要在界面上做交互式和图表显示就力不从心了。4.2 界面功能模块拆解主界面分为四个区域视频显示区展示实时视频流叠加检测框和类别标签可以手动切换摄像头输入或本地视频文件输入。统计面板实时更新当前时间段内各类行为的累计时长和频次用柱状图呈现数据每5秒刷新一次。异常告警区当算法检测到行为模式异常时这里会弹出告警条目写明时间、行为类型和建议操作。异常判断逻辑包括产前站立时间骤增、长时间不采食等规则。系统控制区启动/暂停检测、选择模型文件、调整置信度阈值、导出统计报表。对于不熟悉PyQt5的读者这里分享一下界面线程设计的关键代码思路class DetectThread(QThread): frame_signal pyqtSignal(QImage) stats_signal pyqtSignal(dict) def __init__(self): super().__init__() self.model YOLO(best.pt) self.running True def run(self): cap cv2.VideoCapture(0) # 摄像头或视频文件路径 while self.running: ret, frame cap.read() if not ret: break results self.model(frame) annotated results[0].plot() self.frame_signal.emit(self.convert_to_qimage(annotated)) # 计算行为统计 stats self.calculate_stats(results) self.stats_signal.emit(stats)关键点不要在UI主线程中跑模型推理否则画面会一卡一卡的鼠标操作都响应不过来。数据从检测线程到UI线程通过信号传递是PyQt的推荐模式实测视频帧率能稳定维持在25FPS以上。4.3 关键参数的可视化调整系统里设计了置信度阈值滑块默认是0.5用户可根据现场情况调整。如果现场出现较高频的漏检将阈值调到0.35到0.4就能提升召回如果现场环境中容易出现误检比如其他动物闯入画面可以把阈值调高到0.7左右减少假阳性。我在实际部署中发现阈值调高到0.8以上会带来一个新问题处于画面边缘的牛因为只露出半边身体被检测到的置信度天然偏低调高阈值会导致这些牛的行为无法计入统计最终统计结果会明显低于实际情况。建议阈值上限不要超过0.7同时可以在业务逻辑中设定一个逻辑边界条件——检测目标位于画面边界区域时即使置信度稍低也予以保留。5. 推理性能优化与部署要点5.1 不同设备的帧率表现我在三套硬件配置上测试了推理速度640x640输入v10s模型硬件平台推理耗时/帧可达帧率消费级显卡8GB8-10ms25FPS以上中端显卡6GB12-15ms20FPSCPU-onlyi7处理器180-220ms5FPS结论很清楚实时视频流部署强烈建议使用独立显卡。CPU推理虽然能跑但帧率只有5FPS左右检测结果有明显的延迟感尤其在奶牛行走行为检测中低速帧率会导致该行为被明显低估。如果部署环境只能用CPU可以尝试模型量化或TensorRT加速实测能把推理耗时压到120ms左右基本达到弱实时的可用水平。5.2 视频流输入格式与兼容性系统兼容三种输入RTSP摄像头流、本地视频文件mp4/avi/mkv、图像序列。RTSP摄像头接入时需要注意一个坑部分品牌摄像头的RTSP地址格式不标准在OpenCV的VideoCapture里会报错或超时。建议先单独测试摄像头地址是否能正常打开确认无误后再接入系统。OpenCV读取RTSP流的超时问题也很常见代码里需要做好容错处理cap cv2.VideoCapture(rtsp_url) if not cap.isOpened(): # 重试机制 for retry in range(3): time.sleep(2) cap.open(rtsp_url) if cap.isOpened(): break另外建议设置缓存区大小否则视频流延迟会越来越大运行10分钟后画面延迟可能达到5秒以上这在实时监控场景中是不能接受的。5.3 长时间运行的稳定性优化养殖场场景要求系统7x24小时连续运行稳定性比算法本身更难搞。我遇到的主要问题及解决办法显存泄漏早期版本视频流推理后没有显式释放VRAM运行6小时后显存占满导致系统崩溃。解决办法是每处理10帧主动调用一次显存清理命令实测显存占用被控制在稳定水平。日志轮转运行日志不轮转会导致磁盘占满系统日志模块加上按天轮转保留最近7天。掉线自动恢复摄像头隔几天会出现一次掉线如果没有自动重连机制系统就会一直停在黑屏状态。我在代码里加了断线检测自动重连逻辑每10秒判断一次画面是否为空白帧超时自动触发重连。6. 基于时序行为的二次判断6.1 从单帧检测到行为趋势分析单帧的检测结果只是一张快照真正对牧场管理有价值的是行为趋势。比如反刍行为的特点是周期性出现每轮反刍持续40到60分钟间隔2到3小时。单看某一帧画面奶牛可能只是在安静站立但把这个姿态放进时间序列里就能判断它是否处于反刍周期中。我在检测系统的业务逻辑层实现了一个滑窗统计器每30秒为一个统计窗口保存每个行为类别的出现帧数。定时器每5分钟做一次汇总计算各类行为的占比和变化趋势。6.2 异常行为判断规则根据文献调研和实际观察我设置了以下几条核心判定规则规则判定条件建议动作产前异常预警产前24h内站立时长占比超70%安排人员关注分娩状态采食下降采食时长较基线下降超过20%持续2h排查日粮适口性或健康问题反刍异常反刍时长较基线下降超过25%考虑消化类疾病风险热应激预警呼吸频率升高且趴卧率低于正常值检查降温设备运行情况这些阈值并不是固定不变的不同胎次、不同泌乳阶段的奶牛基础行为模式有差异。系统设计上支持为每头牛设置独立的基线值通过前一周的历史数据自动计算得出这样比全局统一阈值精准得多。6.3 个体识别与群体统计如果只做群体统计检测框级别的行为数据已经够用。但如果要做个体层面的行为追踪比如特定某头牛的采食时间就需要引入追踪算法把同一头牛在连续帧中的检测框关联起来。我在系统中采用了一个轻量的追踪方案结合检测框的中心点坐标和IOU值做帧间匹配。这个方法在牛没有互相遮挡时效果不错。但奶牛喜欢扎堆经常出现两头牛靠在一起导致框重叠的情况追踪ID会发生跳变。更复杂的处理可以引入外观特征重识别但考虑到实际部署成本我暂时没做这一层。如果你对个体追踪有明确需求建议从ReID方向做技术储备。7. 常见问题与调试心得7.1 模型效果不佳时怎么排查检测效果不达标通常按以下顺序排查先看训练集和验证集的数据分布。如果训练集本身就存在大量错标漏标的样本模型学到的特征会被污染任何参数调整都无法补救。验证集Loss值。如果训练集loss持续下降但验证集loss不降反升说明过拟合了增加数据增强强度或使用dropout。看具体的bad case。输出置信度低于0.5的检测结果逐一对比分析是目标太小、遮挡严重还是背景误检。这个步骤虽然繁琐但信息量最大。7.2 显卡显存不足怎么办如果你显卡显存只有8GB甚至更小有几个降级方案减小batch size到8或4将输入分辨率从640降到512使用梯度累积技术有效模拟更大的batch size使用混合精度训练。我实测开启半精度训练后显存占用下降约30%训练速度提升约40%精度损失在0.5%以内基本可以忽略7.3 UI界面卡顿界面卡顿绝大多数原因是把模型推理放在了UI线程里执行。确保所有耗时操作都在独立线程中运行UI线程只做数据展示。如果你必须在主线程中做少量推理可以适当降低视频帧率到10FPS左右虽然流畅性会打折扣但至少界面能正常操作。7.4 部署现场摄像头画面与训练画面差异过大这个问题的本质是训练集分布的真实度不够。解决思路有两个一是把部署现场的摄像头画面录下来每隔一段时间补充标注并做增量训练二是在模型推理前对输入图像做预处理比如统一亮度、对比度、色温把现场画面尽可能规整到训练集的分布中。第二种方法见效快但不能替代持续的数据迭代。经过几轮迭代和实际部署这套系统最终做到了在普通养殖场硬件条件下实时运行检测单帧耗时约10毫秒行为统计准确率满足日常管理需求。如果你正在做类似方向建议在动手前先把数据采集方案规划好——采集环境覆盖度决定了你后期要花多少精力处理泛化问题这一环省不得。最后分享一个小的使用技巧导出的统计报表建议直接用CSV格式方便接入Excel或第三方看板工具。很多用户上来就要求做漂亮的饼图和趋势图实际到了养殖场管理人员更习惯把数据拉出来用自己熟悉的工具分析。把数据接口留好过段时间你就知道这个设计有多省心。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑