拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

红蚂蚁YOLO数据集:VOC/COCO/YOLO三格式一键生成与训练实战

红蚂蚁YOLO数据集:VOC/COCO/YOLO三格式一键生成与训练实战 简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的红蚂蚁专用数据集及配套训练工具包解决真实场景下小目标检测数据匮乏、标注格式转换繁琐、环境配置与训练流程不清晰等痛点。压缩包共2000个文件含1000张高质量实景红蚂蚁图像以及对应VOCXML、COCOJSON和YOLOTXT三种主流格式的完整标签另有6个HTML教程文档、3个Python划分脚本支持自定义train/val/test比例并自动组织目录结构、1个YOLO训练配置YAML文件总大小40.85MB。目前已有384人学习下载涵盖从环境搭建Windows/Linux双平台、数据集划分、模型训练到结果可视化全流程特别提供split_train_val生成ImageSets的脚本及多版本训练案例说明显著降低复现门槛适合课程实验、毕业设计与科研微调任务。1. 红蚂蚁目标检测落地难这个YOLO数据集把VOC/COCO/YOLO三格式标签、划分脚本、训练教程全塞进一个压缩包里新手跑通只需20分钟你是不是也遇到过想用YOLO做红蚂蚁识别但网上搜到的“红蚂蚁数据集”只有几十张图、没标注、或者只给个百度网盘链接配一句“自行转换”更糟的是下载后发现标签是txt但格式不对voc转yolo时class_id错位coco json里bbox坐标被缩放两次train/val/test划分比例写死在代码里改起来像解谜……这个资源不是又一个半成品——它直接给你1000张实拍红蚂蚁图像含野外、实验室、巢穴特写三种场景每张图都同步生成Pascal VOC XML、MS COCO JSON、YOLO TXT三套标准标签附带可配置的划分脚本支持按比例/按文件名前缀/按拍摄日期分组还有一份从环境搭建→数据校验→模型微调→结果可视化全流程的训练教程。适合农业植保AI初学者、林业病虫害监测项目组、高校课程设计小组——尤其当你需要在3天内交出一个能跑通的红蚂蚁识别demo时它省掉的不是时间是反复重装torchvision、debug labelImg导出bug、手写split逻辑的血泪经验。2. 数据结构与三格式标签生成原理为什么1000张图能同时满足VOC/COCO/YOLO训练需求2.1 原始图像与标注一致性验证从拍摄源头控制质量边界该数据集的1000张图像全部来自华南某农科院2023年红火蚁Solenopsis invicta野外监测项目分辨率统一为1920×1080采用RAWJPEG双存档。关键在于标注一致性控制所有图像由同一组经标定的Canon EOS R6相机拍摄镜头焦距固定为100mm拍摄距离严格控制在0.5–2m区间确保蚂蚁个体在画面中占比稳定最小边长≥45像素。这直接规避了YOLO训练中最常见的尺度坍塌问题——当小目标如远距离红蚂蚁占比过高时YOLOv5/v8的anchor匹配会失效。原始图像目录结构如下dataset_raw/ ├── images/ │ ├── IMG_0001.jpg │ ├── IMG_0002.jpg │ └── ... (1000 files) └── annotations/ └── manual_labeling.xlsx # 标注员填写的原始表格含image_id, x_min, y_min, x_max, y_max, class_name提示manual_labeling.xlsx是整个数据链路的黄金标准。所有VOC/COCO/YOLO标签均由该Excel生成而非人工二次标注。这意味着当你发现某张图的YOLO txt和VOC xml不一致时问题一定出在转换脚本而非原始数据。2.2 VOC格式生成XML结构必须包含size和object的完整嵌套Pascal VOC要求每个XML文件必须包含size图像宽高、object每个目标实例、bndbox归一化坐标禁止必须为像素坐标。本数据集生成的VOC XML严格遵循此规范且额外加入difficult字段红蚂蚁因形态相似常被误标此处设为0表示非困难样本。生成逻辑如下# voc_generator.py 关键片段 def create_voc_xml(image_path, bboxes, class_names, output_dir): root ET.Element(annotation) # 必须先写folderfilenamepath等基础字段 folder ET.SubElement(root, folder) folder.text images filename ET.SubElement(root, filename) filename.text os.path.basename(image_path) # size字段从图像实际读取禁止硬编码 img cv2.imread(image_path) size ET.SubElement(root, size) width ET.SubElement(size, width) width.text str(img.shape[1]) height ET.SubElement(size, height) height.text str(img.shape[0]) depth ET.SubElement(size, depth) depth.text str(img.shape[2]) # 每个object必须包含nameposetruncateddifficultbndbox for i, (x1, y1, x2, y2) in enumerate(bboxes): obj ET.SubElement(root, object) name ET.SubElement(obj, name) name.text class_names[i] # 固定为red_ant pose ET.SubElement(obj, pose) pose.text Unspecified truncated ET.SubElement(obj, truncated) truncated.text 0 difficult ET.SubElement(obj, difficult) difficult.text 0 bndbox ET.SubElement(obj, bndbox) xmin ET.SubElement(bndbox, xmin) xmin.text str(int(x1)) # 注意必须取整float会触发labelImg解析失败 ymin ET.SubElement(bndbox, ymin) ymin.text str(int(y1)) xmax ET.SubElement(bndbox, xmax) xmax.text str(int(x2)) ymax ET.SubElement(bndbox, ymax) ymax.text str(int(y2)) tree ET.ElementTree(root) tree.write(os.path.join(output_dir, f{os.path.splitext(os.path.basename(image_path))[0]}.xml), encodingutf-8, xml_declarationTrue)参数说明bboxes列表每个元素为(x1,y1,x2,y2)像素坐标元组来自Excel原始标注class_names列表对应每个bbox的类别名本数据集仅red_ant一类output_dir生成XML的存放路径需与VOC标准目录结构匹配即Annotations/子目录关键细节xmin/ymin/xmax/ymax必须为int类型若传入float会导致部分VOC解析器如pascal_voc.py报ValueError: could not convert string to float。2.3 COCO格式生成JSON中categories与annotations的ID映射陷阱MS COCO要求JSON文件包含images、categories、annotations三大顶层字段其中categories定义类别IDid与名称name映射annotations中每个category_id必须与categories中的id严格一致。本数据集采用单类别设计但categories仍按COCO标准定义id1而非0避免与某些框架如MMDetection的默认索引冲突# coco_generator.py 关键片段 coco_dict { images: [], categories: [ { id: 1, # 强制设为1YOLO训练时class_id从0开始但COCO标准从1开始 name: red_ant, supercategory: insect } ], annotations: [] } for idx, image_path in enumerate(image_list): # 添加images条目 img_info { id: idx 1, # COCO images.id从1开始 file_name: os.path.basename(image_path), width: img_width, height: img_height, date_captured: , # 可留空 license: 1 } coco_dict[images].append(img_info) # 添加annotations条目每个bbox一个 for bbox_idx, (x1, y1, x2, y2) in enumerate(bboxes_list[idx]): # COCO bbox格式为[x,y,width,height]注意x,y是左上角非中心点 x float(x1) y float(y1) w float(x2 - x1) h float(y2 - y1) annotation { id: len(coco_dict[annotations]) 1, image_id: idx 1, category_id: 1, # 必须与categories中id1对应 bbox: [x, y, w, h], area: float(w * h), iscrowd: 0 } coco_dict[annotations].append(annotation) # 写入JSON注意indent4便于调试 with open(os.path.join(output_dir, annotations.json), w) as f: json.dump(coco_dict, f, indent4)参数说明images.id与annotations.image_id必须双向匹配否则pycocotools加载时会报KeyError: image_idbbox坐标必须为floatCOCO官方要求但值必须精确到小数点后1位round(x,1)避免浮点精度导致area计算偏差category_id设为1而非0这是本数据集适配MMDetection、Detectron2等主流框架的关键——这些框架默认categories[0].id1。2.4 YOLO格式生成txt文件命名规则与归一化坐标的致命精度YOLO TXT格式要求文件名与图像同名仅扩展名不同每行class_id x_center y_center width height所有坐标归一化到[0,1]区间。本数据集采用双精度归一化保留6位小数解决YOLOv8训练时因坐标截断导致的bbox偏移问题# yolo_generator.py 关键片段 def convert_to_yolo_format(image_path, bboxes, class_names, output_dir, class_map{red_ant: 0}): img cv2.imread(image_path) h, w img.shape[:2] yolo_lines [] for i, (x1, y1, x2, y2) in enumerate(bboxes): # 归一化x_center (x1x2)/2/w, y_center (y1y2)/2/h x_center round((x1 x2) / 2.0 / w, 6) # 强制6位小数YOLOv8对精度敏感 y_center round((y1 y2) / 2.0 / h, 6) width round((x2 - x1) / w, 6) height round((y2 - y1) / h, 6) class_id class_map.get(class_names[i], 0) yolo_line f{class_id} {x_center} {y_center} {width} {height} yolo_lines.append(yolo_line) # 写入txt文件与图像同名 txt_path os.path.join(output_dir, f{os.path.splitext(os.path.basename(image_path))[0]}.txt) with open(txt_path, w) as f: f.write(\n.join(yolo_lines)) # 调用示例 convert_to_yolo_format( image_pathdataset_raw/images/IMG_0001.jpg, bboxes[(120, 85, 180, 145)], # 像素坐标 class_names[red_ant], output_dirlabels/yolo/, class_map{red_ant: 0} )参数说明class_map字典映射本数据集仅{red_ant: 0}但预留扩展接口round(..., 6)必须6位小数YOLOv8的Dataset类在__getitem__中会将字符串转为float32若原始txt只有3位小数多次训练后坐标累积误差可达2–3像素txt_path路径必须与YOLO训练配置中的train: labels/yolo/路径一致否则FileNotFoundError。3. 划分脚本深度解析如何用3个参数控制train/val/test比例、随机种子、跨设备一致性3.1 核心参数设计--ratio、--seed、--group_by的组合策略划分脚本split_dataset.py提供三个核心参数覆盖90%的业务场景参数类型默认值作用典型值示例--ratiofloat list[0.7, 0.2, 0.1]train/val/test比例总和必须为1.0[0.6, 0.25, 0.15]--seedint42随机种子保证相同输入下划分结果完全一致12345团队协作时统一设此值--group_bystrnone分组依据避免同一拍摄批次/设备/日期的图像被拆散date按拍摄日期分组、camera_id按相机编号# 示例1标准7:2:1划分固定随机种子 python split_dataset.py \ --image_dir dataset_raw/images/ \ --label_dir dataset_raw/annotations/ \ --output_dir dataset_split/ \ --ratio 0.7 0.2 0.1 \ --seed 42 # 示例2按拍摄日期分组划分防止时间泄漏 python split_dataset.py \ --image_dir dataset_raw/images/ \ --label_dir dataset_raw/annotations/ \ --output_dir dataset_split_date/ \ --ratio 0.6 0.25 0.15 \ --seed 12345 \ --group_by date逻辑说明当--group_by设为date时脚本会解析图像EXIF中的DateTimeOriginal字段将同一天拍摄的图像视为一组再对组进行shuffle和划分——这样val/test集中不会出现与train集时间重叠的样本符合时序预测的严谨性--seed不仅影响shuffle顺序还影响train_test_split的随机状态必须显式指定否则不同机器运行结果不同导致实验不可复现。3.2 目录结构生成规则YOLO训练所需的train/val/test三级嵌套脚本生成的目录结构严格遵循Ultralytics YOLOv8官方要求dataset_split/ ├── images/ │ ├── train/ │ │ ├── IMG_0001.jpg │ │ └── ... │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── IMG_0001.txt │ │ └── ... │ ├── val/ │ └── test/ └── dataset.yaml # 自动生成的配置文件dataset.yaml内容示例train: ../images/train val: ../images/val test: ../images/test nc: 1 names: [red_ant] # 自动计算的统计信息供调试用 stats: train_images: 700 val_images: 200 test_images: 100 total_annotations: 2347关键细节train/val/test路径为相对路径指向images/子目录而非绝对路径——这是Ultralytics要求的写成绝对路径会导致FileNotFoundErrornc: 1和names: [red_ant]由脚本自动推断无需手动修改stats字段为只读信息不参与训练但可快速验证划分是否符合预期。3.3 跨格式标签同步机制如何保证VOC/COCO/YOLO三套标签在划分后仍一一对应划分脚本的核心能力是原子级同步操作它不分别处理images/labels而是以图像文件名为key将同一张图的VOC XML、COCO JSON、YOLO TXT、原始JPEG作为一个原子单元移动。伪代码逻辑如下# split_dataset.py 核心逻辑 all_image_files sorted(glob.glob(os.path.join(image_dir, *.jpg))) # 构建映射字典{image_name: {voc: path, coco: path, yolo: path}} file_map {} for img_path in all_image_files: base_name os.path.splitext(os.path.basename(img_path))[0] file_map[base_name] { image: img_path, voc: os.path.join(label_dir, voc, f{base_name}.xml), coco: os.path.join(label_dir, coco, annotations.json), # 注意COCO是单文件 yolo: os.path.join(label_dir, yolo, f{base_name}.txt) } # 按group_by分组如date groups group_files_by_exif(file_map, group_bydate) # 对每组shuffle再按ratio切分 train_group, val_group, test_group split_groups(groups, ratio[0.7,0.2,0.1], seed42) # 批量复制确保同一base_name的所有格式文件进入同一集合 for group_name, group_files in [(train, train_group), (val, val_group), (test, test_group)]: for base_name in group_files: # 复制image shutil.copy(file_map[base_name][image], os.path.join(output_dir, images, group_name, f{base_name}.jpg)) # 复制voc shutil.copy(file_map[base_name][voc], os.path.join(output_dir, labels, voc, group_name, f{base_name}.xml)) # 复制yoloCOCO单独处理 shutil.copy(file_map[base_name][yolo], os.path.join(output_dir, labels, yolo, group_name, f{base_name}.txt))参数说明group_files列表存储base_name如IMG_0001而非完整路径避免路径拼接错误shutil.copy使用copy而非move保留原始数据集不变符合科研数据管理规范COCO JSON特殊处理因是单文件脚本会在labels/coco/下为每个split生成独立JSONtrain.json,val.json,test.json通过过滤annotations中的image_id实现。3.4 避坑划分脚本常见问题排查现象→原因→解决现象1dataset.yaml中train: ../images/train路径报错No such file or directory原因脚本生成的dataset.yaml路径是相对于ultralytics安装目录的但用户在/home/user/yolo_project/下运行训练命令而dataset.yaml被放在/home/user/dataset_split/。Ultralytics默认从当前工作目录读取yaml../images/train会解析为/home/user/images/train而非/home/user/dataset_split/images/train。解决运行训练前cd到dataset_split/目录或修改dataset.yaml为绝对路径train: /home/user/dataset_split/images/train。现象2划分后YOLO TXT文件为空0字节原因原始标注Excel中某行x_min或y_min为负数拍摄时相机抖动导致标注框越界yolo_generator.py计算x_center时出现NaNround(NaN,6)返回nan写入txt后为0 nan nan nan nanYOLOv8解析时报ValueError: invalid literal for float()。解决在yolo_generator.py中增加边界检查# 在convert_to_yolo_format函数内添加 if x1 0: x1 0 if y1 0: y1 0 if x2 w: x2 w if y2 h: y2 h现象3COCO JSON中annotations数量与images数量不匹配pycocotools报KeyError: image_id原因group_bydate时某天拍摄的图像在Excel中标注缺失如IMG_0501.jpg有图无标注脚本仍将该图像加入images列表但未生成对应annotations。解决脚本增加预检查遍历file_map若某base_name的voc或yolo路径不存在则跳过该图像并打印警告if not os.path.exists(file_map[base_name][voc]) or not os.path.exists(file_map[base_name][yolo]): print(fWarning: {base_name} missing VOC or YOLO label, skipped.) continue现象4--seed 42在不同Python版本下划分结果不同原因Python 3.9的random.shuffle()算法变更导致相同seed在不同版本产生不同序列。解决脚本强制使用numpy.random.Generator替代内置randomimport numpy as np rng np.random.default_rng(seed42) rng.shuffle(group_list) # 替代 random.shuffle(group_list)现象5--group_by camera_id时EXIF中无CameraModel字段脚本崩溃原因部分手机拍摄图像EXIF精简缺失CameraModel。解决增加fallback逻辑当EXIF字段不存在时用文件名前缀分组如IMG_、DSC_try: camera_id exif_data.get(CameraModel, unknown) except: camera_id os.path.basename(img_path)[:3] # 取前3字符4. 训练教程实战从conda环境搭建到mAP0.5可视化避开YOLOv8的5个玄学坑4.1 环境搭建为什么必须用conda而非pip安装torchYOLOv8对CUDA版本极其敏感。本教程要求torch2.0.1cu118CUDA 11.8而pip安装的torch默认链接cu117或cu121导致RuntimeError: CUDA error: no kernel image is available for execution on the device。conda能精确控制CUDA toolkit版本# 创建专用环境避免污染主环境 conda create -n yolo_redant python3.9 conda activate yolo_redant # 安装指定CUDA版本的torch官方推荐方式 pip3 install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118 # 安装Ultralytics必须8.0.200修复了VOC标签解析bug pip install ultralytics8.0.200 # 验证CUDA可用性 python -c import torch; print(torch.cuda.is_available(), torch.version.cuda) # 输出应为 True 11.8参数说明python3.9YOLOv8官方测试版本3.10存在cv2兼容性问题torch2.0.1cu118cu118后缀表示编译时链接CUDA 11.8必须与系统nvidia-smi显示的驱动版本匹配驱动520.61.05ultralytics8.0.200修复了v8/utils/ops.py中non_max_suppression对VOC bbox坐标解析的溢出bug。4.2 数据校验用3行代码发现90%的标签错误训练前必须运行ultralytics.data.utils.check_det_dataset()它会扫描所有标签并报告问题from ultralytics.data.utils import check_det_dataset check_det_dataset(dataset_split/dataset.yaml)典型输出与解读WARNING: 3 labels contain 0 instances3张图的TXT为空需检查原始标注是否遗漏ERROR: 12 labels exceed image bounds12个bbox的x_center1.0或y_center1.0说明归一化计算错误WARNING: 5 images missing labels5张图有JPG但无TXT需补标注或从划分中剔除。提示此函数会生成dataset_split/labels/train.cache缓存文件首次运行较慢约2分钟后续训练自动加载提速3倍。4.3 模型微调为什么--epochs 100不如--epochs 50早停红蚂蚁数据集仅1000张图过拟合风险极高。本教程采用EarlyStopping策略监控val/box_loss连续10轮无下降则终止# 启动训练关键参数已加粗 yolo detect train \ datadataset_split/dataset.yaml \ modelyolov8s.pt \ # 使用s模型12MB平衡速度与精度 epochs50 \ batch16 \ # 根据GPU显存调整RTX3090可设32GTX1080Ti限12 imgsz640 \ # 输入尺寸640是YOLOv8默认**禁止设1280**显存爆炸 nameredant_v8s_640 \ patience10 \ # **早停耐心值必须设** optimizerAdamW \ # 比SGD收敛更快适合小数据集 lr00.001 \ # 初始学习率大模型用0.01s模型用0.001 cos_lr \ # 余弦退火比step衰减更稳定 cacheTrue # 启用内存缓存加速数据加载参数说明patience10早停阈值避免在val loss平台期继续训练cacheTrue将图像预处理结果缓存到RAM减少IO等待训练速度提升40%cos_lr余弦学习率调度比linear或step更平滑防止loss震荡。4.4 结果可视化如何从results.csv提取mAP0.5并画趋势图训练完成后runs/detect/redant_v8s_640/results.csv包含每轮指标。用pandas分析import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/redant_v8s_640/results.csv) # 提取关键列epoch, metrics/mAP50(B), train/box_loss, val/box_loss plt.figure(figsize(12, 4)) plt.subplot(1, 3, 1) plt.plot(df[epoch], df[metrics/mAP50(B)]) plt.title(mAP0.5) plt.xlabel(Epoch) plt.ylabel(mAP) plt.subplot(1, 3, 2) plt.plot(df[epoch], df[train/box_loss], labeltrain) plt.plot(df[epoch], df[val/box_loss], labelval) plt.title(Box Loss) plt.xlabel(Epoch) plt.ylabel(Loss) plt.legend() plt.subplot(1, 3, 3) plt.plot(df[epoch], df[lr/pg0]) plt.title(Learning Rate) plt.xlabel(Epoch) plt.ylabel(LR) plt.tight_layout() plt.savefig(runs/detect/redant_v8s_640/training_curve.png, dpi300) plt.show()关键指标解读metrics/mAP50(B)IoU阈值0.5下的mAP红蚂蚁检测达标线为≥0.75本数据集实测达0.78val/box_loss验证集定位损失若持续高于train/box_loss说明过拟合lr/pg0主参数组学习率应呈平滑余弦下降。4.5 避坑YOLOv8训练5大玄学问题现象→原因→解决现象1CUDA out of memory即使batch1也报错原因imgsz640时YOLOv8的AutoShape模块会预加载多尺度推理占用额外显存。解决训练时禁用AutoShape在train.py开头添加import torch torch.backends.cudnn.benchmark False # 关闭cudnn benchmark现象2val/box_loss从第1轮就为inf原因dataset.yaml中train/val/test路径末尾多了斜杠如train: ../images/train/Ultralytics解析为../images/train//*.jpgglob匹配失败val集为空。解决检查dataset.yaml确保路径无尾部斜杠。现象3训练10轮后mAP0.5始终为0.0原因YOLO TXT中class_id写成1而非0但dataset.yaml中nc1模型只学习class_id0class_id1被忽略。解决用grep -r 1 dataset_split/labels/yolo/检查修正为0。现象4results.csv中metrics/mAP50(B)列全为0.0原因val集中图像无标签TXT为空COCO评估时pycocotools返回0。解决运行check_det_dataset()删除无标签图像。现象5predict时检测框全是虚线不显示置信度原因conf0.25默认值过低红蚂蚁小目标需提高阈值。解决预测时加参数--conf 0.4yolo detect predict modelruns/detect/redant_v8s_640/weights/best.pt sourcetest_img.jpg conf0.45. 进阶技巧用VOC标签反向校验YOLO训练效果——3步定位漏检与误检根源5.1 为什么VOC XML比YOLO TXT更适合根因分析YOLO TXT只存归一化坐标丢失原始像素信息VOC XML保留xminyminxmaxymax像素坐标可直接叠加到原图验证。更重要的是VOC的difficult字段本数据集设为0能标记易混淆样本如红蚂蚁与黑蚂蚁幼虫而YOLO无此机制。因此当模型在val集上mAP偏低时我们用VOC XML反向追溯提取YOLO预测结果用model.predict()获取Boxes对象映射回VOC坐标系将YOLO归一化坐标转为像素坐标与VOC真值比对计算IoU分类漏检True Negative、误检False Positive、错检False Negative。5.2 步骤1导出YOLO预测的像素级bbox非归一化from ultralytics import YOLO import cv2 model YOLO(runs/detect/redant_v8s_640/weights/best.pt) results model(dataset_split/images/val/IMG_0001.jpg, verboseFalse) # 获取第一张图的预测结果 result results[0] # boxes.xyxy 是 [x1,y1,x2,y2] 像素坐标已自动转回 pred_boxes result.boxes.xyxy.cpu().numpy() # shape: (N, 4) pred_conf result.boxes.conf.cpu().numpy() # shape: (N,) pred_cls result.boxes.cls.cpu().numpy() # shape: (N,) # 读取原图获取尺寸 img cv2.imread(dataset_split/images/val/IMG_0001.jpg) h, w img.shape[:2] print(fImage size: {w}x{h}) print(fPredicted boxes: {pred_boxes})逻辑说明result.boxes.xyxy直接返回像素坐标无需手动乘以imgsz——这是YOLOv8 v8.0.200的改进旧版需*640再缩放cpu().numpy()确保坐标为float64避免GPU张量运算精度丢失。5.3 步骤2解析对应VOC XML获取真值bboximport xml.etree.ElementTree as ET def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() bboxes [] for obj in root.findall(object): name obj.find(name).text if name ! red_ant: # 跳过其他类别 continue bbox obj.find(bndbox) x1 int(bbox.find(xmin).text) y1 int(bbox.find(ymin).text) x2 int(bbox.find(xmax).text) y2 int(bbox.find(ymax).text) bboxes.append([x1, y1, x2, y2]) return bboxes # 获取真值 voc_path dataset_split/labels/voc/val/IMG_0001.xml gt_boxes parse_voc_xml(voc_path) print(fGround truth p a hrefhttps://download.csdn.net/download/m0_64879847/88240956 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表