# 算法文件说明

自定义算法支持用户将自己的算法文件包经过压缩上传到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平台下载数据集,只要图片上包含您需要的类别,就会被下载,该图片上可能会同时存在其他类别标签。因此,如果您只是想训练特定类别,需要筛选。

上次更新: 5/6/2021, 7:57:44 PM