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标注文件?
核心是利用标注文件中记录的图片标识(如文件名、相对路径),在训练脚本中匹配图片路径:
- 确认标注文件格式:确保
object_annotations_normalized.jsonl的每条记录包含图片的唯一标识,例如:
{"image_filename": "img_001.jpg", "bboxes": [[x1,y1,x2,y2], ...], "labels": ["cat", ...]}
- 训练脚本中关联:
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
相关产品推荐
相关产品推荐

