畜牧养殖 AI:用摄像头数猪、测重、识别生病
大棚作物搞定了,换个赛道------养殖场。养鸡、养猪、养牛的规模养殖户,最大的痛点是「猪病了三天才发现」。摄像头 7×24 小时不间断监控,能做的事比你想象的多:计数、测重、行为分析、早期疾病预警。
畜牧 AI 的四个核心场景
| 场景 | 技术 | 输入 | 产出 |
|---|---|---|---|
| 猪/鸡只计数 | YOLOv8 目标检测 | 俯拍照片 | 实时存栏数 |
| 体重估算 | 深度回归 + 双目视觉 | 侧拍照片 | 估重 ±5% |
| 异常行为识别 | 姿态估计 + 时序分析 | 视频流 | 跛行/瘫倒/互咬预警 |
| 疾病早期筛查 | 红外热成像 + CV | 热成像照片 | 体温异常个体定位 |
场景一:猪只计数------管理存栏
存栏数每天都要报,但人工一趟趟数容易漏、容易重。在猪舍入口上方装一个摄像头,猪进出时自动计数。
python
import cv2
import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', path='pig_detector.pt')
# 双向计数:用质心轨迹方向判断进出
tracker = {} # id → [positions]
inside_count = 0
LINE_Y = 300 # 计数线(像素坐标)
cap = cv2.VideoCapture('rtsp://camera_ip/stream')
while True:
ret, frame = cap.read()
results = model(frame)
for det in results.xyxy[0]:
x1, y1, x2, y2, conf, cls = det
cx, cy = (x1 + x2) / 2, (y1 + y2) / 2 # 质心
# 简单追踪:最近邻匹配
# ...
# 判断方向
if prev_cy < LINE_Y and cy >= LINE_Y:
direction = 'in'
inside_count += 1
elif prev_cy > LINE_Y and cy <= LINE_Y:
direction = 'out'
inside_count -= 1
存栏数推送到平台,配合电子耳标做个体识别(RFID),出栏时自动生成流转记录。
场景二:视觉测重------不上秤也能估
传统给猪称重:人赶猪上地磅,猪应激、人费力。用双目摄像头拍一张侧身照片,深度学习回归体重。
原理:YOLO 检测猪只 → 裁剪出猪身区域 → CNN 特征提取 → 回归体重(kg)。
python
@torch.no_grad()
def estimate_weight(cropped_img, depth_map):
"""输入: 猪只裁剪图 + 深度图。输出: 估计体重(kg)"""
# 1. 从深度图提取体尺特征
length_px = measure_body_length(cropped_img, depth_map) # 体长(像素)
width_px = measure_body_width(cropped_img, depth_map) # 体宽(像素)
depth_avg = depth_map[cropped_mask].mean() # 平均深度(距离)
# 2. 实际尺寸换算(知道深度就能算实际尺寸)
focal_length = 800 # 相机标定得出的焦距
real_length = length_px * depth_avg / focal_length # 实际体长(cm)
real_width = width_px * depth_avg / focal_length
# 3. 特征 + CNN 回归
features = torch.tensor([real_length, real_width, depth_avg])
cnn_features = weight_model(cropped_img) # ResNet-18 骨干
combined = torch.cat([cnn_features, features])
weight_kg = regressor(combined) # 全连接回归 → kg
return weight_kg.item()
数据:给 100 头猪同时拍照 + 上磅秤记录真实体重,当作训练集。体重范围 15-120kg,MAE 能做到 3-5kg。精度比不上地磅,但用于日常监测够用------体重一周不涨,就说明健康出问题了。
场景三:异常行为识别
猪异常的早期信号往往在行为上:走得慢了、经常躺、被别的猪咬。姿态估计算法(如 YOLOv8-Pose)提取关节关键点,再用 LSTM 分析时序异常。
python
from ultralytics import YOLO
pose_model = YOLO('yolov8n-pose.pt')
def detect_lameness(video_clip):
"""输入 10 秒的视频片段,判断是否跛行"""
keypoints_seq = []
for frame in video_clip:
results = pose_model(frame)
if results[0].keypoints is not None:
kpts = results[0].keypoints.xy[0].cpu().numpy() # (17, 2)
keypoints_seq.append(kpts)
if len(keypoints_seq) < 20:
return False # 数据不够
# 分析步态:左右后肢的垂直位移方差
left_ankle_y = [k[15][1] for k in keypoints_seq] # 左后踝关节y坐标
right_ankle_y = [k[16][1] for k in keypoints_seq] # 右后踝关节y坐标
left_var = np.var(left_ankle_y)
right_var = np.var(right_ankle_y)
# 健康猪: 左右摆动幅度接近 (方差比 ≈ 1)
# 跛行猪: 一边几乎不动,方差比 > 3
ratio = max(left_var, right_var) / (min(left_var, right_var) + 1e-6)
return ratio > 3.0
场景四:红外热成像------发烧不用摸
猪的正常体温 38-39.5℃,发烧是最常见的疾病信号。红外热成像摄像头(如海康 H10 的 OEM 模组,500 元左右)可以非接触测温。
python
def detect_fever(thermal_frame, pig_detections):
"""从热成像中检测发烧个体"""
fever_pigs = []
for bbox in pig_detections:
x1, y1, x2, y2 = bbox
# 取耳根区域(猪的耳根温度最能反映核心体温)
ear_region = thermal_frame[y1:y2, x1:x2]
max_temp = np.max(ear_region)
if max_temp > 40.0: # ℃
fever_pigs.append({
'bbox': bbox,
'temp': max_temp,
'severity': 'high' if max_temp > 41.0 else 'medium'
})
return fever_pigs
硬件部署方案
| 场景 | 推荐摄像头 | 安装位置 | 成本 |
|---|---|---|---|
| 计数 | 海康 DS-2CD2T25 4mm | 入口正上方 2.5m | 300 元 |
| 测重 | 双目相机 (如 ZED Mini) | 通道侧面 1.2m | 1800 元 |
| 行为 | 海康 DS-2CD2146G2 2.8mm | 舍内角落 3m | 400 元 |
| 体温 | MLX90640 热成像模组 | 食槽上方 1.5m | 500 元 |
全部接 RK3588 网关,统一做推理 + 推流。一个 200 头规模的猪舍,全部硬件投入约 5000 元,一年节省的人工和减少的病死损失远超这个数。
踩坑预警
- 猪会撞摄像头。 安装高度至少 2.5m,或者用防撞罩。水面、地面反光也会干扰检测,注意补光灯角度。
- 粪便遮挡。猪身上糊了泥巴和粪便,视觉特征衰减严重。训练数据必须包含脏猪照片,不能用干净数据集训。
- 光照变化。白天自然光 + 晚上补光灯,同一个猪白天晚上颜色完全不同。训练时加亮度和对比度数据增强。
- 灰尘。猪舍粉尘大,镜头每周要擦。考虑装个小型雨刷。
下一篇:《农业无人机:从飞控到图像分析,一个人搞定》------无人机选型、航线规划、正射影像拼接、NDVI 植被指数分析。