恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

COCO格式玉米好坏检测数据集:解析、转换到训练实战

  • 首页
  • 资讯中心
  • /
  • COCO格式玉米好坏检测数据集:解析、转换到训练实战

相关资讯

ROS2 Humble集成YOLOv8视觉节点实战指南 2026/10/11 14:22:54
三维CAP调制从基函数到BER仿真的完整实现与避坑指南 2026/10/11 14:22:54
面对信息缺失的项目:从rea案例拆解命名规范与逆向工程 2026/10/11 14:22:54

最新资讯

Linux字符编码实战:从乱码“锟斤拷”到UTF-8、GBK与locale排查
设计模式怎么落地:单例、工厂、策略这三个最容易被用错的地方
高防IP实战:大流量DDoS攻击的清洗策略与阈值调优
分步傅里叶法解非线性薛定谔方程:光纤脉冲传播仿真源码详解
通快TRUTOPS安装配置全指南:路径、服务、许可证三大核心要点
WEKA实战指南:从环境配置到模型部署的全流程避坑手册

今日推荐

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

COCO格式玉米好坏检测数据集:解析、转换到训练实战

发布时间:2026/10/11 14:22:54
COCO格式玉米好坏检测数据集:解析、转换到训练实战 简介玉米好坏检测数据集面向计算机视觉与深度学习初学者可用于训练玉米粒品质分类或目标检测模型解决农产品质检场景中的自动化分拣问题。压缩包共包含2000个文件以1995张JPG实拍图片为主体附带3个COCO格式JSON标注文件和2个TXT说明文档整体约122.84MB。所有图片均经过人工精细标注标注平均准确率在89.5%以上可直接用于训练YOLO、MMDetection等常见目标检测框架。已有393人学习使用适合进行数据集格式转换、增强实验或模型精度对比。图片命名规范、标注层级清晰降低了上手门槛是入门目标检测与农业AI应用的实用数据资源。 做农产品质检的都知道玉米粒好坏分选在产线上不能全靠人工位换人、灯光一变误检率就往上蹿。最近我在复现一个玉米外观检测项目卡在数据上正好拆了一份coco格式的玉米好坏检测数据集2357张实拍玉米图片全部人工标注包内说明平均准确率在89.5%以上。这份资源直击的是“没有可用的目标检测训练数据”这个最要命的问题——公开数据集大多围绕通用物体农作物细分场景几乎是空白。适合谁刚接手农业视觉项目的算法工程师以及想自己搭一套标注流程的从业者。先给结论这份数据集的标注质量和数量是匹配的但别急着把zip解压完就丢进训练脚本有几个字段和评价口径必须事先核对否则后面翻车了都不知道去哪查。下文从数据格式、自查、转换到训练逐个展开。2. COCO格式先看懂再动手json结构决定你后面省不省事COCO格式是目标检测绕不开的坑。很多人第一次拿到的不是模型而是标注文件第一反应是直接喂给网络结果报错一堆。实际上COCO标注就是一个json加一个图片目录结构非常固定花十分钟看清它后面所有转换和训练都顺了。这份数据集是标准COCO Object Detection格式不是分类用的单标签txt所以要先从解析json开始。2.1 解压后先确认文件清单zip里比想象中更朴素先把zip解压到一个干净目录我是这样做的mkdir -p corn_dataset cd corn_dataset unzip ../corn_coco_dataset.zip -d ./ find . -maxdepth 2 -type f | head -20maxdepth 2是为了只看前两层避免被庞大的图片列表刷屏。正常的COCO数据集目录下应该有images/和annotations/两个目录其中annotations里至少有一个instances_xxx.json。如果发现json和图片混在一起或者图片被套了两层子目录后面训练时路径拼接就要格外小心。我在这个包里看到的典型结构是images/xxx.jpg配annotations/instance_all.json。这里有个习惯建议解压后先不要急着删原zip因为后续做数据复核时万一某个图片损坏还要重新解压一次zip是后悔药。du -sh images annotations python3 -c import json; djson.load(open(annotations/instance_all.json)); print(len(d[images]), len(d[annotations]))第二行直接看图片数和标注框数。2357张图如果标注框数只有两千出头说明几乎每张图只有一个框这是玉米粒单粒检测的典型数量级如果框数上万说明是密集粒检测。这个比例直接决定后续用检测还是用密集检测方案。2.2 categories、images与annotations三个键看懂标注关系COCO json顶层就两个数组一个对象核心是images、annotations、categories外加info和licenses这种元信息。训练时真正会用到的只有前三个。我一般先用一段脚本把字段结构打出来import json with open(annotations/instance_all.json, r, encodingutf-8) as f: data json.load(f) print(keys:, list(data.keys())) print(\ncategories:) for c in data[categories]: print(c) print(\nimages[0]:) print(json.dumps(data[images][0], ensure_asciiFalse, indent2)) print(\nannotations[0]:) print(json.dumps(data[annotations][0], ensure_asciiFalse, indent2))逻辑说明categories里是类别表一般有两项分别是“好玉米”和“坏玉米”也可能写作good和bad具体名称以包内json为准我不建议直接硬编码。images数组里每个元素记录图片的id、file_name、width、height这四样足够定位原始图。annotations里每条是一个框image_id关联图片bbox是四个数的列表顺序是[x, y, width, height]注意是左上角坐标加宽高不是中心点。参数说明里最容易被忽略的是category_id。COCO惯例里类别id从1开始而后面转YOLO时类别号必须从0开始这个-1的偏移量是新人最容易踩的坑。另外还要看iscrowd字段0表示普通单实例框1表示群体框训练时通常要把iscrowd1的过滤掉。2.3 类别分布与bbox密度先算清楚再谈训练拿到json后不要急着训练先统计各类别框数和面积分布这一步几十行代码能省掉后面好几天弯路from collections import Counter, defaultdict cat_name {c[id]: c[name] for c in data[categories]} cat_count Counter() area_dist defaultdict(list) img_wh {} for img in data[images]: img_wh[img[id]] (img[width], img[height]) for ann in data[annotations]: if ann.get(iscrowd, 0): continue cat_count[cat_name[ann[category_id]]] 1 x, y, w, h ann[bbox] area_dist[cat_name[ann[category_id]]].append(w * h) print(类别框数:, dict(cat_count)) for c, areas in area_dist.items(): import statistics print(f{c}: 面积中位数 {statistics.median(areas):.1f} px², 最小 {min(areas):.1f} px²)逻辑说明这里先把category_id映射回名字然后按类别统计框数量再算每个框的像素面积。area字段是COCO标准里自带的但有时候标注工具导出的面积和你按bbox算出来的不一致所以我自己重算一遍更保险。参数说明面积中位数如果只有几百到一千多px²在640分辨率下属于中小目标训练时imgsz不要设太大反而要关注mosiac增强对小目标的影响如果面积中位数过万说明是近距离大图输入尺寸反而可以适当降到416或480保证batch能开大一些。这些数字是后续训练参数设置的直接依据。3. 人工标注质量怎么自查可视化与统计脚本是关键拿到人工标注的数据集最忌讳的就是直接训练、坐等指标。人工标注质量再好也有个体差异框的松紧、漏标、类别混淆都会直接传导给模型。我一般固定三道工序用pycocotools检查格式合法性、叠框可视化肉眼抽查、独立统计口径算一遍准确率。这三步做完这份数据能不能用心里基本有数。3.1 用pycocotools加载数据格式对不对一眼见分晓pycocotools是COCO官方的Python工具库安装后不只是评估用加载数据也很方便pip install pycocotoolsfrom pycocotools.coco import COCO coco COCO(annotations/instance_all.json) img_ids coco.getImgIds() print(图片数:, len(img_ids)) cat_ids coco.getCatIds() print(类别数:, len(cat_ids), coco.loadCats(cat_ids)) ann_ids coco.getAnnIds(imgIdsimg_ids[:1]) anns coco.loadAnns(ann_ids) print(第一张图的标注数:, len(anns))逻辑说明COCO类初始化时会检查json基本结构如果bbox长度不对或字段缺失会直接抛错。getImgIds()取全部图片idloadCats拿类别名这两行是后面所有操作的基座。正常加载后第一张图片的标注数应该大于等于1如果大量图片没有标注先查是不是漏标而不是强行训练。参数说明如果你用的是新版本包getAnnIds里imgIds支持列表切片但数据量大时建议按batch分次取一次性取两三千张的annIds会明显变慢。加载完成后我习惯顺手打印一张图的anns确认bbox是[x,y,w,h]而不是[x1,y1,x2,y2]——这两种格式的名字都叫bbox但语义完全不同转换脚本里看错一个符号整个训练就废了。3.2 把标注框叠回原图肉眼抽查比数字更可信统计脚本只能发现格式问题框得准不准必须看图。我写了一个轻量可视化脚本把两类框用不同颜色画出来import cv2 import random from pycocotools.coco import COCO coco COCO(annotations/instance_all.json) cats {c[id]: c[name] for c in coco.loadCats(coco.getCatIds())} color_map {好玉米: (0, 255, 0), 坏玉米: (0, 0, 255)} img_ids coco.getImgIds() random.seed(42) sample_ids random.sample(img_ids, 50) for i, img_id in enumerate(sample_ids): img_info coco.loadImgs(img_id)[0] img cv2.imread(fimages/{img_info[file_name]}) ann_ids coco.getAnnIds(imgIdsimg_id) for ann in coco.loadAnns(ann_ids): x, y, w, h ann[bbox] name cats[ann[category_id]] cv2.rectangle(img, (int(x), int(y)), (int(xw), int(yh)), color_map.get(name, (255, 255, 0)), 2) cv2.putText(img, name, (int(x), max(0, int(y)-5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_map.get(name, (255, 255, 0)), 1) cv2.imwrite(fvis_check/{i:03d}.jpg, img)逻辑说明random.seed(42)保证每次抽查的图片一致方便复看。cv2.rectangle按bbox四要素画矩形文字标注在框上方。这里有个细节bbox里的坐标可能是浮点数画图前必须int()否则OpenCV会报错。参数说明抽查量我一般取50张太少看不出规律太多看不过来。重点看两类图一是框是否紧贴玉米边缘二是坏玉米的框是否把霉变发黑的部分完整包住。如果坏玉米框普遍比实际霉变区域大一圈说明标注人员画框偏松这会让模型学到的边界含混不清。3.3 89.5%的准确率是什么口径先搞清指标再信结论包内说明写“平均准确率在89.5%以上”这个数字看起来漂亮但第一件事是确认它到底是什么口径。常见的人工标注数据集准确率算法有几种可能一是标注质检时把人工标注与专家标注做IoU匹配IoU大于等于0.5算正确二是按类别标签的像素级或实例级准确率三是标注工具里人工抽检的通过率。这三种口径差异很大但都是“准确率”。我建议的做法是把它当作一个参考门槛真正要用的是自己重算的验证指标。在后文第6章我会写怎么用pycocotools跑出一套COCO协议下的mAP那才是模型训练效果的真实基线。这里先提醒一点训练完成后如果模型指标低于89.5%不要急着怀疑模型先想想这个89.5%本身是不是按IoU0.5:0.95的均值算的。农业数据集大多用IoU0.5作为标注质检线和模型评估的严格口径差了不止一个量级。4. COCO转YOLO格式从json到txt的训练前最后一公里COCO格式数据不能直接喂给YOLO系列训练YOLO要求每张图对应一个同名txt每一行是类别号 中心点x 中心点y 宽度 高度五列全是相对图片宽高的归一化小数。所以转换是必做的一步。这个转换本身不复杂但有几个细节决定你是一次跑通还是来回试错。4.1 转换脚本坐标归一化与类别映射一次做对先写一个完整的转换脚本把COCO json转成YOLO训练目录import json import os import shutil from collections import defaultdict with open(annotations/instance_all.json, r, encodingutf-8) as f: data json.load(f) cat_id_to_yolo {} for i, c in enumerate(data[categories]): cat_id_to_yolo[c[id]] i print(COCO id - YOLO class:, cat_id_to_yolo) img_id_to_info {img[id]: img for img in data[images]} annotations_by_img defaultdict(list) for ann in data[annotations]: if ann.get(iscrowd, 0): continue annotations_by_img[ann[image_id]].append(ann) os.makedirs(yolo_dataset/images, exist_okTrue) os.makedirs(yolo_dataset/labels, exist_okTrue) for img_id, anns in annotations_by_img.items(): img_info img_id_to_info[img_id] src os.path.join(images, img_info[file_name]) dst os.path.join(yolo_dataset/images, os.path.basename(img_info[file_name])) shutil.copy2(src, dst) w, h img_info[width], img_info[height] txt_path os.path.join(yolo_dataset/labels, os.path.splitext(os.path.basename(img_info[file_name]))[0] .txt) lines [] for ann in anns: x, y, bw, bh ann[bbox] cx (x bw / 2) / w cy (y bh / 2) / h bw_n bw / w bh_n bh / h lines.append(f{cat_id_to_yolo[ann[category_id]]} {cx:.6f} {cy:.6f} {bw_n:.6f} {bh_n:.6f}) with open(txt_path, w, encodingutf-8) as tf: tf.write(\n.join(lines)) print(图片数:, len(os.listdir(yolo_dataset/images))) print(标签数:, len(os.listdir(yolo_dataset/labels)))逻辑说明第一段用enumerate生成cat_id_to_yolo映射关键点是类别顺序。如果源json里categories顺序是先坏后好那YOLO里类别0就是“坏”类别1是“好”这个顺序在训练配置里必须保持一致。第二段按image_id把标注分好组再逐图写txt。坐标换算公式里中心点是用bbox的左上角加一半宽高得到的然后分别除以图片宽高做归一化。参数说明shutil.copy2保留了文件时间戳不走库复制速度更快也更稳。写txt时保留6位小数足够小目标在高分辨率图下归一化坐标小数点后四位就够6位纯属冗余但也无伤大雅。建议把图片和标签按图中方式复制到yolo_dataset/images和yolo_dataset/labels这是YOLO训练时默认的目录约定后面配置data.yaml会用到。4.2 train/val/test划分别把同一批玉米串组转换完之后要划分数据集。很多人直接随机分配结果训练集和验证集里出现了同一批玉米的相似角度照片验证指标虚高。对于农产品的同一来源样本建议按场景或拍摄批次分组划分但这份数据集没有提供拍摄元信息所以只能用随机划分加一个强约束固定随机种子保证可复现。import random import os random.seed(2024) files [f for f in os.listdir(yolo_dataset/images) if f.endswith(.jpg)] random.shuffle(files) n len(files) train_files files[:int(n * 0.8)] val_files files[int(n * 0.8):int(n * 0.9)] test_files files[int(n * 0.9):] for f in train_files: os.makedirs(yolo_dataset/images/train, exist_okTrue) os.makedirs(yolo_dataset/labels/train, exist_okTrue) os.replace(fyolo_dataset/images/{f}, fyolo_dataset/images/train/{f}) os.replace(fyolo_dataset/labels/{f.replace(.jpg, .txt)}, fyolo_dataset/labels/train/{f.replace(.jpg, .txt)}) # val 与 test 同理代码省略逻辑说明这段先把所有文件名随机打乱再按8:1:1切成三份最后用os.replace移动文件到子目录。random.seed(2024)是关键不固定种子的话每次划分结果不同后续对比实验就没有意义。参数说明8:1:1是目标检测常用的划分比例。2357张图的话训练集约1885张验证集约236张测试集约236张。注意验证集和测试集必须是独立样本直接拿验证集当测试集调参最后报出的指标会偏乐观。4.3 训练参数参考batch size、学习率与图像尺寸数据准备好了给一份可以直接跑的YOLOv8参数参考。数据配置文件这样写# corn.yaml path: ./yolo_dataset train: images/train val: images/val test: images/test nc: 2 names: 0: bad_corn 1: good_corn训练命令我习惯这样起yolo detect train \ modelyolov8s.pt \ datacorn.yaml \ imgsz640 \ batch16 \ epochs100 \ patience15 \ seed2024参数说明imgsz640是默认值针对玉米粒这种中小目标够用如果第2章统计出面积中位数小于500px²可以试imgsz960代价是显存占用变大。batch16在单张24G显存卡上比较稳如果只有12G显存建议降到8。patience15表示验证集指标连续15个epoch不提升就早停农业数据集一般到80轮左右就收敛了没必要硬跑满100。日志说明训练完看results.png里的mAP50和mAP50-95两个曲线。对于这份玉米好坏数据集mAP50能到0.9以上是合理的mAP50-95到0.7左右就算正常。如果mAP50明显低于0.8先回头怀疑数据而不是调模型。5. 避坑手册标注数据集的四个典型翻车现场这部分是血泪经验的浓缩四个坑我每个都亲自踩过按“现象→原因→解决”写。每一条都能在拿到这份玉米数据集后几分钟内验证出来。5.1 现象解压后图片路径对不上训练直接FileNotFoundError第一次把zip解压完我直接把images目录下的图片路径写进了训练脚本结果FileNotFoundError报了几十张。原因在于数据集里的file_name字段可能带一层子目录前缀比如images/IMG_001.jpg里面嵌了IMG_001.jpg而解压时的目录结构是corn/images/IMG_001.jpg相对路径错位了一切。解决方法是统一解析转换脚本里不要直接用img_info[file_name]拼路径而是用os.path.basename把文件名取出来放一层目录。我前面第4章的转换脚本就是这么写的shutil.copy2目标路径只用了basename从源头避免了路径嵌套问题。5.2 现象categories的id不连续YOLO类别号对不上COCO的categories数组里id可能是[1, 3]而不是[0, 1]。我遇到过一次源json里只有两个类别但id是1和4。如果转换脚本写的是cat_id_to_yolo {1: 0, 4: 1}就没事但如果偷懒直接用ann[category_id]作为YOLO类别号训练时类别3的数据全被归错。解决方法是强迫自己用enumerate(data[categories])重新编号永远不要迷信原始id。我在第4章代码里明确写了这个映射过程宁可多写两行也不要留隐患。另外转完后要抽查txt文件随便看10个文件的类别号确认0和1的分布和原始标注比例接近。5.3 现象小目标漏标严重mAP看着高但现场检测不到玉米粒里小粒和碎粒占了一部分而人工标注时小粒最容易被忽略。如果训练后mAP50虚高但现场部署时漏检一堆小尺寸坏粒多半是标注阶段漏标导致模型根本没学过这些小目标。我在统计阶段会专门算一遍bbox面积分布如果面积小于20px²的框极少说明小目标漏标。解决方法是双管齐下一是训练时打开多尺度训练让模型适应不同输入尺寸二是专门挑小目标样本人工复核把漏掉的框补上。补标后重新转格式、再训练通常mAP50-95会有明显提升因为小目标框对严格指标贡献更大。5.4 现象89.5%的“准确率”和你跑的指标不是一回事这是我踩得最深的坑。包里写的“平均准确率89.5%”让我一度以为训练后mAP低于0.895就是失败后来才发现这个数字是标注环节的质检结果即人工标注框与标准答案的IoU0.5的匹配率而不是模型评估指标。这两者差别巨大标注质检的IoU阈值宽松且不涉及漏检率计算。解决方法是不要把包内准确率当作模型预期指标。正确的做法是从这份数据集中切出约236张测试图用训练好的模型跑推理再与人工标注做COCO协议下的mAP评估得到自己的基线。第6章会给出具体脚本。从那以后我拿到任何带“准确率”字眼的数据集第一件事就是找它的指标定义写在README里。找到就信一半找不到就一律当作“人工质检抽检正确率”处理。6. 数据集复核三板斧用代码确认值不值得反复用数据集的真实价值不以宣传数字为准而以你亲手复算的指标为准。我这里有一套三板的流程跑完基本能确认这份玉米数据集够不够格当作长期基线。6.1 用pycocotools跑一套COCO mAP先装好pycocotools然后把模型预测结果转成COCO格式json再与标注真值做评价。评估脚本核心如下from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval coco_gt COCO(annotations/instance_all.json) coco_dt coco_gt.loadRes(predictions.json) coco_eval COCOeval(coco_gt, coco_dt, bbox) coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize()参数说明predictions.json是你用模型对测试集推理后生成的预测标注格式和COCOannotations一致但多一个score字段表示预测置信度。summarize()打印的十个指标里第一行是Average Precision (AP) [IoU0.50:0.95]第二行是AP [IoU0.50]。前者是国际标准的严格指标后者是接近人工标注质检口径的宽松指标。实际跑下来这份玉米数据集人工标注的89.5%对应的大概率是IoU0.50这行而IoU0.50:0.95通常落在0.6到0.75之间。这个转换你心里有数后就不会拿0.7的AP去质疑模型烂了。6.2 抽样人工复核重点盯小目标和遮挡样本跑完数字还要跑眼睛。我会用第3章的脚本再抽50张但与之前不同这轮重点看三类图面积最小的10个框、两个类别相邻的图、包装袋反光导致玉米颜色偏白的图。人工标注在颜色异常和遮挡情况下最容易错这些地方恰恰是产线上的高频场景。复核完如果坏玉米框普遍把霉变区域包得偏大我会在训练时加上label_smoothing让模型对边界不必过于激进因为标注本身的边界就是模糊的模型学得再精确也是徒劳。6.3 用同一份数据训出第一个baseline最后一板是落地的核心用YOLOv8s训一版固定seed2024固定corn.yaml不变把这版结果存档为baseline。以后不管换模型、加数据、调参都拿这版对比。没有baseline的数据集调参就是打空气。实际操作时我会把每个实验的args.yaml、results.csv、最优权重打包放在一个文件夹里命名带日期和改动点。这样一个月后回头看哪一行代码改变了多少个点的mAP一目了然。做这个复核流程之前我迷信过数据包上的宣传数字训出来的模型现场漏检严重追查了大半天才发现是测试集用错了——拿训练集当测试集评估虚高到飞起。从那以后我每次拿到新数据集都强制走一遍“解压清单→统计分布→可视化抽查→转格式→独立评估”五步流程不跑完这五步不进训练环节。这套流程不挑数据玉米、小麦、水稻的检测数据集都能套着用。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号