You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure ML中带边界框标注图像数据的训测验集划分最佳方法咨询

Azure ML中标注图像数据划分训练/测试/验证集的最佳方法

一、针对ML Table格式的划分方法

ML Table是Azure ML原生格式,推荐优先使用以下两种方式:

  • 可视化工具快速拆分
    1. 在Azure ML Studio中找到已存储的ML Table数据资产,若未注册为数据集,先完成注册。
    2. 进入数据集详情页,选择「拆分数据」功能,支持按比例(如70%训练、20%验证、10%测试)或分层拆分(保证各类别样本在子集间比例一致)。
    3. 拆分完成后,将三个子集分别注册为新的数据资产,可直接用于后续模型训练。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:26:12