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

Azure ML目标检测:从现有Datastore设置数据资产及训练配置

Azure ML 目标检测数据配置问题解答

1. 是否需要创建训练、验证两个Data Asset?

不是强制要求,但推荐注册。原因:

  • 目标检测训练需要固定的训练/验证拆分,避免每次训练数据分布不一致;
  • 注册为Data Asset后可复用、版本化,便于追踪数据变更对模型的影响;
  • 若训练脚本需要明确区分训练/验证数据路径,注册后调用更便捷。
    如果只是临时测试,也可以在训练脚本内直接拆分原始数据,无需单独注册。

2. 如何将imagens文件夹注册为Data Asset?

使用Azure ML SDK v2,通过以下代码注册文件夹类型的Data Asset(uri_folder):

from azure.ai.ml import MLClient
from azure.ai.ml.entities import FileDataAsset
from azure.ai.ml.constants import AssetTypes
from azure.identity import DefaultAzureCredential

# 初始化ML客户端
ml_client = MLClient(
    credential=DefaultAzureCredential(),
    subscription_id="你的订阅ID",
    resource_group_name="你的资源组名",
    workspace_name="你的工作区名"
)

# 获取目标Datastore
datastore = ml_client.datastores.get("image_frames")

# 注册imagens文件夹为Data Asset
image_data_asset = FileDataAsset(
    name="imagens_train_data",
    path=f"azureml://datastores/{datastore.name}/paths/dados_treinamento/imagens",
    type=AssetTypes.URI_FOLDER,
    description="目标检测训练图片数据集"
)

ml_client.data.create_or_update(image_data_asset)

同理可注册object_annotations_normalized.jsonl为文件类型的Data Asset(uri_file):

annotation_data_asset = FileDataAsset(
    name="object_annotations",
    path=f"azureml://datastores/{datastore.name}/paths/dados_treinamento/object_annotations_normalized.jsonl",
    type=AssetTypes.URI_FILE,
    description="目标检测标注文件"
)

ml_client.data.create_or_update(annotation_data_asset)

3. 能否直接从image_frames Datastore拆分训练/验证集?若可以,具体如何操作?

可以拆分,推荐两种方式:

方式1:训练脚本内拆分(灵活易实现)

读取Data Asset路径后,按比例或文件名规则拆分,注意保证图片与标注的对应关系:

import os
import json
from sklearn.model_selection import train_test_split

# 训练脚本接收的输入路径(通过Input传入)
images_dir = os.environ.get("INPUT_IMAGES")
annotation_path = os.environ.get("INPUT_ANNOTATIONS")

# 读取标注文件
with open(annotation_path, "r", encoding="utf-8") as f:
    annotations = [json.loads(line) for line in f]

# 按比例拆分标注(比如8:2)
train_annotations, val_annotations = train_test_split(annotations, test_size=0.2, random_state=42)

# 保存拆分后的标注文件到输出目录
os.makedirs("outputs/train_annotations", exist_ok=True)
os.makedirs("outputs/val_annotations", exist_ok=True)

with open("outputs/train_annotations/train.jsonl", "w", encoding="utf-8") as f:
    for ann in train_annotations:
        json.dump(ann, f)
        f.write("\n")

with open("outputs/val_annotations/val.jsonl", "w", encoding="utf-8") as f:
    for ann in val_annotations:
        json.dump(ann, f)
        f.write("\n")

方式2:注册拆分后的子集为Data Asset(适合长期复用)

先注册完整的图片和标注Data Asset,再基于子集创建新的Data Asset:

# 获取已注册的完整图片Data Asset
full_image_asset = ml_client.data.get("imagens_train_data", version="1")

# 按文件名前缀拆分(示例:取文件名以"train_"开头的图片)
train_image_asset = FileDataAsset(
    name="imagens_train_subset",
    path=f"{full_image_asset.path}/train_*",
    type=AssetTypes.URI_FOLDER,
    description="训练集图片子集"
)

ml_client.data.create_or_update(train_image_asset)

注意:这种方式需要图片文件名本身带有训练/验证标识,否则还是推荐脚本内拆分。

4. 使用Input类时,该如何指定路径?

Input类支持两种路径指定方式:

方式1:引用已注册的Data Asset

from azure.ai.ml import Input

# 引用文件夹类型的Data Asset(imagens)
images_input = Input(type="uri_folder", path="azureml:imagens_train_data:1")

# 引用文件类型的Data Asset(标注文件)
annotation_input = Input(type="uri_file", path="azureml:object_annotations:1")

格式说明:azureml:<Data Asset名称>:<版本号>,版本号可省略(默认取最新版本)。

方式2:直接引用Datastore路径

无需注册Data Asset,直接指定Datastore下的路径:

images_input = Input(
    type="uri_folder",
    path="azureml://datastores/image_frames/paths/dados_treinamento/imagens"
)

annotation_input = Input(
    type="uri_file",
    path="azureml://datastores/image_frames/paths/dados_treinamento/object_annotations_normalized.jsonl"
)

5. 如何关联imagens文件夹中的图片与jsonl标注文件?

核心是利用标注文件中记录的图片标识(如文件名、相对路径),在训练脚本中匹配图片路径:

  1. 确认标注文件格式:确保object_annotations_normalized.jsonl的每条记录包含图片的唯一标识,例如:
{"image_filename": "img_001.jpg", "bboxes": [[x1,y1,x2,y2], ...], "labels": ["cat", ...]}
  1. 训练脚本中关联:
import os
import json

images_dir = os.environ.get("INPUT_IMAGES")
annotation_path = os.environ.get("INPUT_ANNOTATIONS")

with open(annotation_path, "r", encoding="utf-8") as f:
    for line in f:
        ann = json.loads(line)
        # 拼接完整图片路径
        image_path = os.path.join(images_dir, ann["image_filename"])
        # 验证图片是否存在
        if os.path.exists(image_path):
            # 后续处理:读取图片、加载标注、训练模型
            pass
        else:
            print(f"图片不存在:{image_path}")

如果标注文件中记录的是相对路径(如imagens/img_001.jpg),则需要截取文件名部分,或者调整拼接逻辑。


内容的提问来源于stack exchange,提问作者Atilio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:33:25