# 算法文件说明
自定义算法支持用户将自己的算法文件包经过压缩上传到Octopus平台,且算法文件包需要满足一定要求,请详细阅读本节,有助于您快速完成算法开发和上传。若您使用自定义引擎进行算法开发,可跳过本节,并根据实际需要编写算法文件。
# 前提条件
自定义算法包中的自定义算法及其相关脚本文件,均需基于Tensorflow或PyTorch引擎框架编写。
# 算法文件基本要求
算法文件“.zip”目录结构可参考如下,需要包括启动文件“Train.py”(启动文件名可自定义),以及一些必要的训练文件。若除了使用到Tensorflow或PyTorch原生的算法,还使用了第三方的库,则需要添加相应的依赖到算法文件中。
.
├─ xxx #算法名
├─ 算法文件 #包含用户编写的一些算法文件(必选)
├─ Train.py #启动文件(必选,名称可自定义)
├─ requirements.txt #pip类依赖(可选)
├─ 可编译依赖1 #需要编译的依赖1(可选)
├─ 可编译依赖2 #需要编译的依赖2(可选)
├─ Model_file #模型包文件(名称可自定义)
├─ customer_auto_label.py #“自动标注”启动文件(如该模型用于自动标注,则必选,名称固定)
├─ customer_inference.py #“模型评估”启动文件(如该模型用于模型评估,则必选,名称固定)
├─ customer_package #自定义库(可选,名称可自定义)
├─ __init__.py #自定义库 -> python库
├─ tensor_define.py #自定义库 -> python库文件
├─ customer_utils.py #自定义脚本1(可选,名称可自定义)
├─ customer_script2.sh #自定义脚本2(可选,名称可自定义)
├─ sub_directory #子文件夹
├─ customer_operation.so #自定义算子库(可选,名称可自定义)
└─ ...
基础算法文件
主要包含用户使用Tensorflow或PyTorch原生的算法库函数,编写的相关算法文件,请将使用到的算法相关文件及文件夹都放置于根目录下;
启动文件
整个算法文件包的启动文件,调用所需算法文件,以及指定数据集格式、路径相关配置项等,可自定义命名为“xxx.py”;
pip类依赖
若使用了第三方的pip类依赖库,需要在“requirements.txt”文件中,编写使用到的pip类库。Octopus平台训练服务使用华为pip源:https://mirrors.huaweicloud.com/python/ (opens new window);
需要编译的依赖
若使用了第三方的需要编译的算法库,需要将其编译好的所有文件放到一个文件夹中,添加到算法文件根目录下;
模型包文件
若使用算法进行在线训练,并最终用于自动标注或模型评估,算法包中需要包括部分必要的模型启动文件和库函数。其中必须包含“自动标注启动文件”和“模型评估启动文件”,其他自定义脚本、自定义库、自定义算子库等请结合实际情况编写。算法输出的模型参数需要加到模型包Model_file中,最终整个模型包文件需要放置到“/home/cache”文件夹下面,同时数据集包含的“classes.txt”也需要拷入“/home/cache”文件夹下面。
算法包的模型文件中,无需包含“.pb”自定义模型,其他具体要求请参见模型文件说明。
注意: Octopus训练服务不支持“apt-get”方式安装依赖,若编写算法有使用到,在算法文件根目录下创建文件夹,将编译好后生成的所有文件放到该文件夹下。
# 算法启动文件说明
Octopus平台使用的数据集为“VOC格式”,在启动文件“xxx.py”中需指定数据集格式、路径等相关参数。Octopus平台生成的数据集包含以下文件:
.
├─ data_file #数据集包
├─ JPEGImages #该数据集包含的JPEG格式图片
├─ Annotations #该数据集包含的标注文件
├─ ImageSets
├─ Main
├─ train.txt #图片文件名分隔符-训练
├─ val.txt #图片文件名分隔符-验证
└─ classes.txt #标注类型
针对以上数据集信息,算法启动文件“xxx.py”中必须包含与数据集相关的配置项,因此启动文件中必须包含如下字段:
#设置工作目录,代码中的相对路径均得相对于该路径,该路径为xxx.py所在的路径
import os
if os.path.abspath("./").split("/")[-1].split("-")[0] != "algorithm":
work_path = os.path.abspath(os.path.dirname(os.path.abspath(__file__)) + os.path.sep + ".")
os.chdir(work_path)
# 下载数据平台数据用于训练
import moxing as mox # 导入下载数据平台数据依赖
def read_class_names(class_name_path):# 解析数据服务Pascal_VOC格式类别信息
name_class = []
with open(class_name_path, 'r') as data:
data_tmp = data.readlines()
if "[" in data_tmp[0]:
tmp = data_tmp[0]
for name in tmp.strip("[").strip("]").split(","):
name = name.strip(" ").strip("'")
name_class.append(name)
else:
for name in data_tmp:
name = name.strip()
name_class.append(name)
return name_class
tmp_url = os.getenv('DLS_DATA_URL') # 获取数据平数据地址
tmp_url = tmp_url.split(",")
data_dir = "/cache/"
data_path_lst = []
data_classes = []
for id, url in enumerate(tmp_url):
if id > 0:
url = "s3:/" + url
data_father_path = os.path.join(data_dir, "data" + str(id))
MKFolderPath(data_father_path)
mox.file.copy_parallel(url, data_father_path)
data_name = os.listdir(data_father_path)[0]
data_path = os.path.join(data_father_path, data_name)
name_file = os.path.join(data_path, "classes.txt")
data_path_lst.append(data_path)
data_classes_tmp = read_class_names(name_file)
data_classes = list(set(data_classes) | set(data_classes_tmp)
# 将选择的数据集均下载于AI引擎,data_path_lst中存放的地址是["/cache/data1/data_name1", "/cache/data2/data_name2", ......],其中data_name1与data_name2对于数据服务Pascal_VOC格式均为VOC,对于自定义上传数据集与上传数据集的名字一致。
# 将算法训练结果封装成模型用于模型评估与自动标注
# 输出的模型需要包含的内容见模型文件部分,模型输出的地址必须是/home/cache
# 添加自定义算法参数
import argparse # 导入添加算法参数依赖
parser = argparse.ArgumentParser()
#将total_epoches添加为自定义算法参数,类型、缺省值、帮助信息等可自定义
parser.add_argument("--total_epoches", type=int, default=3,
help="The value of total epoches.")
args = parser.parse_args()
说明: 从Octopus平台下载数据集,只要图片上包含您需要的类别,就会被下载,该图片上可能会同时存在其他类别标签。因此,如果您只是想训练特定类别,需要筛选。