如何配置YOLOv8 yaml文件以访问Azure Blob存储数据集(Azure ML环境)
解决Azure ML SDK v2中YOLOv8无法定位Datastore数据集的问题
核心思路
Azure ML计算节点无法直接访问Blob Datastore的URI,必须通过挂载/下载将数据集映射到计算节点的本地文件系统,再让YOLO的custom.yaml指向这个本地路径。以下是具体操作流程:
步骤1:配置数据集挂载到计算节点
方式一:通过作业Input直接挂载(推荐)
使用Azure ML SDK v2的Input类定义数据集,设置mode="mount",Azure ML会自动将Datastore路径挂载到计算节点的临时目录。
示例代码:
from azure.ai.ml import MLClient, command, Input from azure.identity import DefaultAzureCredential # 初始化MLClient连接工作区 ml_client = MLClient( DefaultAzureCredential(), subscription_id="你的订阅ID", resource_group_name="你的资源组", workspace_name="你的工作区名称" ) # 定义Datastore数据集输入:挂载指定路径 data_input = Input( type="uri_folder", path="azureml://datastores/你的Datastore名称/paths/数据集在Blob中的根目录", # 例如:/yolov8-dataset mode="mount" # 大数据集用mount,小数据集可改用download ) # 定义训练作业 job = command( code="./src", # 本地存放训练脚本、custom.yaml的目录 command="yolo train data=${{inputs.data}}/custom.yaml model=yolov8n.pt epochs=10", inputs={ "data": data_input }, environment="你的YOLOv8环境名称@latest", # 需提前创建包含ultralytics的环境 compute="你的计算集群名称" ) # 提交并监控作业 returned_job = ml_client.jobs.create_or_update(job) ml_client.jobs.stream(returned_job.name)
方式二:在训练脚本中动态修改路径
如果custom.yaml随本地代码上传到作业工作目录,可在脚本中获取挂载路径并自动修改配置:
训练脚本train.py示例:
import yaml import os from ultralytics import YOLO # 获取Azure ML自动设置的挂载路径环境变量 data_mount_path = os.environ.get("AZUREML_DATA_INPUT_data") # 修改custom.yaml的path字段 yaml_config_path = "./custom.yaml" with open(yaml_config_path, "r") as f: config = yaml.safe_load(f) config["path"] = data_mount_path # 替换为计算节点本地的挂载路径 with open(yaml_config_path, "w") as f: yaml.dump(config, f) # 启动训练 model = YOLO("yolov8n.pt") model.train(data=yaml_config_path, epochs=10)
对应的作业command改为:
python train.py
步骤2:确保custom.yaml的路径逻辑正确
无论用哪种方式,custom.yaml中train、val必须是相对于path的相对路径,示例结构:
path: ./ # 若yaml与数据集根目录同级,或改为挂载的绝对路径 train: images/train val: images/val nc: 3 # 你的自定义类别数 names: ["cat", "dog", "bird"]
步骤3:验证挂载有效性
可在训练脚本中添加调试代码,确认数据集是否正确映射:
import os print("数据集挂载路径:", data_mount_path) print("根目录内容:", os.listdir(data_mount_path)) print("训练图像数量:", len(os.listdir(os.path.join(data_mount_path, "images", "train"))))
内容的提问来源于stack exchange,提问作者Alex P
相关产品推荐
相关产品推荐

