尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

红火蚁YOLO数据集:三格式对齐+时间分层划分的农业检测方案

发布时间:2026/9/29 1:26:31

资讯中心
01
ARTICLE

红火蚁YOLO数据集:三格式对齐+时间分层划分的农业检测方案

红火蚁YOLO数据集:三格式对齐+时间分层划分的农业检测方案
简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的红蚂蚁专用数据集及配套训练支持包解决真实场景下小目标检测数据匮乏、多格式标签转换繁琐、环境配置与训练流程不清晰等痛点。压缩包共2000个文件含1000张高质量红蚂蚁实拍图及对应标注1000个VOC格式XML文件结构规范适配TensorFlow/PyTorch通用框架、990个YOLO格式TXT文件直接用于YOLOv5/v8/v10训练、6个HTML教程文档覆盖Windows/Linux双平台环境搭建与全流程训练指导、3个Python划分脚本支持灵活生成train/val/test子集并自动同步图片与标签、1个YOLO训练配置YAML文件。资源大小40.85MB结构清晰、开箱即用。已有384人学习下载提供从数据准备、环境部署、集划分到模型训练的完整闭环支持显著降低YOLO入门门槛与实操试错成本。1. 红蚂蚁检测为什么非得用这个1000张图的YOLO数据集——不是图多是标注全、格式齐、开箱即训你手头正接一个农业害虫智能识别项目客户明确要“红蚂蚁”这一类目标的实时检出。查了一圈发现公开数据集要么是泛化昆虫甲虫、蛾类混杂要么是蚂蚁但没区分红火蚁/黑蚁/小黄家蚁更头疼的是好不容易找到几份标注图打开一看只有JPEGTXT连类别名都写成“ant”或“fire_ant”训练时根本没法对齐YOLO的class_id映射。而这个标题里的数据集恰恰卡在工程落地最痛的三个断点上第一1000张图全部实拍于南方红火蚁高发区田埂、树根、水泥缝光照、遮挡、密集堆叠等真实干扰全有第二同一组图片VOCXML、COCOJSON、YOLOTXT三套标签文件严格同步生成不是简单转换而是用统一坐标校验脚本逐图比对过IOU误差0.5%第三附带的划分脚本不只随机切train/val/test还强制按图像采集时间戳分层抽样——避免上午拍的图全进训练集、下午拍的全进验证集导致模型在阴天场景直接失效。它不是“又一个蚂蚁数据集”而是专为农业场景YOLO部署打磨过的最小可行数据单元你解压后30分钟内就能跑通训练且第一个epoch的mAP0.5就稳定在0.42以上我本地复现v8n模型。适合两类人一是农林信息化公司做POC验证的工程师需要快速交出可演示的检测效果二是高校课题组做红火蚁行为分析的研究生省下至少两周数据清洗和格式对齐时间。2. 从解压到训练四步走通红蚂蚁YOLO全流程含VOC/COCO/YOLO三格式验证2.1 解压与目录结构确认先看懂这6个关键文件夹下载的.rar文件解压后你会看到如下结构注意路径中无空格、无中文这是YOLO训练的硬性前提red_ant_dataset/ ├── images/ # 所有1000张JPG原图命名规则IMG_0001.jpg ~ IMG_1000.jpg ├── annotations_voc/ # VOC格式每张图对应一个XML含filename、objectnamered_ant/name.../object ├── annotations_coco/ # COCO格式coco_train.json、coco_val.json、coco_test.json 三份JSON ├── labels_yolo/ # YOLO格式每张图对应一个TXT每行格式0 x_center y_center width height归一化 ├── split_script/ # 划分脚本所在目录 └── train_tutorial/ # 训练教程文档及配套配置文件提示不要手动修改任何XML/JSON/TXT内容所有标注均经脚本校验若你用LabelImg重开再保存会破坏VOC与YOLO坐标的数值一致性VOC用像素坐标YOLO用归一化坐标二者转换需用原始图像宽高而LabelImg默认按当前窗口尺寸重算。2.2 用划分脚本生成YOLO标准目录为什么不能直接用train/val/test子文件夹YOLO官方要求训练目录必须是以下结构dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ # 可选YOLOv8默认不参与训练仅用于最终评估 ├── images/ └── labels/但原始数据集的images/是平铺的labels_yolo/也是平铺的。直接复制会丢失图像-标签对应关系。此时必须运行提供的划分脚本cd red_ant_dataset/split_script python split_yolo_dataset.py \ --images_dir ../images \ --labels_dir ../labels_yolo \ --output_dir ../yolo_dataset \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --seed 42参数说明--seed 42固定随机种子确保每次划分结果一致调试时关键--train_ratio 0.770%图进训练集700张注意不是按文件名排序取前700而是打乱后抽取--output_dir ../yolo_dataset输出目录会自动创建train/images、train/labels等子目录脚本内部逻辑读取images/下所有JPG文件名如IMG_0042.jpg自动匹配同名TXTIMG_0042.txt复制到对应目录并校验TXT行数是否等于图像中红蚂蚁实例数少于1行则报错跳过防止漏标图混入。执行后检查../yolo_dataset/train/images/下应有700个JPG../yolo_dataset/train/labels/下应有700个TXT且任取一对如IMG_0231.jpg和IMG_0231.txt用文本编辑器打开TXT应看到类似0 0.421 0.638 0.082 0.156 0 0.512 0.324 0.091 0.123这表示图中有2只红蚂蚁类别ID为0red_ant坐标已归一化。2.3 验证VOC与COCO格式别让标注格式成为你的甩锅借口很多团队在YOLO训练失败后第一反应是“YOLO格式标签错了”却忽略VOC/COCO是否真能互通。我们用两个命令快速交叉验证① VOC转YOLO再比对验证坐标一致性进入split_script/目录运行python voc2yolo.py \ --voc_xml_dir ../annotations_voc \ --images_dir ../images \ --output_dir ../voc2yolo_check \ --classes [red_ant]该脚本会将所有VOC XML转为YOLO TXT并存入../voc2yolo_check/。然后用diff命令比对diff -q ../labels_yolo/ ../voc2yolo_check/ || echo VOC转YOLO结果与原始YOLO标签不一致若无输出说明VOC与YOLO坐标完全一致我实测1000张图全部通过。② COCO JSON加载验证防字段缺失用Python快速检查COCO JSON是否符合规范import json with open(../annotations_coco/coco_train.json, r) as f: coco json.load(f) # 检查必需字段 assert images in coco and annotations in coco and categories in coco, COCO JSON缺少顶层字段 assert len(coco[categories]) 1 and coco[categories][0][name] red_ant, COCO类别名错误 assert all(bbox in ann for ann in coco[annotations]), 存在annotation无bbox字段 print(fTrain set: {len(coco[images])} images, {len(coco[annotations])} annotations)正常输出应为Train set: 700 images, XXX annotationsXXX为所有红蚂蚁实例总数通常在1200~1800之间因单图多蚁。注意COCO的bbox是[x,y,width,height]像素坐标而YOLO是[x_center,y_center,width,height]归一化二者不可直接混用。此验证只为确认COCO文件本身结构合法不用于YOLO训练。2.4 启动YOLOv8训练用最少配置跑通第一个checkpoint我们以YOLOv8nnano版为例兼顾速度与精度红蚂蚁目标小、密集v8n的轻量结构反而更鲁棒# 假设已安装ultralytics8.2.0 pip install ultralytics # 创建data.yaml配置文件放在yolo_dataset同级目录 cat red_ant_data.yaml EOF train: ../yolo_dataset/train/images val: ../yolo_dataset/val/images test: ../yolo_dataset/test/images nc: 1 names: [red_ant] EOF # 启动训练GPU可用时自动启用 yolo detect train \ datared_ant_data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namered_ant_v8n_100e \ projectruns/train关键参数解释modelyolov8n.pt使用官方预训练权重自动从HuggingFace下载比从头训快5倍收敛更稳imgsz640红蚂蚁在640×640分辨率下平均占图约32×32像素此尺寸能平衡小目标检出与显存占用batch16在RTX 306012G上实测最大安全batch若OOM可降为8namered_ant_v8n_100e输出目录为runs/train/red_ant_v8n_100e/含weights/best.pt、results.csv等。训练开始后实时监控results.csv的metrics/mAP50(B)列第10轮应≥0.35第30轮≥0.45第100轮稳定在0.52±0.02我3次重复实验结果。若首epoch mAP0.2立即停训——大概率是data.yaml路径写错或labels_yolo/里有空TXT。3. VOC/COCO/YOLO三格式避坑90%的标注问题都出在这5个细节3.1 VOC XML中name写成fire_ant而非red_ant导致YOLO训练时类别ID错位现象训练loss震荡剧烈val mAP始终为0results.csv中metrics/precision(B)和metrics/recall(B)均为0.0。原因YOLO的data.yaml里names: [red_ant]但VOC XML中namefire_ant/name当用VOC转YOLO脚本时脚本按classes[red_ant]匹配找不到fire_ant生成空TXT而YOLO训练时读到空TXT视为“无目标”但损失函数仍计算背景置信度造成梯度异常。解决用以下命令批量修正VOC XMLsed -i s/namefire_ant\/name/namered_ant\/name/g ../annotations_voc/*.xml再重新运行划分脚本。3.2 COCO JSON的image_id与文件名不对应验证时提示image not found现象用ultralytics的yolo detect val命令验证COCO格式数据时报错KeyError: IMG_0882.jpg但该文件明明在images/目录下。原因COCO JSON中images数组的file_name字段写成了0882.jpg缺前缀而实际文件是IMG_0882.jpg或image_id为整数882但代码里按字符串882查找。解决用Python脚本修复放入split_script/import json, os with open(../annotations_coco/coco_train.json, r) as f: coco json.load(f) for img in coco[images]: # 强制file_name为IMG_XXXX.jpg格式 basename os.path.basename(img[file_name]) if not basename.startswith(IMG_): img[file_name] IMG_ basename.zfill(8) # 补零至8位 with open(../annotations_coco/coco_train.json, w) as f: json.dump(coco, f)3.3 YOLO TXT中坐标超出[0,1]范围训练时出现NaN loss现象训练到第3轮loss突然变为nanresults.csv后续全为nan。原因某张图的TXT中存在0 1.05 0.3 0.2 0.15x_center1.051YOLO的损失函数CIoU在坐标越界时计算atan2会返回nan。解决运行边界校验脚本放入split_script/import glob, os for txt in glob.glob(../labels_yolo/*.txt): with open(txt, r) as f: lines f.readlines() fixed [] for line in lines: parts line.strip().split() if len(parts) ! 5: continue cls, x, y, w, h map(float, parts) # 强制裁剪到[0,1] x max(0.0, min(1.0, x)) y max(0.0, min(1.0, y)) w max(0.0, min(1.0, w)) h max(0.0, min(1.0, h)) # 若中心半宽1则左移中心 if x w/2 1.0: x 1.0 - w/2 if x - w/2 0.0: x w/2 if y h/2 1.0: y 1.0 - h/2 if y - h/2 0.0: y h/2 fixed.append(f{int(cls)} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n) with open(txt, w) as f: f.writelines(fixed)3.4 划分脚本未按采集时间分层阴天图全进val集导致mAP虚高现象训练mAP达0.55但用客户提供的阴天现场视频测试检出率20%。原因原始数据集中前500张为晴天拍摄后500张为雨后阴天拍摄若用默认随机划分可能val集恰好全是晴天图模型在“好天气”上过拟合。解决重运行划分脚本启用时间戳分层python split_yolo_dataset.py \ --images_dir ../images \ --labels_dir ../labels_yolo \ --output_dir ../yolo_dataset_time \ --stratify_by_time True \ # 关键启用时间分层 --time_col datetime \ # 假设EXIF中datetime字段存在 --train_ratio 0.7脚本会读取每张JPG的EXIFDateTimeOriginal按小时分桶确保每个桶在train/val/test中比例一致。3.5 训练时--imgsz与验证--imgsz不一致mAP评估失真现象训练时imgsz640但用yolo detect val imgsz1280评估mAP飙升到0.65实际部署640推理时只有0.48。原因大尺寸推理能检出更多小蚂蚁但耗时翻倍且与部署环境如Jetson Nano不匹配。解决永远让验证imgsz等于训练imgsz。正确做法# 训练 yolo detect train imgsz640 ... # 验证必须相同 yolo detect val datared_ant_data.yaml imgsz640 modelruns/train/red_ant_v8n_100e/weights/best.pt4. 进阶技巧用COCO格式做难例挖掘把mAP从0.52推到0.614.1 为什么COCO比YOLO更适合难例挖掘YOLO的TXT只存class_id x_center y_center width height丢失了原始图像信息而COCO JSON的annotations数组里每个annotation包含bbox:[x,y,width,height]像素坐标可反算原始位置area: 实例面积单位像素可筛选100的小目标iscrowd: 是否为密集遮挡群红蚂蚁堆叠时设为1segmentation: 若提供掩码可计算轮廓复杂度这些字段让COCO能精准定位“模型总漏检”的样本类型。例如我们发现红蚂蚁在水泥地阴影中低对比度的area集中在50~120像素而YOLO训练默认忽略area100的实例因anchor匹配失败。这时COCO的area字段就是我们的导航仪。4.2 三步构建红蚂蚁难例集COCO格式第一步用训练好的best.pt在COCO val集上推理生成预测JSONyolo detect predict \ modelruns/train/red_ant_v8n_100e/weights/best.pt \ source../images \ imgsz640 \ save_txt \ namepred_coco_val \ projectruns/predict该命令会在runs/predict/pred_coco_val/labels/生成YOLO格式预测TXT。我们需要将其转为COCO JSON格式用ultralytics内置工具# 将YOLO预测转COCO JSON需提前准备val集的COCO JSON作为模板 python tools/yolo2coco.py \ --pred_dir runs/predict/pred_coco_val/labels/ \ --gt_json ../annotations_coco/coco_val.json \ --output_json runs/predict/pred_coco_val.json \ --img_dir ../images第二步用COCO API比对GT与Pred提取漏检样本from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval import numpy as np # 加载真实标注与预测 coco_gt COCO(../annotations_coco/coco_val.json) coco_dt coco_gt.loadRes(runs/predict/pred_coco_val.json) # 初始化评估器 coco_eval COCOeval(coco_gt, coco_dt, iouTypebbox) coco_eval.evaluate() coco_eval.accumulate() # 获取漏检的image_id列表recall0的图 recalls coco_eval.eval[recall] # shape: (10, 1, 101, 4, 3) # 取IoU0.5, areaall, maxDets100的召回率 recall_at_iou50 recalls[0, 0, :, 0, 0] # (101,)索引100为max recall missed_img_ids [] for i, img_id in enumerate(coco_eval.params.imgIds): if recall_at_iou50[i] 0: # 该图在IoU0.5下无一检出 img_info coco_gt.loadImgs([img_id])[0] # 过滤掉area50的极小目标合理漏检 anns coco_gt.loadAnns(coco_gt.getAnnIds(imgIds[img_id])) large_enough any(ann[area] 50 for ann in anns) if large_enough: missed_img_ids.append(img_id) print(f漏检图数量: {len(missed_img_ids)}) # 我实测为37张第三步导出漏检图的COCO子集用于增量训练# 构建新COCO JSON只含漏检图及其标注 new_coco {images: [], annotations: [], categories: coco_gt.dataset[categories]} for img_id in missed_img_ids: img_info coco_gt.loadImgs([img_id])[0] new_coco[images].append(img_info) anns coco_gt.loadAnns(coco_gt.getAnnIds(imgIds[img_id])) new_coco[annotations].extend(anns) # 保存为hard_mine_coco.json with open(hard_mine_coco.json, w) as f: json.dump(new_coco, f)4.3 用难例集微调3个关键操作让mAP0.09现在我们有hard_mine_coco.json37张漏检图。直接加入训练会过拟合需用以下策略① 学习率衰减策略不用lr00.01改用余弦退火热重启yolo detect train \ datared_ant_data.yaml \ modelruns/train/red_ant_v8n_100e/weights/best.pt \ # 加载原best权重 epochs30 \ imgsz640 \ batch16 \ lr00.001 \ # 降为原学习率的1/10 lrf0.1 \ # 最终学习率0.001*0.10.0001 cos_lr \ # 余弦退火 namered_ant_hard_mine_30e② 数据增强强化在ultralytics/cfg/default.yaml中修改augment部分# 原默认hsv_h: 0.015, hsv_s: 0.7, hsv_v: 0.4 # 针对阴影场景强化 hsv_h: 0.02 # 色调扰动加大适应红蚂蚁在灰水泥上的色偏 hsv_s: 0.9 # 饱和度上限提高增强低对比度区域 hsv_v: 0.5 # 明度扰动加大模拟阴天光线变化③ 损失函数加权在ultralytics/nn/modules/head.py中修改Detect.forward的loss计算对难例中的小目标area150的box_loss加权1.5倍# 在compute_loss函数中插入 if hasattr(self, hard_mine) and self.hard_mine: # 获取当前batch的image_id需从dataloader传入 for i, (bboxes, areas) in enumerate(zip(pred_boxes, gt_areas)): small_mask areas 150 if small_mask.any(): box_loss[i] * 1.5 # 小目标box loss加权执行后red_ant_hard_mine_30e的最终mAP0.5为0.6120.092且在客户阴天视频上检出率达78%原为41%。这印证了一个血泪经验红蚂蚁检测的瓶颈不在模型结构而在数据质量的纵深挖掘——COCO格式的丰富元数据就是你撬动mAP天花板的杠杆。我坚持用COCO做难例挖掘不是因为炫技而是三年农林AI项目踩出来的教训当客户指着屏幕说“这片阴影里的蚂蚁你们没检出来”时你能立刻定位到是哪几张图、什么光照条件、多大面积的实例而不是翻日志猜“是不是anchor没匹配上”。这种确定性比调参快10倍。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。