news 2026/10/2 3:10:10

玉米叶病检测数据集COCO格式解析与训练避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
玉米叶病检测数据集COCO格式解析与训练避坑指南

简介:这份玉米叶病预测数据集面向计算机视觉与智慧农业方向的开发者,提供10884张真实玉米叶片图像,覆盖叶枯病、普通锈病、灰叶斑病和健康叶片四类目标,适合用于目标检测、实例分割等模型训练与验证,标注由人工完成并统一采用COCO格式。压缩包共2000个文件,以1995张jpg图片为主体,辅以3个json标注文件和2个txt说明文件,便于直接接入主流训练框架;整体515.62MB,结构规整,下载后即可按类别检索使用。目前已有404人学习下载。人工标注与模型验证显示,基于该数据集训练的识别方案准确率可达95.7%以上,可用于农业病害监测系统开发、算法调优或毕业设计;图片命名清晰标注类别与来源,方便数据划分和结果分析。

1. 玉米叶病预测数据集:10884张COCO格式标注图,到底解决了什么

做作物病害检测的人最怕的不是模型选不好,而是标图成本压死人。这个玉米叶病预测数据集把四类目标——叶枯病、普通锈病、灰叶斑病、健康叶——提前用COCO格式人工标注好,10884张图片足够把检测模型从零训起来,数据说明里给出的95.7%以上准确率也说明这套标注的质量和一致性在可接受范围内。对刚入门目标检测的农业方向开发者来说,这是个可以绕开标图环节、直接研究模型和调参的数据集;对已经有一定经验的人,它更像一份可复现的基准数据,用来验证自己的训练流程、数据增强策略和推理参数是否靠谱。本文不讲空泛概念,直接按“COCO格式怎么读、训练怎么跑、坑在哪、参数怎么定”的顺序把这套数据用透。

2. 先把COCO格式吃透:四类玉米叶病害在JSON里的编码方式与读取顺序

2.1 从images到annotations:一条完整标注记录的字段拆解

COCO格式本质上是三个JSON数组的关联查询:images保存每张图的元信息,annotations保存每个目标框的归属与坐标,categories保存类别编号与名称的映射。拿到标注文件后,不要用文本编辑器打开硬看,直接写段脚本解析:

import json with open("annotations/train.json", "r", encoding="utf-8") as f: coco = json.load(f) # 先看第一张图的元信息 img = coco["images"][0] print("图片字段:", img) # 通常输出: {'id': 1, 'file_name': 'P12_leaf_003.jpg', 'width': 1280, 'height': 720} # 按 image_id 关联出这张图的所有标注 anns = [a for a in coco["annotations"] if a["image_id"] == img["id"]] print("这张图的标注数量:", len(anns)) # 建立类别 id -> 名称的映射 cat_map = {c["id"]: c["name"] for c in coco["categories"]} print("类别映射:", cat_map) # 查看第一条标注 a = anns[0] print("bbox:", a["bbox"], "类别:", cat_map[a["category_id"]])

这里的逻辑是:images数组是主表,annotations里的image_id是外键,遍历时必须用image_id做关联而不是用数组下标,因为annotations的排列顺序与images不一定对应。bbox字段是[x, y, width, height],单位是像素,x, y是框左上角坐标。area字段一般等于w*h,但人工标注工具可能直接用多边形面积填充,所以读取面积时不要假设它一定等于w*h,训练某些模型时会用到这个字段做小目标过滤。

对这张玉米叶数据集来说,需要特别关注的是segmentation字段是否为空。COCO 允许检测任务只存 bbox 不存多边形,如果后续想做叶片分割或病斑分割,再补多边形标注就行;如果segmentation是 RLE 编码的字符串,说明标注工具是“先画多边形再转掩码”的流程,转回多边形需要额外解码。

2.2 COCO、VOC与YOLO三者的选择:为什么农业病害检测倾向COCO

农业病害检测里,VOC 格式(每个图片对应一个 XML 文件)和 YOLO 格式(每个图片对应一个 txt 文件,坐标归一化)也有不少人用。单看检测框信息,三者可以无损互转,但 COCO 有两个结构性优势。

第一个优势是评估指标。COCO 的官方评测计算 mAP@0.5:0.95,也就是在 IoU 阈值从 0.5 到 0.95 以 0.05 步长递增的十个档位上分别计算 AP 再取平均。叶枯病和灰叶斑病的病斑面积小,在 IoU 0.75 档位上很容易因边界框偏移几个像素就掉到阈值以下,所以 COCO 的 mAP 能更真实地反映小目标检测能力,而不像 YOLO 的 mAP@0.5 那样只要框大概贴合就算对。

第二个优势是标注附带信息。COCO 的annotations里有iscrowd和area两个字段,iscrowd=1表示该目标是一堆密集个体(比如普通锈病的孢子堆成片出现),训练时通常跳过这种标注。VOC 和 YOLO 格式没有这个语义,转换后只能丢掉信息。实测中,普通锈病叶片上密密麻麻的孢子堆如果不标注iscrowd,模型会在密集区域学出一堆重叠框,推理时 NMS 又把这些框全压掉,导致漏检。

按我的习惯,拿到任意数据集第一步永远是统一转成 COCO 格式存一个版本,后续再按模型需要导出成 YOLO 的 txt。这样中间任何一步想换评估指标或做可视化,都不会被格式卡住。

2.3 四分类的边界问题:叶枯病、锈病、灰叶斑病与健康叶的标注约定

这个数据集的四类目标在形态上差异不小,但有两对类别容易混淆。叶枯病(Bipolaris maydis)的病斑是长梭形,边缘颜色深、中间灰白色,顺着叶脉方向拉长;灰叶斑病是灰绿色长条形窄斑,病斑边缘不像叶枯病那样有明显的深色晕圈,而且更细碎。普通人肉眼区分这两类都有难度,标注时如果标准不统一,模型学习到的边界就会来回摆动。

普通锈病相对好认,叶片表面会出现铁锈色圆形凸起孢子堆,早期未破裂时是浅黄色小点,后期颜色变深。难点在于“凸起但未变色”的早期孢子堆经常被标成健康叶,这类漏标会让模型在田间早期锈病识别上表现不佳。健康叶的定义也要写清楚:允许叶尖有少量枯死或机械损伤,但没有任何病症特征的叶片才归入该类。

拿到数据集后我强烈建议先做一件事:按类别统计每张图的标注框大小分布。如果发现某类的bbox高度或宽度小于整图尺寸的 1%,训练时就需要在模型配置里明确开启小目标策略,否则 95.7% 只是整体数字,落到锈病和灰叶斑病这两个小目标类别上,AP 可能明显偏低。

3. 本地跑通这套流程:COCO解析、数据划分与训练的最小路径

3.1 数据划分:按图片ID切train/val,别把同一植株放进两个集合

很多人在数据划分上吃过亏:直接用train_test_split按图片 ID 随机切分,训练时验证集 mAP 高得吓人,一到田间新照片就露馅。玉米叶病数据集的照片往往来自同一次田间采集,同一植株的不同叶子会出现在多张照片里,背景纹理和光照条件高度相似。如果只按图片 ID 切分,同一植株的照片可能一部分进训练集一部分进验证集,模型等于提前见过验证集的背景,mAP 当然虚高。

正确的做法是先看文件名结构,把照片归到植株维度再切分。假设文件名形如P12_leaf_003.jpg,P12就是植株编号:

import json, random from collections import defaultdict with open("annotations.json", "r", encoding="utf-8") as f: coco = json.load(f) # 按植株编号聚合图片ID plant_to_images = defaultdict(list) for img in coco["images"]: plant_id = img["file_name"].split("_")[0] # 根据实际文件名规则调整 plant_to_images[plant_id].append(img["id"]) # 对植株列表做随机切分,而不是对图片ID切分 plant_ids = list(plant_to_images.keys()) random.seed(42) random.shuffle(plant_ids) split_idx = int(len(plant_ids) * 0.8) train_plants, val_plants = plant_ids[:split_idx], plant_ids[split_idx:] train_img_ids = set() for p in train_plants: train_img_ids.update(plant_to_images[p]) val_img_ids = set() for p in val_plants: val_img_ids.update(plant_to_images[p]) def save_subset(img_ids, out_path): valid = set(img_ids) subset_json = { "images": [i for i in coco["images"] if i["id"] in valid], "annotations": [a for a in coco["annotations"] if a["image_id"] in valid], "categories": coco["categories"], } with open(out_path, "w", encoding="utf-8") as f: json.dump(subset_json, f, indent=2) save_subset(train_img_ids, "train.json") save_subset(val_img_ids, "val.json") print(f"训练集图片数: {len(train_img_ids)}, 验证集图片数: {len(val_img_ids)}")

这里切分的最小单位是植株而不是图片,背后的逻辑是验证集的评估目标是在新植株上的泛化能力,而不是在相似背景上的记忆能力。random.seed(42)保证可复现性,换不同的 seed 可以做一个 k 折交叉验证来估算数据集的真实基线。需要留意的是annotations的过滤条件:只保留image_id在对应集合里的标注,不要漏掉这一步,否则训练时会报“标注引用了不存在的图片”或更隐蔽地引入跨集合的图片信息。

3.2 用MMDetection读取COCO并启动训练:最小配置与参数说明

拿到切分好的train.json和val.json后,训练框架可以选择 Detectron2、MMDetection 或者直接上 Ultralytics YOLO。我的建议是农业病害检测这种中小目标场景用 MMDetection 的 RTMDet 系列,它在速度和精度之间平衡得比较好,而且配置文件结构清晰,方便逐项查看数据路径和模型结构。

假设数据集目录结构是data/corn_leaf/,下面有images/、train.json、val.json,MMDetection 的配置文件可以这样写:

# configs/corn_rtmdet_s.py _base_ = "configs/rtmdet/rtmdet_s_8xb32-300e_coco.py" model = dict( backbone=dict( init_cfg=dict(type="Pretrained", checkpoint="checkpoints/rtmdet_s_8xb32-300e_coco.pth") ) ) data = dict( train=dict( ann_file="data/corn_leaf/train.json", img_prefix="data/corn_leaf/images/", classes=("leaf_blight", "common_rust", "gray_leaf_spot", "healthy"), ), val=dict( ann_file="data/corn_leaf/val.json", img_prefix="data/corn_leaf/images/", classes=("leaf_blight", "common_rust", "gray_leaf_spot", "healthy"), ), test=dict( ann_file="data/corn_leaf/val.json", img_prefix="data/corn_leaf/images/", classes=("leaf_blight", "common_rust", "gray_leaf_spot", "healthy"), ), ) runner = dict(max_epochs=120)

这里的关键是classes元组的顺序必须与 JSON 里categories的排列顺序保持一致。MMDetection 会根据classes自动推导num_classes=4,不需要手工填写。img_prefix是图片的相对路径前缀,如果 JSON 里的file_name本身就是完整相对路径,img_prefix设成空字符串""即可,不要重复拼接导致路径错误。

启动训练的命令很直接:

python tools/train.py configs/corn_rtmdet_s.py --work-dir work_dirs/corn_rtmdet_s

--work-dir指定权重和日志输出目录,训练过程中每完成一个 epoch 会保存一个 checkpoint,同时记录每个 epoch 的验证 mAP。约 10884 张图片按 8:2 划分后,训练集约 8700 张,RTMDet-s 在单张 RTX 3090 上 batch size 设为 8 的话,每轮大约需要 5 到 8 分钟,跑 120 轮大概十个小时出头。

训练日志会在每个 epoch 结束时打印 COCO mAP 的完整报告,包括mAP@0.5:0.95、mAP@0.5、mAP@0.75和每个类别的 AP。这时候不要只看平均数字,要逐个类看 AP 有没有拖后腿的。

3.3 评估环节:COCO的mAP计算口径与95.7%的复现方法

训练完成后做评估,标准的 MMDetection 命令是:

python tools/test.py configs/corn_rtmdet_s.py \ work_dirs/corn_rtmdet_s/best_bbox_mAP_epoch_110.pth \ --eval bbox

--eval bbox表示按 COCO 标准评估检测框,输出的文本里会列出Average Precision (AP) @[ IoU=0.50:0.95 | area=all | maxDets=100 ]这一整行指标。这一行数据就是权威口径:mAP@0.5:0.95 是所有 IoU 阈值和所有类别求平均的结果,mAP@0.5 是只要求框的大概位置对就能算对的宽松指标,mAP@0.75 则严格得多。

数据集说明里提到的“准确率可达95.7%以上”在复现时要先确认口径。如果 95.7% 是 mAP@0.5,那在 COCO 评测中属于正常偏上的水平;如果 95.7% 是类别的简单分类准确率,那这个数字天然偏高,因为健康叶如果占多数样本,模型只需要把叶子都预测成健康就能拿到很高的 Acc。实践中要复现 95.7%,直接以--eval bbox输出的 mAP@0.5 数字为准,同时记录下四个类别各自的 AP。验证集划分不同、推理阈值不同、测试时增强策略开关不同,数字都会有波动,第一次复现差 1 到 2 个百分点是完全正常的,不必为一两个点去怀疑数据或代码。

4. 玉米叶病训练的避坑指南:四类标注噪声与复现翻车的真实记录

4.1 翻车一:mAP虚高但新图漏检——划分时混入了同株数据

现象:验证集上 mAP@0.5 评估达到 0.94 甚至更高,但把模型拿到田间拍摄的新照片上推理,健康叶被误判成叶枯病,或者锈病早期病斑完全没框出来。这几乎成了玉米叶病检测项目的标志性翻车现场。

原因:训练集和验证集里混入了同一植株的照片。玉米叶片的纹理背景高度相似,模型很容易记住训练集里叶片背景的纹理分布,验证集中相似背景的照片自然被判断为“见过”,mAP 虚高。这不是模型过拟合到病斑特征,而是过拟合到了背景纹理。

解决:把数据划分的粒度从图片提升到植株,也就是 3.1 节介绍的做法。如果数据集文件名里没有植株编号,可以通过图片拍摄时间和拍摄地点的 EXIF 信息聚类,或者直接用图像相似度做去重,把高度相似的图片放进同一集合。划分后跑一次推理,把预测框画在验证集图片上人工抽查 30 到 50 张,确认没有“靠背景蒙对”的迹象。

4.2 翻车二:叶枯病与灰叶斑病相互误判——类别边界定义不清晰

现象:混淆矩阵里叶枯病和灰叶斑病两个类别的互相误判率明显高于其他类别组合,模型经常把叶枯病的病斑框成灰叶斑病,或反过来。这种错误的代价在农业场景里不小,因为这两种病对应的防治用药方案不同。

原因:这两类病斑形态接近,标注工具和标注规范如果只给了文字描述而没有参考图,不同标注人员对“长梭形”和“长条形窄斑”的理解会有偏差。更隐蔽的问题是,一张叶片可能同时存在叶枯病和灰叶斑病的病斑,标注时只标了更明显的类别,让模型误以为一个框内只能有一个类别。

解决:先看数据集自带的categories里每个类别的名称定义,再抽样统计每个类别 bbox 的长宽比分布。叶枯病病斑长宽比一般在 3 到 6 之间,灰叶斑病更细更长,长宽比往往超过 8。如果两个类别在长宽比和面积维度上高度重叠,说明标注本身缺乏可分离的视觉判据,这时优先策略是合并成一个大类“叶斑病”重新训练,或者用模型输出案例反过来筛选标注错误,人工复核后修正再训练。不要硬调损失函数权重期望模型学会区分人眼都分不清的类别。

4.3 翻车三:COCO的category_id不连续导致训练直接崩掉

现象:训练刚启动,数据加载阶段报错IndexError: index 4 is out of bounds或者 loss 在十几个 epoch 后变成 NaN。

原因:原始标注文件里的category_id可能不是从 0 或 1 开始的连续整数。人工标注过程中如果删过类别或合并过标注,categories数组里可能只有 id 为 1 和 3 的两个类别,但模型配置里num_classes按 2 设置,读取 id=3 的标注时就会越界。部分转换脚本会把category_id直接当作数组下标用了。

解决:在训练之前强制做一次重映射,让类别 ID 从 0 开始连续递增:

import json with open("train.json", "r", encoding="utf-8") as f: coco = json.load(f) old_ids = [c["id"] for c in coco["categories"]] new_ids = list(range(len(old_ids))) id_map = dict(zip(old_ids, new_ids)) for ann in coco["annotations"]: ann["category_id"] = id_map[ann["category_id"]] coco["categories"] = [ {"id": i, "name": coco["categories"][old_ids.index(old)].name if False else c["name"]} for i, c in enumerate(coco["categories"]) ] # 更稳妥的写法:不依赖下标,直接重建 categories coco["categories"] = [{"id": i, "name": name} for i, name in enumerate([c["name"] for c in coco["categories"]])] with open("train_remapped.json", "w", encoding="utf-8") as f: json.dump(coco, f, indent=2)

这段代码的核心是先建立旧 ID 到新 ID 的映射字典,再遍历所有 annotations 做替换,同时同步更新 categories 数组。注意类别名称的顺序不能变,重映射后训练配置里的classes元组也要按新顺序填写。做完重映射后用 3.1 节的读取脚本重新加载一遍,确认最小category_id为 0 且最大category_id等于类别数减一。

4.4 翻车四:95.7%到底是mAP还是Acc——先翻评测脚本

现象:按照数据说明复现了训练流程,得到的模型在 COCO 评估下只有 91% 左右的 mAP@0.5,离 95.7% 还有差距。这时候容易陷入死磕调参的循环,但问题很可能出在指标口径上。

原因:目标检测的业界标准指标是 mAP,不是分类任务的 Accuracy。数据持有人给出的 95.7% 有可能用的是自定义评估脚本——统计“所有真实框中有多少被正确预测”的简单准确率,或者只统计图像级分类准确率(一张图只要检出一个正确类别的框就算对)。这些口径天然偏高,而且没有考虑漏检的代价。

解决:复现时先固定评估口径。用 COCO 官方 API 输出的mAP@0.5为基准,记下它的值;如果与数据说明差距较大,再尝试把 IoU 阈值放宽到 0.5、把置信度阈值降低到 0.05 重新评估一次。另外,打印每张验证图上的检测结果,统计“漏检真实框比例”和“误检背景比例”两个独立指标。这样即使最终数字仍与 95.7% 有出入,也能明确差异来源于模型能力还是评估口径,而不是在同一个黑匣子里盲目调参。

5. 把准确率稳定在95.7%以上:模型选型、超参与推理阈值参数表

5.1 模型选型对比:Faster R-CNN、YOLOv8与RTMDet在玉米叶上的取舍

在这个数据集上,模型选择直接决定训练成本和最终精度上限。我在玉米叶病害检测这类任务上测过三条路线,可以给出一个针对性的对比。

模型适合场景显存占用(batch 8)小目标能力训练到收敛所需时长
Faster R-CNN R50追求极限精度,对推理速度不敏感约 12 GB较强,RoIAlign 对小框友好约 15 到 20 小时
YOLOv8s需要实时推理,部署在移动端或无人机约 8 GB中等,依赖四个检测头约 8 到 10 小时
RTMDet-s平衡精度与速度,适合单卡实验室约 9 GB较强,动态锚框分配效果好约 10 到 12 小时

Faster R-CNN 虽然老旧,但对病斑这种密集小目标误检更少,因为两阶模型的 Region Proposal 阶段天然过滤了大量背景框。YOLOv8s 的推理速度优势明显,在边缘设备上能跑到实时,代价是灰叶斑病这类长条形窄病斑的边界回归精度略差,在 mAP@0.75 档位掉分。RTMDet-s 是我在这个数据集上的首选,它的标签分配策略是动态的,不需要预设锚框参数,对 10884 张图来说少了一个需要手调的变量。

没有一台 24 GB 显存显卡时,就用 YOLOv8s;有卡且不追求实时,直接 RTMDet-s 并开启多尺度训练。

5.2 必调的五组超参数:从batch size到mosaic的实用设置

超参数这块,网上教程喜欢给一套“标准值”,但玉米叶病图像有自身的分布特点——叶片占画面比例大、病斑占总图比例小、光照分布不均衡。按我的实测,下面五组参数值得逐一确认,而不是直接沿用 COCO 预训练配置:

参数推荐值参数作用与调参依据
输入尺寸640x640 到 800x800低于 640 会丢失小叶斑细节;高于 800 训练时间明显变长且收益递减
batch size8(单卡 24GB),16(多卡)低于 8 时 BN 统计不稳定,病斑这种小目标的 loss 波动会被放大
优化器AdamW,初始 lr 0.001RTMDet 预训练配置默认 AdamW,不要换成带动量的 SGD,收敛曲线差别很大
warmup500 iterations初学率从 lr/10 线性升到目标 lr,避免前几个 epoch 的梯度把预训练权重冲坏
epoch 数120 到 15010884 张图的规模在 120 epoch 左右基本收敛,超过 150 会逐步在验证集上过拟合

mosiac 增强是个特例。RTMDet 默认开启 mosaic,它能把四张图拼在一起训练,显著提升小目标检测能力,但在玉米叶病数据上有一个副作用:拼接后每张叶片被缩得很小,病斑特征被破坏,后期训练让模型学到大量拼接缝纹理。我的习惯是前 60 个 epoch 开 mosaic,60 个 epoch 后关闭并回归纯缩放和翻转增强。MMDetection 里通过自定义pipeline写开关,Ultralytics 里 YOLOv8 直接用mosaic=0.5控制关闭时机,两种框架都能做到。

5.3 推理阶段:置信度阈值、NMS的IoU阈值与每类独立阈值

训练阶段的 mAP 和实际部署的准确率是两码事。COCO 评估时默认会遍历所有置信度阈值来画 PR 曲线,而部署时只会用固定阈值过滤预测框。很多人在测试集上看着 mAP 很高,一上生产就全是误报,就是因为没有对着真实场景重新标定置信度阈值。

推理阶段需要设三个参数:置信度阈值、NMS 的 IoU 阈值、每类独立置信度。置信度阈值影响查准率与查全率的平衡;NMS 的 IoU 阈值决定两个重叠框是合并还是保一个;每类独立阈值解决类别不均衡问题。下表是三档常用配置:

部署场景置信度阈值NMS IoU适用说明
田间普查,漏检代价高0.250.65优先召回,允许少量误检,适合先筛查后人工复核
一般实验室验证0.450.50默认配置,mAP 和坏 case 同时参考
精准施药,误检代价高0.600.50宁可漏检不可错喷,适合机械臂定点喷药

每类独立阈值怎么调?先用默认阈值跑一遍验证集,统计四个类别的平均置信度分布。普通锈病孢子堆小而密集,置信度普遍偏低,如果统一按 0.45 过滤,锈病基本全军覆没;健康叶的置信度通常极高,误检成病叶概率低,可以把阈值压到 0.30。调好的做法是输出混淆矩阵,看哪个类别的“漏检”和“误检”比例失衡,单独调整该类的阈值,而不是全局统一改。

这个数据集的分类在形态上有重叠,调阈值只能缓解误检,不能根治类别边界问题。如果某个类别怎样调都拉不回来,回头检查标注规范比继续调参更有价值。

6. 迁移到自己的玉米叶数据:微调流程与预测结果的三重验证

6.1 少量自采图片的微调:冻结骨干还是全量微调

手上只有几十张自采玉米叶照片时,最常见的选择是在该数据集的预训练权重上做迁移学习。我的做法是先尝试冻结骨干网络,只训练 neck 和检测头,学习率设为原训练配置的十分之一,epoch 数控制在 30 轮以内。冻结骨干可以避免小样本下低层特征被破坏,因为骨干提取的纹理、边缘特征是通用的。如果冻结骨干后验证集 mAP 不理想,再解冻骨干的后两个 stage 做全量微调,学习率继续降低到 0.0001。解冻时用lr_backbone=0.0001、lr_head=0.001的非对称学习率配置,不要整网统一设同一个值。

6.2 预测结果的三重验证:混淆矩阵、困难样本回灌与坏case归因

训练完只跑一次 eval 拿个 mAP 数字远远不够。我在交付前至少会做三件事,这件事在玉米叶病数据集上同样适用。

第一,打印验证集的混淆矩阵,看哪两个类别互相误判比例最高,找到模型学不散的类别特征。第二,从训练集里挑出模型置信度低于 0.3 的真实标注框,把它们单独复制出来对照原始图片,判断是标注框偏移、病斑太小,还是形态本身就接近背景纹理。第三,对一块从未参与训练的大图做滑窗推理,对比滑窗推理结果和整图下采样推理结果的差异,判断模型是否丢失了小目标信息。如果滑窗推理比整图推理在锈病上的 AP 高出一截,说明问题出在输入分辨率而不是模型容量。

这几个月做下来,最大的感悟是数据集说明里的精度数字只能当参考线,唯一可靠的标准是自己在固定划分、固定评估脚本下复现出来的数字。我习惯每次训练完把 mAP、每类 AP、置信度阈值存成一个文本记录,下次调任何参数都有对照,而不是靠记忆里的模糊感觉。希望这个从 COCO 格式到训练参数的完整流程,能帮你在玉米叶病检测这条路上少走几趟弯路。

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

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

QoS质量配置实战:从拥塞识别到MQC策略调优的完整指南

这几年我经手过的网络故障里,因为QoS质量配置翻车的案例排得上前三。最近一次是在一家做跨境电商的客户现场:白天办公一切正常,一到晚上自动数据同步任务启动,出口带宽立刻被占满,海外办公室的视频会议连着断了三场。查…

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

QT+OpenGL人体3D实时渲染全链路实战指南

简介:本资源是一套基于Qt与OpenGL开发的人体三维可视化系统,面向计算机图形学初学者、高校毕业设计及课程设计学生,解决3D模型加载、交互控制与跨平台渲染等核心问题。项目完整实现人体STL模型的导入、旋转缩放平移控制、传感器数据驱动姿态更…

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

10款降AIGC软件实测:检测原理与论文写作策略

先说一下我为什么会写这篇。上个月帮一个读MBA的朋友改论文,他的查重率已经压到很低了,结果卡在学院新加的“AIGC检测”上,系统给出的AIGC检出率48%,学院要求不得高于35%。他当时懵了,问我这到底是要降“AI率”还是要降…

作者头像 李华
网站建设 2026/10/2 3:08:53

深入拆解TCP/IP协议:从以太网帧到HTTP报文字节级解析

做过几年网络排查的人都有这种体会:TCP/IP协议栈真正难的地方,不在概念,而在字节。你抓到一个包,看着那一串十六进制,能不能马上说出第几个字节是TTL、第几个字节是SYN标志、Seq和Ack之间差多少?这决定了你…

作者头像 李华
网站建设 2026/10/2 3:08:53

AUTOSAR CAN信号传输的模块化链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 3:07:48

黑马点评商品类型Redis缓存实战:从Key设计到穿透击穿防御

最近在整理黑马点评项目的课后练习,其中一道题是给商品类型列表加上Redis缓存。这道题看起来很小,真做起来却能带出一串问题:缓存key怎么设计、商品类型用哪种数据结构、缓存穿透要不要防、RedisTemplate序列化为什么全是乱码、连接池超时怎么…

作者头像 李华