Azure ML中带边界框标注图像数据的训测验集划分最佳方法咨询
Azure ML中标注图像数据划分训练/测试/验证集的最佳方法
一、针对ML Table格式的划分方法
ML Table是Azure ML原生格式,推荐优先使用以下两种方式:
- 可视化工具快速拆分
- 在Azure ML Studio中找到已存储的ML Table数据资产,若未注册为数据集,先完成注册。
- 进入数据集详情页,选择「拆分数据」功能,支持按比例(如70%训练、20%验证、10%测试)或分层拆分(保证各类别样本在子集间比例一致)。
- 拆分完成后,将三个子集分别注册为新的数据资产,可直接用于后续模型训练。
- Python SDK代码可控拆分
通过代码实现分层采样拆分,保证结果可复现:from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential from sklearn.model_selection import train_test_split import pandas as pd # 初始化Azure ML客户端 ml_client = MLClient( DefaultAzureCredential(), subscription_id="你的订阅ID", resource_group_name="你的资源组", workspace_name="你的工作区" ) # 加载ML Table为DataFrame dataset = ml_client.data.get(name="你的ML Table名称", version="1") df = pd.read_parquet(dataset.path) # 分层拆分:先拆分训练+验证集与测试集,再拆分训练集与验证集 train_val_df, test_df = train_test_split( df, test_size=0.1, stratify=df["标签列名"], random_state=42 ) train_df, val_df = train_test_split( train_val_df, test_size=0.222, stratify=train_val_df["标签列名"], random_state=42 ) # 保存并注册子集为新的ML Table subset_names = ["train-dataset", "val-dataset", "test-dataset"] subsets = [train_df, val_df, test_df] for name, subset in zip(subset_names, subsets): subset.to_parquet(f"./{name}.parquet") ml_client.data.create_or_update( name=name, path=f"./{name}.parquet", type="mltable", description=f"目标检测{name}" )
二、针对COCO JSON格式的划分方法
COCO是通用目标检测格式,可通过脚本或管道完成拆分:
- 自定义Python脚本拆分
基于分层采样拆分图像与标注,保证类别分布均衡:import json from sklearn.model_selection import train_test_split # 加载原始COCO JSON文件 with open("你的COCO文件路径.json", "r") as f: coco_data = json.load(f) # 建立图像ID与所属类别的映射 img_id_to_cat = {} for ann in coco_data["annotations"]: img_id = ann["image_id"] if img_id not in img_id_to_cat: img_id_to_cat[img_id] = ann["category_id"] img_ids = list(img_id_to_cat.keys()) cat_labels = [img_id_to_cat[img_id] for img_id in img_ids] # 分层拆分图像ID train_val_ids, test_ids = train_test_split( img_ids, test_size=0.1, stratify=cat_labels, random_state=42 ) train_ids, val_ids = train_test_split( train_val_ids, test_size=0.222, stratify=[img_id_to_cat[id] for id in train_val_ids], random_state=42 ) # 生成子集COCO JSON def generate_coco_subset(original, target_img_ids): return { "info": original["info"], "licenses": original["licenses"], "categories": original["categories"], "images": [img for img in original["images"] if img["id"] in target_img_ids], "annotations": [ann for ann in original["annotations"] if ann["image_id"] in target_img_ids] } # 保存拆分后的文件 with open("train_coco.json", "w") as f: json.dump(generate_coco_subset(coco_data, train_ids), f) with open("val_coco.json", "w") as f: json.dump(generate_coco_subset(coco_data, val_ids), f) with open("test_coco.json", "w") as f: json.dump(generate_coco_subset(coco_data, test_ids), f) # 后续可通过Azure ML Studio或SDK将文件注册为数据资产 - Azure ML管道自动化拆分
将拆分脚本封装为管道组件,集成到训练工作流中,实现标注数据更新后的自动拆分,输出标准化的子集数据资产。
三、最佳实践建议
- 优先选择ML Table格式的拆分方案,原生支持Azure ML生态,减少格式转换成本,与后续模型训练流程集成更顺畅。
- 必须采用分层采样拆分,避免随机拆分导致的类别分布失衡,保证模型训练的有效性。
- 固定
random_state参数,确保拆分结果可复现,便于后续调参和模型对比。
内容的提问来源于stack exchange,提问作者default_settings
相关产品推荐
相关产品推荐

