news 2026/10/1 3:15:39

猪场实拍YOLO数据集:3万+真场景目标检测数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
猪场实拍YOLO数据集:3万+真场景目标检测数据

简介:本资源是面向农业AI与智能养殖领域的猪只目标检测专用数据集,适用于计算机视觉初学者、算法工程师及智慧畜牧项目开发者,解决猪只在复杂监控场景下的精准识别与定位难题。数据集包含2000张真实养猪场监控实拍图像,配套3万余个手工精标猪只目标,提供999个Pascal VOC格式XML标注文件(用于Faster R-CNN等框架)和1001个YOLO格式TXT标签文件(适配YOLOv5/v8/X等主流模型),整体压缩包911.17MB,结构规整、开箱即用。目前已有368人学习下载,数据覆盖多角度、多姿态、多密度猪群场景,背景丰富且无漏标,支持直接训练检测模型,亦可延伸开展关键点标注、行为分析与健康状态评估等二次开发任务。

1. 猪场监控实拍数据集:3万+目标标注不是噱头,是真能直接喂进YOLOv5/v8训练 pipeline 的“开箱即用型”农业视觉燃料

你手头正跑着一个猪只计数或异常行为识别的 demo,模型在测试图上 mAP 0.42,但一放到真实猪舍视频里就漏检成片——不是模型不行,是它根本没见过猪在泥水里打滚、在栏杆阴影下堆叠、在红外补光下泛油光的真实状态。这个标题里的“猪场监控实拍-猪识别检测数据集3万多个目标”,不是又一个合成渲染或实验室摆拍的玩具数据集,而是从华北/华南6个规模化猪场连续3个月采集的2172段监控视频抽帧生成的实战场地数据:包含哺乳期仔猪(体长<30cm)、育肥猪(体长>1.2m)、母猪(带耳标/无耳标)、病弱猪(卧姿/跛行)四类典型目标;光照条件覆盖正午强光、夜间红外补光、雨天漫射光、清晨逆光;遮挡类型含栏杆交叉遮挡、粪污溅射遮挡、同群猪体间重叠遮挡。VOC 和 YOLO 两种格式标签已对齐,bbox 坐标经人工复核+IoU 阈值 0.95 过滤,不是简单脚本转换的“伪双格式”。它解决的不是“有没有数据”的问题,而是“有没有能让你的YOLO模型在猪舍里不翻车的数据”的问题——适合正在做智慧养殖落地、需要快速验证算法鲁棒性、或想避开标注成本陷阱的工程师和农技AI团队。


2. 从下载到训练:三步走通 VOC/YOLO 双格式数据集的最小可行流程

这个数据集的价值不在“大”,而在“准”和“真”。3万+目标不是靠自动标注刷出来的数字,而是每张图都经过两轮人工校验:第一轮由猪场兽医标注关键部位(耳标位置、呼吸起伏区域),第二轮由CV工程师用LabelImg逐框修正。所以拿到手后,别急着扔进训练脚本,先确认你的 pipeline 能真正“吃透”它的结构设计逻辑。

2.1 解压与目录结构解析:看清“3万目标”藏在哪一层

数据集压缩包解压后呈现标准农业视觉数据集分层结构(非通用COCO式扁平化):

pig_farm_dataset/ ├── images/ # 所有原始图像(JPG格式,命名含时间戳+摄像头ID) │ ├── cam01_20230512_082345.jpg │ ├── cam01_20230512_082412.jpg │ └── ... ├── annotations_voc/ # PASCAL VOC 格式:每图对应一个 .xml 文件 │ ├── cam01_20230512_082345.xml │ └── ... ├── annotations_yolo/ # YOLOv5/v8 兼容格式:每图对应一个 .txt 文件,class_id + 归一化坐标 │ ├── cam01_20230512_082345.txt │ └── ... ├── trainval_test_split/ # 已划分好的 train/val/test 列表(txt文件,含相对路径) │ ├── train.txt # 每行:images/cam01_20230512_082345.jpg │ ├── val.txt │ └── test.txt └── classes.txt # 类别定义(单列文本,顺序即 class_id) # pig_suckling # pig_growing # pig_breeding # pig_sick

提示:classes.txt中的类别顺序必须与你的模型配置文件(如yolov8n.yaml中的names字段)严格一致。若你只训“健康猪”二分类,需手动删减classes.txt并重写所有.txt标签文件中的 class_id(原pig_suckling=0,pig_growing=1,pig_breeding=2,pig_sick=3→ 新healthy=0,sick=1),不能仅靠--data参数映射。

2.2 VOC转YOLO的再校验:为什么你不能跳过这一步

虽然数据集已提供 YOLO 格式标签,但实测发现约 1.7% 的.txt文件存在归一化坐标越界(x,y,w,h > 1.0 或 < 0)——根源是部分监控画面存在镜头畸变导致 bbox 在 XML 中标注时超出图像边界,VOC 转 YOLO 脚本未做 clamping。必须运行校验脚本:

# validate_yolo_labels.py import os from pathlib import Path def check_yolo_label(label_path: str, img_width: int, img_height: int): with open(label_path, 'r') as f: lines = f.readlines() for i, line in enumerate(lines): parts = line.strip().split() if len(parts) != 5: print(f"Line {i} in {label_path}: invalid format") continue try: cls_id, x, y, w, h = map(float, parts) # 归一化坐标必须在 [0,1] 区间内 if not (0 <= x <= 1 and 0 <= y <= 1 and 0 <= w <= 1 and 0 <= h <= 1): print(f"Line {i} in {label_path}: coord out of [0,1]") # 自动修复:clamp 到边界 x = max(0, min(1, x)) y = max(0, min(1, y)) w = max(0, min(1, w)) h = max(0, min(1, h)) lines[i] = f"{int(cls_id)} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n" except ValueError: print(f"Line {i} in {label_path}: non-float value") # 写回修复后的内容 with open(label_path, 'w') as f: f.writelines(lines) # 批量执行(需提前获取每张图的宽高) img_dir = Path("pig_farm_dataset/images") label_dir = Path("pig_farm_dataset/annotations_yolo") for img_path in img_dir.glob("*.jpg"): label_path = label_dir / f"{img_path.stem}.txt" if label_path.exists(): from PIL import Image w, h = Image.open(img_path).size check_yolo_label(str(label_path), w, h)

逻辑说明:该脚本不是简单报错,而是对越界坐标执行 clamp 操作(max(0, min(1, x))),因为真实场景中猪只紧贴画面边缘时,标注员可能主观将 bbox 拉出画布以强调目标完整性。直接丢弃这些样本会损失关键边缘案例,而 clamp 后仍保留有效信息——YOLO 模型对轻微坐标偏移鲁棒性极强,且训练时会通过 data augmentation 弥合此误差。

2.3 构建 YOLOv8 训练环境:用官方 ultralytics 但绕过它的“自动划分陷阱”

YOLOv8 官方ultralytics库的train命令默认按 8:1:1 划分数据集,但本数据集已提供trainval_test_split/下的精确划分(因猪场数据存在显著时间相关性:同一摄像头连续帧不能跨 train/val)。必须禁用自动划分,手动指定路径:

# 创建自定义 data.yaml(注意路径为相对于训练脚本的工作目录) cat > pig_farm_data.yaml << 'EOF' train: ../pig_farm_dataset/trainval_test_split/train.txt val: ../pig_farm_dataset/trainval_test_split/val.txt test: ../pig_farm_dataset/trainval_test_split/test.txt nc: 4 names: ['pig_suckling', 'pig_growing', 'pig_breeding', 'pig_sick'] EOF # 启动训练(关键参数说明) yolo detect train \ data=pig_farm_data.yaml \ model=yolov8n.pt \ # 使用 COCO 预训练权重,非随机初始化 epochs=150 \ # 猪只纹理复杂,需足够 epoch 收敛 batch=32 \ # 根据 GPU 显存调整(A100 40G 可设 64) imgsz=640 \ # 监控画面分辨率多为 1280x720,640 是平衡精度与速度的甜点 name=pig_farm_yolov8n_v1 \ # 实验命名,便于区分不同调参版本 patience=20 \ # val loss 连续 20 epoch 不降则早停,防过拟合 exist_ok=True \ # 允许覆盖同名实验目录 device=0 \ # 指定 GPU ID workers=8 # 数据加载进程数,避免 IO 瓶颈

参数说明:

  • patience=20:猪场数据中育肥猪与母猪外观相似度高,loss 下降缓慢,过早早停会导致 mAP 卡在 0.55 以下;
  • imgsz=640:实测 640 vs 1280 的 mAP 差异仅 +0.012,但推理速度提升 2.3 倍,对边缘部署至关重要;
  • workers=8:监控图像含大量低频纹理(水泥地、铁栏杆),torchvision.transforms的 CPU 解码耗时高,需足够 worker 并行。

3. VOC 格式深度利用:当你要做迁移学习或模型诊断时,XML 里的隐藏字段比 TXT 有用十倍

YOLO 格式标签轻量高效,但 VOC 的.xml文件才是这个数据集的“黑匣子保险柜”。它不仅存 bbox,还嵌入了三个关键字段,能帮你定位模型失败根因——而这些字段在 YOLO.txt中被彻底丢弃。

3.1<difficult>字段:识别“模型永远学不会”的硬样本

VOC 标准中<difficult>标签值为1表示该目标因小尺寸、严重遮挡或模糊而难以检测。本数据集对此字段做了增强标注:

<object> <name>pig_sick</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>1</difficult> <!-- 此猪卧姿+粪污覆盖+红外噪点 --> <bndbox> <xmin>421</xmin> <ymin>312</ymin> <xmax>478</xmax> <ymax>355</ymax> </bndbox> </object>

实战用法:训练完成后,用ultralytics的val模式导出confusion_matrix.png和labels/目录下的预测结果。编写脚本统计difficult=1样本的漏检率:

# analyze_difficult_misss.py import xml.etree.ElementTree as ET from pathlib import Path def get_difficult_boxes(xml_path: str) -> list: tree = ET.parse(xml_path) root = tree.getroot() difficult_boxes = [] for obj in root.findall('object'): if obj.find('difficult').text == '1': bndbox = obj.find('bndbox') difficult_boxes.append(( int(bndbox.find('xmin').text), int(bndbox.find('ymin').text), int(bndbox.find('xmax').text), int(bndbox.find('ymax').text) )) return difficult_boxes # 统计 val 集中所有 difficult=1 的样本漏检数 val_list = Path("pig_farm_dataset/trainval_test_split/val.txt").read_text().splitlines() total_difficult = 0 missed_difficult = 0 for img_line in val_list: img_rel_path = img_line.strip() if not img_rel_path.startswith("images/"): continue img_name = Path(img_rel_path).stem xml_path = f"pig_farm_dataset/annotations_voc/{img_name}.xml" if not Path(xml_path).exists(): continue difficult_boxes = get_difficult_boxes(xml_path) total_difficult += len(difficult_boxes) # 读取模型预测结果(假设保存在 runs/detect/pig_farm_yolov8n_v1/labels/) pred_txt = f"runs/detect/pig_farm_yolov8n_v1/labels/{img_name}.txt" if not Path(pred_txt).exists(): missed_difficult += len(difficult_boxes) # 无预测即全漏 continue # 计算 IoU 匹配(简化版:只要有一个 pred box 与 difficult box IoU > 0.5 即算检出) preds = [] with open(pred_txt, 'r') as f: for line in f: parts = line.strip().split() if len(parts) == 5: cls_id, x, y, w, h = map(float, parts) # 转回绝对坐标 x1 = (x - w/2) * 640 y1 = (y - h/2) * 640 x2 = (x + w/2) * 640 y2 = (y + h/2) * 640 preds.append((x1, y1, x2, y2)) for db in difficult_boxes: matched = False for p in preds: iou = calculate_iou(db, p) if iou > 0.5: matched = True break if not matched: missed_difficult += 1 print(f"Difficult sample miss rate: {missed_difficult/total_difficult:.3f}")

价值:若missed_difficult比例 > 65%,说明模型在真实挑战场景下失效——此时不应调 learning rate,而应增加mosaic=0.5(降低 mosaic 强度,保留更多完整 difficult 样本)或引入copy_paste=0.3(对 difficult 样本做针对性复制粘贴增强)。

3.2<truncated>字段:量化“截断目标”的分布,决定 anchor 设计

<truncated>值为1表示目标被图像边界截断(如猪头伸出画面)。本数据集中 23.6% 的pig_suckling标注含truncated=1,远高于其他类别(pig_growing仅 4.1%)。这意味着:

  • 默认 YOLOv8 的 anchor 尺寸(基于 COCO 统计)对小猪截断目标不友好;
  • 必须重聚类 anchor:用kmeans_anchor.py对pig_farm_dataset/annotations_yolo/下所有.txt文件中的 bbox 宽高运行 k-means。
# 修改 ultralytics/utils/loss.py 中的 AnchorGenerator 类,或直接替换 data.yaml 中的 anchors # 聚类命令(需安装 opencv-python) python tools/kmeans_anchors.py \ --dataset-dir pig_farm_dataset/annotations_yolo/ \ --img-size 640 \ --num-clusters 9 \ --output anchors_kmeans9.txt

输出示例(9 个 anchor,按 yolov8 的三层 neck 结构分组):

# P3/P4/P5 layers (3 anchors each) [[12,18], [21,32], [35,52]] # 小目标层(专为截断仔猪优化) [[54,78], [82,119], [115,164]] # 中目标层(育肥猪主体) [[182,258], [256,364], [342,485]] # 大目标层(母猪群)

注意:不要直接替换models/yolov8.yaml中的anchors,而应在data.yaml中添加:

anchors: - [12,18, 21,32, 35,52] - [54,78, 82,119, 115,164] - [182,258, 256,364, 342,485]

3.3<pose>字段:构建姿态感知的后处理规则

<pose>字段在本数据集中被赋予语义:Frontal(正面站立)、Lateral(侧身)、Oblique(斜向)、Supine(仰卧)、Prone(俯卧)。这不是装饰,而是为后处理提供物理约束:

  • Supine/Prone的猪只几乎必为pig_sick,可设高置信度阈值(0.7)触发告警;
  • Lateral姿态的pig_growing宽高比集中在 2.1~2.4,若检测框宽高比 < 1.8 则大概率是误检(如饲料槽反光)。

落地代码(集成到推理 pipeline):

def post_process_pose_aware(preds, xml_path: str): # 读取 XML 获取 pose 信息 tree = ET.parse(xml_path) root = tree.getroot() pose_map = {} for obj in root.findall('object'): bndbox = obj.find('bndbox') xmin = int(bndbox.find('xmin').text) ymin = int(bndbox.find('ymin').text) xmax = int(bndbox.find('xmax').text) ymax = int(bndbox.find('ymax').text) pose = obj.find('pose').text pose_map[(xmin, ymin, xmax, ymax)] = pose # 对每个预测框匹配最近的 pose 标注(IoU > 0.3) for i, (x1, y1, x2, y2, conf, cls_id) in enumerate(preds): best_iou = 0 best_pose = "Unknown" for (tx1, ty1, tx2, ty2), pose in pose_map.items(): iou = calculate_iou((x1,y1,x2,y2), (tx1,ty1,tx2,ty2)) if iou > best_iou: best_iou = iou best_pose = pose if best_iou > 0.3: if best_pose in ["Supine", "Prone"] and cls_id == 3: # pig_sick preds[i][4] = max(conf, 0.7) # 提升置信度 elif best_pose == "Lateral" and cls_id == 1: # pig_growing aspect_ratio = (x2-x1) / (y2-y1) if aspect_ratio < 1.8: preds[i][4] = conf * 0.3 # 大幅降分 return preds

4. 避坑指南:猪场数据集特有的 4 个血泪经验,踩中任意一个都会让 mAP 跌穿 0.5

这个数据集的“实拍”属性带来了不可替代的价值,也埋下了区别于通用数据集的独特陷阱。以下 4 条是我在 3 个猪场项目中反复验证过的避坑清单,按发生频率排序:

4.1 现象:val mAP 稳定在 0.62,但部署到某猪舍摄像头后漏检率飙升至 40%

原因:该摄像头使用海康威视 DS-2CD3T47G0-I,其默认开启“数字降噪(DNR)”功能,导致图像出现高频伪影(细密噪点纹),而训练集图像均来自关闭 DNR 的同型号摄像头。YOLO 模型学到的是“干净纹理”特征,对伪影敏感。
解决:在数据预处理 pipeline 中加入cv2.fastNlMeansDenoisingColored()模拟 DNR 效果,并在train.py的Albumentations中启用RandomFog和MultiplicativeNoise增强——不是为了抗雾抗噪,而是让模型习惯 DNR 产生的特定频谱失真。

4.2 现象:pig_suckling类别 recall 极低(<0.3),但 precision 接近 0.95

原因:仔猪常以“集群”形态出现(5~12 头挤在一起),标注时为避免 bbox 重叠,采用“大框套小群”策略(一个 bbox 框住整个猪群),而非单头标注。YOLO 的 anchor 机制无法区分“单头”与“群组”,导致模型学会用大框覆盖集群,却漏掉散落的单头仔猪。
解决:对pig_suckling类别强制启用single_class=True(ultralytics v8.1.0+ 支持),并修改损失函数中Objectness分支的权重,使其更关注小目标响应。同时,在data.yaml中单独为pig_suckling设置scale=0.5(缩小 bbox 尺寸用于计算 loss)。

4.3 现象:训练 loss 曲线震荡剧烈,val loss 在 50~150 epoch 间反复升降

原因:数据集中的红外夜视图像(占比 37%)存在显著色偏(整体偏绿),而 RGB 图像为正常白平衡。YOLO 的AutoAugment默认对所有图像做统一色彩扰动,导致红外图被错误地“校正”为日光色温,破坏了红外特征(如体温辐射热点)。
解决:禁用hsv_h,hsv_s,hsv_v增强,改用CLAHE(对比度受限的自适应直方图均衡化)替代Equalize,并在train.py中根据文件名前缀(ir_)动态切换增强策略:

if img_path.name.startswith('ir_'): transforms = A.Compose([ A.CLAHE(p=0.8), A.RandomBrightnessContrast(p=0.2), ]) else: transforms = A.Compose([ A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1, p=0.5), ])

4.4 现象:模型在测试集上 mAP@0.5 达 0.71,但实际视频流中频繁“抖框”(bbox 在相邻帧间剧烈跳变)

原因:监控视频存在微小帧间抖动(云台电机振动),而 YOLO 是单帧检测器,未建模时序一致性。训练集图像均为静态抽帧,未模拟抖动。
解决:在推理端引入KalmanFilter(非训练端),但关键在于初始化——不用 bbox 中心,而用cv2.calcOpticalFlowPyrLK()计算光流位移后修正的中心点。同时,对连续 5 帧的检测结果做Non-Maximum Suppression的时序版本(Soft-NMS+ 时间维度 IoU)。


5. 进阶技巧:用 VOC 的<segmented>字段生成伪分割掩码,把检测模型升级为“猪只像素级计数器”

当你需要精确统计猪只数量(尤其在密集堆叠场景),单纯 bbox 检测会因重叠导致漏计。本数据集的 VOC XML 中<segmented>字段虽为0(未提供真实分割),但我们可以利用其<bndbox>和<pose>信息,生成高质量伪分割掩码(pseudo-mask),无需额外标注成本。

5.1 伪分割生成原理:从 bbox 到 mask 的三步可信度建模

核心思想:不追求像素级精确,而保证掩码在“猪只轮廓合理区域”内。利用三个先验知识:

  • pig_suckling:椭圆建模(长轴=1.2×bbox_w,短轴=0.7×bbox_h,旋转角由<pose>决定);
  • pig_growing/breeding:矩形+圆角(圆角半径=0.15×min(w,h));
  • pig_sick(Supine/Prone):水平拉伸矩形(宽=1.8×bbox_w,高=0.6×bbox_h),模拟躺姿摊开效果。
import numpy as np import cv2 from xml.etree.ElementTree import parse def bbox_to_pseudo_mask(xmin, ymin, xmax, ymax, pose: str, cls_name: str, img_shape: tuple): h, w = img_shape[:2] mask = np.zeros((h, w), dtype=np.uint8) # 根据类别和姿态选择形状参数 if cls_name == "pig_suckling": center_x = (xmin + xmax) // 2 center_y = (ymin + ymax) // 2 axes = (int((xmax-xmin)*0.6), int((ymax-ymin)*0.35)) angle = 0 if pose == "Lateral": angle = 0 elif pose == "Oblique": angle = 30 cv2.ellipse(mask, (center_x, center_y), axes, angle, 0, 360, 255, -1) elif cls_name in ["pig_growing", "pig_breeding"]: # 圆角矩形 radius = int(min(xmax-xmin, ymax-ymin) * 0.15) pts = np.array([ [xmin+radius, ymin], [xmax-radius, ymin], [xmax, ymin+radius], [xmax, ymax-radius], [xmax-radius, ymax], [xmin+radius, ymax], [xmin, ymax-radius], [xmin, ymin+radius] ], np.int32) cv2.fillPoly(mask, [pts], 255) else: # pig_sick if pose in ["Supine", "Prone"]: new_xmin = max(0, xmin - int((xmax-xmin)*0.4)) new_xmax = min(w, xmax + int((xmax-xmin)*0.4)) new_ymin = max(0, ymin - int((ymax-ymin)*0.2)) new_ymax = min(h, ymax + int((ymax-ymin)*0.2)) cv2.rectangle(mask, (new_xmin, new_ymin), (new_xmax, new_ymax), 255, -1) return mask # 批量生成(示例) xml_dir = Path("pig_farm_dataset/annotations_voc/") mask_dir = Path("pig_farm_dataset/pseudo_masks/") mask_dir.mkdir(exist_ok=True) for xml_path in xml_dir.glob("*.xml"): tree = parse(xml_path) root = tree.getroot() img_name = root.find("filename").text img_path = Path("pig_farm_dataset/images") / img_name img = cv2.imread(str(img_path)) full_mask = np.zeros(img.shape[:2], dtype=np.uint8) for obj in root.findall("object"): name = obj.find("name").text pose = obj.find("pose").text bndbox = obj.find("bndbox") xmin = int(bndbox.find("xmin").text) ymin = int(bndbox.find("ymin").text) xmax = int(bndbox.find("xmax").text) ymax = int(bndbox.find("ymax").text) mask = bbox_to_pseudo_mask(xmin, ymin, xmax, ymax, pose, name, img.shape) full_mask = cv2.bitwise_or(full_mask, mask) cv2.imwrite(str(mask_dir / f"{xml_path.stem}.png"), full_mask)

5.2 掩码驱动的计数优化:用连通域分析替代 bbox NMS

传统 bbox NMS 在密集场景下会合并相邻猪只,而伪分割掩码可直接进行连通域分析(Connected Component Analysis),对重叠猪只实现像素级分离:

def count_by_mask(mask_path: str) -> int: mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # 形态学闭运算连接微小断裂 kernel = np.ones((3,3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 连通域分析 num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(mask, connectivity=8) # 过滤小区域(排除噪声)和过大区域(排除粘连) valid_count = 0 for i in range(1, num_labels): # 跳过背景 label 0 area = stats[i, cv2.CC_STAT_AREA] if 500 < area < 15000: # 猪只像素面积经验值(640x640 图) # 长宽比过滤(排除栏杆等细长物) w = stats[i, cv2.CC_STAT_WIDTH] h = stats[i, cv2.CC_STAT_HEIGHT] if 0.3 < w/h < 3.0: valid_count += 1 return valid_count # 对 test 集批量统计 test_list = Path("pig_farm_dataset/trainval_test_split/test.txt").read_text().splitlines() total_true = 0 total_pred = 0 for line in test_list: img_name = Path(line.strip()).stem # 真实数量:从 XML 中统计 object 数量 xml_path = f"pig_farm_dataset/annotations_voc/{img_name}.xml" tree = parse(xml_path) true_count = len(tree.findall("object")) total_true += true_count # 预测数量:用伪掩码连通域 mask_path = f"pig_farm_dataset/pseudo_masks/{img_name}.png" pred_count = count_by_mask(mask_path) total_pred += pred_count print(f"Mask-based counting MAE: {abs(total_true - total_pred)/len(test_list):.2f}")

实测效果:在pig_suckling密集场景(>8 头/帧)下,bbox NMS 计数误差均值为 ±2.3 头,而伪掩码连通域计数误差降至 ±0.7 头,且无需修改模型结构——这是用数据集自带的 VOC 元信息撬动的低成本升级。

我坚持在每个新猪场项目启动时,先花半天跑通这个伪掩码流程。它不改变模型,却让计数结果从“大概齐”变成“能写进验收报告”的数字。农业 AI 的落地,往往就卡在“够不够准”这临门一脚上,而答案常常就藏在你已有的 XML 文件里,只是没被看见。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 3:15:11

双向链表核心操作详解:结构、插入删除、逆置与C++实现

写数据结构相关的代码这么多年&#xff0c;我有一个很深的体会&#xff1a;单链表用起来确实顺手&#xff0c;但真要往回找前驱节点的时候&#xff0c;只能从头再遍历一遍&#xff0c;总有种“开过头了还要倒车”的别扭感。后来用上双向链表&#xff0c;两个方向都能走&#xf…

作者头像 李华
网站建设 2026/10/1 3:15:10

本地部署Qwen 3.8 27B:GGUF量化与llama.cpp实战指南

1. 为什么要在本地折腾 Qwen 3.8 27B第一次看到 Qwen 3.8 27B 这个规格的时候&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;27B 这个参数量卡在一个非常微妙的位置。往上够不着 70B 那种“必须上多卡”的门槛&#xff0c;往下又比 7B、14B 明显更能打&#xff0c;尤其…

作者头像 李华
网站建设 2026/10/1 3:15:09

Linux系统管理实战:文件权限、用户与网络配置

Linux record 05&#xff0c;是我这套学习记录里的第五篇。写记录这件事&#xff0c;最早是因为自己记性不太好&#xff0c;每次在Linux上折腾完一个功能&#xff0c;隔一阵子就忘得一干二净&#xff0c;后来索性养成习惯&#xff1a;遇到问题、查资料、搞定问题、复现一遍&…

作者头像 李华
网站建设 2026/10/1 3:13:54

Spring Security踢出指定用户:从SessionRegistry到JWT无状态方案

SpringSecurity踢出指定用户&#xff0c;这个需求听起来很不起眼&#xff0c;但真正动手做的时候&#xff0c;你会发现它牵扯出来的问题一个比一个多&#xff1a;会话怎么追踪、踢人之后用户下一次请求怎么被拦截、无状态 JWT 场景下又该怎么处理。我最近在一个多端登录的后台系…

作者头像 李华
网站建设 2026/10/1 3:12:47

Linux下memcached实战指南:从缓存原理、安装配置到高并发调优

Linux下面做性能优化、扛高并发&#xff0c;memcached早晚绕不开。这篇博文是我在实际运维和项目开发中反复使用memcached之后整理出来的入门实战笔记&#xff0c;从原理、安装到命令行操作、项目接入、调优排错&#xff0c;一条线讲清楚&#xff0c;新手看完能直接上手干活&am…

作者头像 李华
网站建设 2026/10/1 3:12:47

SpringBoot+Vue+MyBatis前后端分离人事系统开发部署实战

前后端分离人事系统&#xff0c;听起来像是教科书里的课程设计&#xff0c;但真正把这套东西从零跑到线上的人都知道&#xff0c;它背后涉及的不只是代码&#xff0c;而是一整套完整的前后端协作模式。SpringBoot负责接口&#xff0c;Vue渲染页面&#xff0c;MyBatis操作MySQL&…

作者头像 李华