ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

草莓目标检测数据集:YOLO+VOC双格式开箱即用

草莓目标检测数据集:YOLO+VOC双格式开箱即用 简介目标检测是计算机视觉的基础任务其核心在于高质量标注数据与模型训练流程的无缝衔接。VOC格式凭借标注直观、评估标准统一等优势长期作为农业视觉数据的事实标准YOLO格式则以归一化坐标和扁平结构适配主流轻量模型显著提升训练效率。二者协同可兼顾科研可复现性与工程落地速度。本文聚焦果实识别典型场景——草莓检测提供一套经严格校验的双格式数据集覆盖目录结构、坐标一致性、划分逻辑等关键环节并配套验证脚本与YOLOv8/Detectron2实战配置帮助农林AI工程师、高校课题组及算法实习生跳过繁琐的数据预处理快速构建高鲁棒性田间检测baseline。1. 草莓目标检测训练数据集为什么一个带 YOLO VOC 双格式的 ZIP 包能省掉你三天数据预处理时间你手头刚接了个农业视觉项目——要识别采摘机器人视野里的成熟草莓但标注工具导出的 XML 文件和你本地 YOLOv8 训练脚本根本不兼容你试过用labelImg导出 VOC 格式又得手动写脚本转成labels/下的.txt更糟的是YOLO 标签要求归一化坐标而你用CVAT标注时忘了关“绝对坐标”开关结果训练时 bbox 全飞出图外loss 不降反升……这种翻车不是玄学是数据格式链路上的断点。这个名为“草莓目标检测训练数据集-含yolo格式数据集和VOC格式数据集.zip”的压缩包本质是一套开箱即用的跨框架数据基线它同时提供符合 PASCAL VOC 规范的Annotations/JPEGImages/目录结构以及适配 YOLO 系列v5/v8/v10的images/labels/train/val/test.txt分割文件。它不解决模型精度问题但直接封死了从标注到训练最常卡住的三个环节目录结构错位、坐标未归一化、划分比例不一致。适合正在用 PyTorch 生态做田间果实识别的农林 AI 工程师、高校作物表型课题组学生以及需要快速验证草莓检测 baseline 的算法实习生——你不需要重标一张图也不用调试转换脚本解压后就能cd yolov8 python train.py --data data.yaml跑起来。2. 从 ZIP 解压到可训练双格式数据集的物理结构与加载逻辑这个 ZIP 包不是简单把两套文件塞进去而是按工业级数据交付标准组织的。我解压后第一件事永远是tree -L 2看骨架而不是急着跑训练。下面是你实际会看到的目录树已剔除.gitignore和README.md等辅助文件strawberry_dataset/ ├── voc_format/ # 符合 PASCAL VOC 2007/2012 规范 │ ├── Annotations/ # 每张图对应一个 .xml含 bndbox 坐标像素值 │ ├── ImageSets/ # 含 Main/ 子目录内有 train.txt/val.txt/test.txt仅文件名无路径 │ ├── JPEGImages/ # 所有原始图像.jpg 格式尺寸不统一320×240 到 1920×1080 都有 │ └── SegmentationClass/ # 空目录说明该数据集不做实例分割 ├── yolo_format/ # 适配 YOLO v5/v8/v10 的 flat 结构 │ ├── images/ # 同 voc_format/JPEGImages/ 内容但软链接或硬拷贝 │ ├── labels/ # 每张图对应一个 .txt每行 class_id x_center y_center width height归一化 0~1 │ ├── train/ # 符号链接指向 images/ 和 labels/ 下子集 │ ├── val/ │ └── test/ └── dataset_info.json # 关键元数据类别数1strawberry总图数2147train:val:test7:2:1提示dataset_info.json是你判断数据质量的第一道筛子。打开它重点看class_names是否为[strawberry]不是berry或red_fruitsplit_ratio是否明确写了{train: 0.7, val: 0.2, test: 0.1}。如果 JSON 里只有total_images: 2147却没写划分比例说明ImageSets/Main/下的train.txt可能是人工写的需校验其行数是否 ≈ 2147×0.7≈1503 行。2.1 VOC 格式为什么它仍是农业数据集的“事实标准”VOC 格式在农业视觉领域长期被保留核心原因有三标注工具兼容性LabelImg、CVAT、VIA默认导出 XML且xminyminxmaxymax像素坐标对农技人员最直观“左上角第32像素宽128像素”比“归一化中心0.421”好理解评估协议绑定PASCAL VOC 的 mAP0.5 计算逻辑IoU 阈值固定为 0.5插值积分仍是多数论文 baseline 的默认指标尤其当你要和Faster R-CNN、Mask R-CNN对比时数据增强鲁棒性VOC 的 XML 中size节点明确记录了原图宽高做albumentations或torchvision.transforms的 resize/crop 时能反推原始 bbox 像素位置避免归一化坐标的浮点误差累积。但注意VOC 本身不定义训练/验证划分全靠ImageSets/Main/下的文本文件控制。你必须确认train.txt里的文件名不含扩展名在JPEGImages/中真实存在且Annotations/下有同名.xml。我曾遇到某版本数据集train.txt里混入了.png名字导致voc2yolo.py脚本读取 XML 时抛FileNotFoundError。2.2 YOLO 格式归一化坐标的三个硬约束与验证方法YOLO 格式的核心是labels/*.txt中每行的 5 个数值class_id x_center y_center width height全部为 0~1 的浮点数。这里藏着三个必须死守的约束x_center/y_center 是 bbox 中心点相对于图像宽/高的比例不是左上角width/height 是 bbox 宽高占图像宽/高的比例不是右下角坐标所有值必须严格 ∈ [0,1]哪怕 bbox 贴边如x_center0.001绝不能出现负数或 1常见于 resize 后未重算坐标。验证方法极简写一个检查脚本见下它会遍历所有.txt文件打印出越界坐标行及对应图像名# check_yolo_labels.py import os from pathlib import Path labels_dir Path(yolo_format/labels) images_dir Path(yolo_format/images) for label_path in labels_dir.rglob(*.txt): try: with open(label_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts list(map(float, line.strip().split())) if len(parts) ! 5: print(f⚠️ {label_path.name}:{i1} 行字段数≠5: {line.strip()}) continue _, xc, yc, w, h parts # 检查归一化范围 if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): img_name label_path.stem .jpg img_path images_dir / img_name if not img_path.exists(): img_path img_path.with_suffix(.png) # 兼容 png print(f❌ {label_path.name}:{i1} 坐标越界: xc{xc:.3f} yc{yc:.3f} w{w:.3f} h{h:.3f} → {img_path.name}) except Exception as e: print(f {label_path.name} 读取失败: {e})运行后若输出为空则 YOLO 标签物理正确。这是你启动训练前唯一必须通过的检查——YOLO 模型不会报错但会 silently ignore 越界 bbox导致 recall 彻底崩坏。2.3 双格式一致性如何用 10 行代码验证 VOC 与 YOLO 的标签完全对齐双格式最大的隐患不是单个格式错而是两个格式描述同一张图时 bbox 不一致。比如 VOC XML 里标注了 3 个草莓YOLO.txt里只写了 2 行或同一个草莓VOC 的xmin是 123YOLO 算出的x_center却对应 125 像素位置。这种错位会导致你在 VOC 流程中测出 85% mAP切换到 YOLO 训练却只有 62%以为是模型问题实则是数据污染。我用以下脚本做一致性快检原理对每张图解析 VOC XML 得到像素 bbox 列表再用图像宽高转成 YOLO 归一化格式与labels/下同名.txt内容逐行比对# verify_voc_yolo_sync.py import xml.etree.ElementTree as ET from pathlib import Path voc_ann_dir Path(voc_format/Annotations) yolo_label_dir Path(yolo_format/labels) images_dir Path(voc_format/JPEGImages) def voc_to_yolo_bbox(xmin, ymin, xmax, ymax, img_w, img_h): x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h return [x_center, y_center, width, height] for ann_path in voc_ann_dir.rglob(*.xml): img_name ann_path.stem .jpg img_path images_dir / img_name if not img_path.exists(): continue # 读取 VOC XML 获取原始尺寸和 bbox tree ET.parse(ann_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) voc_bboxes [] for obj in root.findall(object): bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) voc_bboxes.append(voc_to_yolo_bbox(xmin, ymin, xmax, ymax, img_w, img_h)) # 读取 YOLO label yolo_path yolo_label_dir / f{ann_path.stem}.txt if not yolo_path.exists(): print(f❗ {ann_path.name} 在 YOLO labels 中缺失) continue with open(yolo_path, r) as f: yolo_lines [list(map(float, line.strip().split()[1:])) for line in f if line.strip()] # 比较数量和坐标容忍 1e-3 浮点误差 if len(voc_bboxes) ! len(yolo_lines): print(f❌ {ann_path.name} bbox 数量不一致: VOC{len(voc_bboxes)} vs YOLO{len(yolo_lines)}) continue for i, (voc_bb, yolo_bb) in enumerate(zip(voc_bboxes, yolo_lines)): if not all(abs(v - y) 1e-3 for v, y in zip(voc_bb, yolo_bb)): print(f⚠️ {ann_path.name} 第{i1}个bbox坐标偏移: VOC{voc_bb} ≠ YOLO{yolo_bb})参数说明1e-3是浮点比较容差因不同库OpenCV/PIL读图宽高可能有 ±1 像素差异voc_to_yolo_bbox函数严格遵循 YOLO 官方定义x_center是(xminxmax)/2/img_w不是(xmax-xmin)/2/img_w——后者是常见错误。运行此脚本若全程无输出则双格式 100% 对齐。这是你决定是否信任该数据集的分水岭。3. YOLOv8 训练实战从 data.yaml 配置到 epoch 选择的完整链路拿到yolo_format/目录后你离训练只剩 3 步写data.yaml、调参、启动。别跳过data.yaml—— 这是 YOLOv8 的数据契约写错一个字段训练会静默失败比如train: ./images/train写成train: images/train少了./它会去当前目录找而非相对data.yaml路径。3.1 data.yaml农业场景下的 7 个必填字段与 2 个易错陷阱YOLOv8 的data.yaml是 YAML 格式但实际只认 7 个 key。以下是针对草莓数据集的最小可行配置路径均以yolo_format/为根# strawberry_data.yaml train: ../yolo_format/train/ # 注意必须是相对路径且以 ../ 开头因 ultralytics 默认在 ultralytics/ 目录下运行 val: ../yolo_format/val/ # 同上不能写成 ./yolo_format/val/ test: ../yolo_format/test/ # 如果 test 集存在务必声明否则 evaluate 时会报错 nc: 1 # class number草莓只有 1 类必须是整数 names: [strawberry] # class names必须是 list且顺序与 labels/*.txt 中 class_id 一一对应 # 以下为可选但强烈建议的字段 download: # 留空不自动下载 auto_download: false # 关闭自动下载避免覆盖本地数据易错陷阱 1路径的相对基准Ultralytics 的train.py默认工作目录是ultralytics/即 pip install ultralytics 后的包目录所以train:字段必须写成../yolo_format/train/让 Python 解析时从ultralytics/上一级开始找。如果你把data.yaml放在yolo_format/内部并写train: train/训练会报No images found。易错陷阱 2names必须是 list写成names: strawberry字符串或names: strawberry带引号字符串都会导致KeyError: strawberry。YOLOv8 内部用names[0]取类名所以必须是[strawberry]。3.2 训练命令与关键参数为什么--batch 16在草莓数据上比--batch 32更稳草莓图像有两大特性小目标密集单图常有 10~50 个草莓直径常 32px和光照不均大棚内阴影/反光导致 contrast 剧变。这决定了你不能照搬 COCO 的默认参数。以下是我在 RTX 3090 上实测的推荐命令yolo detect train \ datastrawberry_data.yaml \ modelyolov8n.pt \ # 用 nano 版本起步收敛快显存占用低 epochs100 \ # 农业数据量小2147 张100 足够过拟合风险高 batch16 \ # 小目标多时batch 太大会稀释梯度16 是甜点 imgsz640 \ # 输入尺寸640 平衡速度与小目标检出率试过 1280mAP↑2%但速度↓60% namestrawberry_nano_v1 \ # 实验名自动建 logs/strawberry_nano_v1/ 目录 patience10 \ # 早停val/mAP50 连续 10 epoch 不升则 stop lr00.01 \ # 初始学习率比默认 0.01 略低农业数据噪声大 optimizerAdamW \ # AdamW 比 SGD 更抗光照噪声 cacheTrue # 开启内存缓存加速 dataloader草莓图尺寸不一cache 后提速 2.3x参数逻辑说明batch16草莓小目标多大 batch 会让每个 mini-batch 的正样本strawberry bbox占比过低梯度更新方向不稳定。实测batch32时 loss 曲线抖动剧烈batch16更平滑imgsz640低于 640如 320时小草莓漏检率飙升高于 640如 1280虽提升 recall但 precision 下降误检叶片纹理且val_map50增益 0.5%不值得cacheTrue草莓图分辨率跨度大320×240 到 1920×1080Dataloader 每次都要 decode resize开启 cache 后首次加载慢后续 epoch 速度翻倍。3.3 验证与推理如何用val.py定量诊断模型瓶颈训练完别急着部署先用val.py做深度诊断。YOLOv8 的val不只是打个 mAP它会生成confusion_matrix.png、PR_curve.png、F1_curve.png三张图每张都直指问题yolo detect val \ datastrawberry_data.yaml \ modelruns/detect/strawberry_nano_v1/weights/best.pt \ conf0.001 \ # 设极低置信度阈值确保所有预测都被计入统计 iou0.5 \ # VOC 标准 IoU 阈值 save_jsonTrue \ # 输出 coco-style json用于细粒度分析 splitval # 指定验证集重点关注confusion_matrix.png如果对角线strawberry→strawberry很亮但其他格子如 strawberry→background也亮说明误检多根源常是背景复杂藤蔓/土壤纹理被当成草莓如果对角线暗且大量预测落在background格子说明漏检严重需检查 anchor 匹配小目标常用kmeans重聚 anchor或增加imgsz如果background→strawberry格子亮说明假阳性高应加强数据增强中的Mosaic和MixUp或降低conf阈值。血泪经验我第一次训草莓模型时confusion_matrix显示 38% 的预测落进background排查发现是voc_format/JPEGImages/里混入了 12 张纯黑图夜间采集失败YOLO 把它们全判成 background。删掉这些图后漏检率直降 22%。4. VOC 格式迁移当你要对接 Faster R-CNN 或 Detectron2 时的三步改造虽然 YOLO 流程最快但很多农业科研项目仍要求用 Faster R-CNN因其可解释性好能可视化 ROI Align 特征或 Detectron2支持 Mask R-CNN 做草莓成熟度分割。这时 VOC 格式就是你的起点。但voc_format/目录不能直接喂给 Detectron2——它需要register_coco_instances而 VOC 不是 COCO。你需要一次轻量改造4.1 生成 COCO-style JSON用pascal_voc_to_coco.py转换非暴力重标Detectron2 官方示例要求 COCO 格式 JSON但重标 2147 张图不现实。我们用pascal_voc_to_coco.py来自detectron2社区维护的 utils做无损转换pip install pycocotools wget https://raw.githubusercontent.com/facebookresearch/detectron2/main/tools/convert_datasets/pascal_voc.py # 修改 pascal_voc.py 中的 _get_voc_instances_meta()将 class_names 改为 [strawberry] python pascal_voc.py \ --input-dir voc_format/ \ --output-dir coco_strawberry/ \ --year 2024 \ --split train \ --classes strawberry注意pascal_voc.py默认输出coco_strawberry/annotations/instances_train2024.json但它的categories字段是{id: 1, name: strawberry, supercategory: none}Detectron2 要求supercategory不能为空字符串需手动改为supercategory: fruit否则register_coco_instances会报KeyError: supercategory。4.2 Detectron2 数据注册5 行代码搞定 dataset_dict 构建Detectron2 的核心是DatasetCatalog.register()它要求你提供一个返回list[dict]的函数每个 dict 至少含file_name、image_id、height、width、annotations。对草莓数据集最简实现如下# register_strawberry.py from detectron2.data import DatasetCatalog, MetadataCatalog from detectron2.structures import BoxMode import os import xml.etree.ElementTree as ET def load_strawberry_voc(root_dir, splittrain): root os.path.join(root_dir, voc_format) ann_dir os.path.join(root, Annotations) img_dir os.path.join(root, JPEGImages) imgset_path os.path.join(root, ImageSets, Main, f{split}.txt) with open(imgset_path) as f: img_ids [line.strip() for line in f] dataset_dicts [] for idx, img_id in enumerate(img_ids): record {} img_path os.path.join(img_dir, f{img_id}.jpg) tree ET.parse(os.path.join(ann_dir, f{img_id}.xml)) root_elem tree.getroot() record[file_name] img_path record[image_id] idx record[height] int(root_elem.find(size/height).text) record[width] int(root_elem.find(size/width).text) anns [] for obj in root_elem.findall(object): bbox obj.find(bndbox) anns.append({ bbox: [ int(bbox.find(xmin).text), int(bbox.find(ymin).text), int(bbox.find(xmax).text), int(bbox.find(ymax).text) ], bbox_mode: BoxMode.XYXY_ABS, category_id: 0, # strawberry 类别 ID从 0 开始 iscrowd: 0 }) record[annotations] anns dataset_dicts.append(record) return dataset_dicts # 注册 DatasetCatalog.register(strawberry_train, lambda: load_strawberry_voc(./, train)) MetadataCatalog.get(strawberry_train).set(thing_classes[strawberry])关键点BoxMode.XYXY_ABS表示 bbox 是(xmin,ymin,xmax,ymax)像素坐标不是归一化category_id必须是整数且thing_classes列表索引即 ID所以[strawberry]对应 ID 0。4.3 Faster R-CNN 配置微调针对小目标的 anchor 与 ROI head 优化草莓是典型小目标32pxFaster R-CNN 默认 anchor[32, 64, 128, 256, 512]完全不匹配。必须重设 anchor sizes# config.py from detectron2.config import get_cfg cfg get_cfg() cfg.merge_from_file(configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml) cfg.DATASETS.TRAIN (strawberry_train,) cfg.DATASETS.TEST (strawberry_val,) cfg.DATALOADER.NUM_WORKERS 4 cfg.MODEL.WEIGHTS detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849485/model_final_280758.pkl cfg.SOLVER.IMS_PER_BATCH 4 # 小目标 batch 要小 cfg.SOLVER.BASE_LR 0.0025 # 比 COCO 默认 0.02 低 10 倍 # ⬇️ 小目标 anchor 重设核心 cfg.MODEL.ANCHOR_GENERATOR.SIZES [[16], [32], [64], [128], [256]] # 缩小 base size cfg.MODEL.RPN.BATCH_SIZE_PER_IMAGE 256 # 增加 RPN 正样本采样数 cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE 128 # ROI head 采样数同步增 cfg.MODEL.ROI_HEADS.NUM_CLASSES 1为什么这样改原 anchor 最小是 32但草莓常 16~24pxRPN 几乎无法生成正样本。将SIZES改为[[16],[32],...]后P2 层stride4的 anchor 覆盖 16px 目标召回率提升 37%。BATCH_SIZE_PER_IMAGE加大是为了在小目标稀疏时保证 ROI head 有足够正样本训练。5. 避坑指南草莓数据集训练中 5 个高频翻车点与当场解决方案注意以下问题均来自真实项目现场不是理论假设。每一条都附带现象 → 原因 → 解决闭环可直接抄作业。5.1 现象训练 loss 曲线前 10 epoch 爆涨之后 flatline 不降原因yolo_format/labels/下存在空.txt文件对应图中无草莓YOLOv8 默认将空 label 视为background但nc1时无 background 类导致 loss 计算崩溃。解决运行find yolo_format/labels -name *.txt -size 0c -delete删除所有空文件再用 2.2 节的check_yolo_labels.py确保无越界。5.2 现象val_map50卡在 0.000但train/box_loss持续下降原因data.yaml中val:路径写错YOLO 读不到验证集图像val阶段实际在用训练集做验证但 metrics 计算逻辑异常。解决检查val路径是否指向真实存在的images/目录不是labels/并在yolo_format/val/下运行ls | head -5确认有图用python -c from ultralytics.utils.dataloaders import create_dataloader; dl create_dataloader(yolo_format/val/, 640, 16, 0); print(next(iter(dl))[0].shape)测试 dataloader 是否能正常 yield。5.3 现象推理时大量草莓被框在叶子上且置信度 0.9原因数据集中voc_format/JPEGImages/有 37 张图是纯叶片特写无草莓但ImageSets/Main/train.txt里包含了它们导致模型学到“绿色纹理草莓”。解决用grep -L object voc_format/Annotations/*.xml | xargs -I {} basename {} .xml找出无 object 的 XML 文件名再从train.txt中删除这些名字重新生成yolo_format/labels/用voc2yolo.py脚本。5.4 现象yolo detect predict输出的 bbox 坐标错位草莓被框在图外原因yolo_format/images/下混入了 PNG 图像但labels/中同名.txt是按 JPG 尺寸计算的归一化坐标PNG 尺寸常比 JPG 大 1~2px。解决统一图像格式——用mogrify -format jpg -quality 95 voc_format/JPEGImages/*.png rm voc_format/JPEGImages/*.png批量转 JPG再用 2.2 节脚本重验坐标。5.5 现象train时 GPU 显存占用 98%但nvidia-smi显示utilization只有 10%原因cacheFalse且图像尺寸不一Dataloader 频繁 decode/reiszeCPU 成瓶颈GPU 等待数据。解决强制开启cacheTrue若内存不足加--workers 8Linux或--workers 4Windows提升 dataloader 进程数终极方案用imgsz640rectTrue矩形推理减少 padding。6. 进阶技巧用 Grad-CAM 可视化定位“为什么模型总漏检青草莓”YOLO 训练完val_map50达到 78.3%看似不错但实地测试发现红草莓检出率 92%青草莓仅 41%。这不是数据不平衡青草莓在数据集中占比 23%而是模型学到了“红色草莓”的肤浅特征。要根治必须定位模型关注区域——Grad-CAM 是最轻量的可解释工具。6.1 三步注入 Grad-CAM 到 YOLOv8 推理流程YOLOv8 官方不内置 Grad-CAM但你可以用torchcam库无缝接入。以下是在predict.py中插入的最小改动# gradcam_predict.py from ultralytics import YOLO from torchcam.methods import GradCAM import torch import cv2 import numpy as np model YOLO(runs/detect/strawberry_nano_v1/weights/best.pt) cam GradCAM(modelmodel.model, target_layermodel.model.model[-1]) # 最后一个 Detect 层 img_path test_green_strawberry.jpg img cv2.imread(img_path) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results model(img_rgb, verboseFalse) # 获取 Grad-CAM 热力图 with torch.no_grad(): out model.model(torch.from_numpy(img_rgb).permute(2,0,1).float().unsqueeze(0)/255.0) activation_map cam(out[0].unsqueeze(0)) # shape: [1, H, W] # 叠加热力图到原图 heatmap activation_map[0].numpy() heatmap cv2.resize(heatmap, (img.shape[1], img.shape[0])) heatmap np.uint8(255 * heatmap) heatmap cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) superimposed cv2.addWeighted(img, 0.6, heatmap, 0.4, 0) cv2.imwrite(gradcam_green.jpg, superimposed)关键点target_layermodel.model.model[-1]指向 YOLOv8 的 Detect head含 3 个 stride 的输出这是最有效的 CAM 层out[0].unsqueeze(0)是因为cam()要求输入是[B,C,H,W]而out是[B,3,80,H,W]3 个 head取第一个 head 即可。6.2 从热力图诊断青草莓漏检根源两个典型模式我用上述脚本对 50 张青草莓图跑 Grad-CAM发现两种主导模式模式 A占 64%热力图集中在果实顶部反光点而非整个果体——模型把“高光”当成了草莓判据模式 B占 28%热力图覆盖整片叶子但草莓区域几乎无响应——模型把“绿色背景”当成了草莓必要条件。针对性改进对模式 A在train时加hsv_v0.7降低 value 通道饱和度抑制反光干扰对模式 B在voc_format/Annotations/中手动为青草莓添加leaf_occlusion属性XML 中加occluded1/occluded然后在load_strawberry_voc()函数中对occluded1的 bbox 添加is_hardTrue标签最后在 loss 中对 hard bbox 加权loss * 1.5。6.3 一个血泪习惯每次新数据加入先跑本文还有配套的精品资源点击获取
返回列表