基于 ModelArts 自定义算法实现图片识别

举报
码上开花_Lancer 发表于 2024/05/17 09:38:33 2024/05/17
【摘要】 操作前提使用实验账号进入【实验操作桌面】problem(【实验操作桌面】是什么?) answer(【实验操作桌面】是用户进入华为云云端实验室页面,点击【开始实验】时,系统自动为用户分配的一台供用户进行实验操作的终端设备,该设备预安装了实验所需的软件和工具。) problem(如何进入【实验操作桌面】?) answer(点击【开始实验】之后,进入实验操作页面,左方是实验手册展示区域,右方展示的...

操作前提

使用实验账号进入【实验操作桌面】

problem(【实验操作桌面】是什么?) answer(【实验操作桌面】是用户进入华为云云端实验室页面,点击【开始实验】时,系统自动为用户分配的一台供用户进行实验操作的终端设备,该设备预安装了实验所需的软件和工具。) problem(如何进入【实验操作桌面】?) answer(点击【开始实验】之后,进入实验操作页面,左方是实验手册展示区域,右方展示的是实验拓扑图,实验手册与实验拓扑图之间的菜单栏上有一个小电脑图标,点击该图标即可进入【实验操作界面】。) problem(系统提供的华为云实验账号和真实的华为云账号有什么区别?) answer(华为云实验账号是系统分配给用户进行实验操作的真实的华为云账号,用户可以基于该账号,根据实验手册指导体验华为的云服务,但没有权限使用与当前实验不相关的云服务。)

打开Chrome浏览器,首次可自动登录并进入华为云控制台页面。 注意:如后续关闭浏览器重新登录或自动登录失败,请参考以下步骤,使用实验手册上方的账号信息进行登录,切勿使用您自己的华为云账号。 选择【IAM用户登录】模式,于登录对话框中输入系统为您分配的华为云实验账号和密码登录华为云,如下图所示: image

1. 创建自定义算法

1.1 创建OBS文件目录

  1. 在华为云控制台中,搜索并点击进入OBS控制台。如下图所示: image

  2. 选择左侧菜单栏中的“桶列表”,并点击总览下的“创建桶”。如下图所示: image

  3. 在“创建存储桶”页面中,进行以下配置,其余选项请保持默认。 区域:选择“北京四” image 桶名称:自定义,本例使用“custom-algo” image 桶策略:选择“公共读”,并在弹出提示窗口中点击“确认修改” image

  4. 点击“立即创建”。如下图所示: image 在弹出的提示窗口中点击“确认”。如下图所示: image 创建成功,列表中可看到对应的桶。如下图所示: image

  5. 点击对应桶名,进入详情页。如下图所示: image

  6. 点击“对象”、“新建文件夹”。如下图所示: image 依次创建三个文件夹“data”、“code”、“output”,分别用来存放数据、代码和训练导出的模型。创建完成后如下图所示: image

1.2 订阅数据

  1. 使用浏览器打开以下链接,进入数据详情页。

https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=397ac8b5-6b0e-4023-a67e-5d55ceb0ead7

image

  1. 点击“下载”,进入配置页面。如下图所示: image

  2. 指定存储位置,目标位置选择之前创建的"data"目录。如下图所示: image

  3. 点击“确定”提交后,状态显示“等待中”。如下图所示: image 完成后,可在obs中看到对应的数据。如下图所示: image

1.3 获取并上传代码

  1. 在实验操作桌面中点击右键,打开终端。如下图所示: image

  2. 执行以下命令,下载训练代码。

wget https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/20221018/train.tar.gz

执行结果如下图所示: image

  1. 执行以下命令,解压代码文件。

tar -zxvf train.tar.gz

执行结果如下图所示: image 桌面显示解压后的文件夹。 image

  1. 进入OBS控制台页面,点击进入"code"目录。如下图所示: image

  2. 点击“上传对象”,将桌面train目录直接拖拽至上传窗口。如下图所示: image image 点击“上传”。如下图所示: image 上传成功,看到文件及对应的文件夹。如下图所示: image image

1.4 创建算法

detection(1|8|48|2||10|16|algorithm-custom)

  1. 在华为云控制台中,搜索并进入ModelArts控制台。如下图所示: image

  2. 点击左侧菜单中的“算法管理”,进入“算法管理”界面后,点击“创建”。如下图所示: image

  3. 在创建页面中,进行以下配置。 名称:请使用algorithm-custom,否则无法检测 image 启动方式:选择Pytorch预置镜像 image 代码目录:选择已上传的code下的train目录 启动文件:选择train目录下的run.py文件 image 管道设置: 启动代码run.py中包含data_url和train_url两个参数,分别用来指定输入数据的路径和模型输出的路径。如下图所示: image 输入:参数名称为“data_url”,开启输入约束,输入来源选择“数据存储位置”。 输出:参数名称为“train_url”,获取方式选择“超参”。 image

  4. 点击“提交”,提交自定义算法。如下图所示: image 完成后,如下图所示: image

2. 创建训练作业

2.1 使用自定义算法创建训练作业

detection(1|8|49|2||10|12|Completed|1)

  1. 在算法页面中,点击“创建训练作业”。如下图所示: image

  2. 在创建训练作业页面中,进行以下配置。 名称:自定义,本例使用“job-custom-algo” image 创建方式:保持默认即可 image 训练输入:指定数据存储位置,数据会自动同步至data_url指定的路径 image 选择“data”目录下的“images”目录: image 选择完成后如下图所示: image 训练输出:指定输出路径,后台会自动把train_url对应的数据同步至指定的OBS位置,此处数据存储位置指定为之前创建的OBS“output”文件夹。如下图所示: image 超参:设置 train_epochs 超参,并设置值为2。 本实验因时间限制,将训练轮数设置为2。若实际开发中需要更好的效果,可尝试将训练轮数加大。 image 配置计算资源:选择GPU资源,规格为“GPU:1*NVIDIA-V100(32GB)|CPU:8核 64GB 3200GB”。 image 日志保存路径:开启日志保存开关,路径选择obs桶的"output"文件夹。 image

  3. 点击“提交”。 image 确认信息无误后,点击“确定”即可创建训练作业。 image 创建完成后,点击作业名称,可查看作业详情。如下图所示: image 训练完成,状态显示“已完成”。如下图所示: image 查看对应OBS桶“output”目录下,已有生成日志和模型文件。如下图所示: image

3. 服务部署

3.1 准备推理代码

  1. 在实验操作界面中,点击右键打开终端。如下图所示: image

  2. 执行以下命令,下载推理代码。

wget https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/20221018/deploy.tar.gz

执行结果如下图所示: image

  1. 执行以下命令,解压代码文件。

tar -zxvf deploy.tar.gz

执行结果如下图所示: image 解压后在桌面可看到对应文件夹。如下图所示: image

3.2 上传推理代码至OBS

  1. 打开OBS控制台, 进入“output”下的“model”目录。如下图所示: image

  2. 点击“上传对象”。如下图所示: image

  3. 将deploy文件夹下的内容,鼠标全选中后拖拽至上传窗口。如下图所示: image 上传成功,如下图所示: image 其中customize_service.py为推理程序的主入口,内容如下:

# -*- coding: utf-8 -*-
import os
import sys
import torch
from models.resnet import * 
import numpy as np
import cv2
from collections import OrderedDict
import time
import copy
import datetime
import os
​
from torchvision import transforms
from PIL import Image
from model_service.pytorch_model_service import PTServingBaseService
​
​
class ModelClass(PTServingBaseService):
    def __init__(self, model_name='', model_path=r'./best_model.pth'):
        """
        TODO 请在本方法中添加模型的构建和加载权重的过程,不同模型可根据不同的需要进行自定义修改
        :param model_name: 本参数必须保留,随意传入一个字符串值即可
        :param model_path: 模型所在的路径,比如 xxx/xxx.h5、xxx/xxx.pth,就是模型包里模型的名字
        """
        self.model_name = model_name  # 本行代码必须保留,且无需修改
        self.model_path = model_path  # 本行代码必须保留,且无需修改
​
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
​
        # image transform
        self.transform = transforms.Compose(
                [
                    transforms.Resize((224, 224)),
                    transforms.ToTensor(),
                    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                         std=[0.229, 0.224, 0.225])
                ]
        )
​
        self.model = torch.load(self.model_path).to(self.device)
        self.model.eval()
        #下面这个是我用来分类,展示中文类名的 
        self.label_id_name_dict = {
                "0": "三明治",
                "1": "冰激凌",
                "2": "土豆泥",
                "3": "小米粥",
                "4": "松鼠鱼",
                "5": "烤冷面",
                "6": "玉米饼",
                "7": "甜甜圈",
                "8": "芒果班戟",
                "9": "鸡蛋布丁",
            }
​
    def _preprocess(self, data):
        """
        数据预处理,transform
        """
        preprocessed_data = {}
        for k, v in data.items():
            for file_name, file_content in v.items():
                img = Image.open(file_content)
                img = img.convert('RGB')
                images = self.transform(img)
                images = torch.unsqueeze(images, 0).to(self.device)
                preprocessed_data[k] = images
        return preprocessed_data
​
    def _inference(self, data):
        """
        TODO 请在本函数中实现模型的推理过程,不同模型可根据不同的需要进行自定义修改
        """
        src_img = data['images']  # images是不是很眼熟,我在config.json中定义的request的data里的
​
        # 我的是分类,只返回概率最大的类的中文名
        with torch.no_grad():
            output = self.model(src_img)
        _, pred = output.topk(1, 1, True, True)
​
        result = self.label_id_name_dict[str(pred.cpu().numpy()[0][0])]
        return result

config为API接口输入输出的配置文件:

{
    "model_algorithm": "image_classification",
    "model_type": "PyTorch",
    "runtime": "python3.6",
    "metrics": {
        "f1": 0,
        "accuracy": 0.6253,
        "precision": 0,
        "recall": 0
    },
    "apis": [
        {
            "procotol": "http",
            "url": "/",
            "method": "post",
            "request": {
                "Content-type": "multipart/form-data",
                "data": {
                    "type": "object",
                    "properties": {
                        "images": {"type": "file"}
                    },
                    "required": ["images"]
                }
            },
            "response": {
                "Content-type": "multipart/form-data",
                "data": {
                    "type": "object",
                    "properties": {
                        "result": {"type": "string"}
                    },
                    "required": ["result"]
                }
            }
        }
    ],
    "dependencies": [
        {
            "installer": "pip",
            "packages": [
                {
                    "package_name": "Pillow",
                    "package_version": "5.0.0",
                    "restraint": "ATLEAST"
                }
            ]
        }
    ]
}

models目录下为相关依赖代码: image

3.3 创建AI应用

  1. 进入ModelArts控制台,选择左侧菜单中的“AI应用管理” > “AI应用”,并点击新建AI应用。如下图所示: image

  2. 在创建AI应用页面中,进行以下配置,其余配置请保持默认。 名称:自定义,本例使用“model-custom-algo” 版本:填写0.0.1 image 元模型来源:选择已创建的创建的训练作业 image AI引擎:选择pytorch 1.8 image

  3. 点击“立即创建”。如下图所示: image 提交后,状态显示“导入中”。如下图所示: image 构建成功,状态显示“正常”。如下图所示: image

3.4 部署在线服务

  1. 展开应用标签页,点击“部署-在线服务”。如下图所示: image

  2. 在配置页面中, 名称:自定义,本例使用“service-custom-algo” image 资源池:选择“公共资源池” 选择AI应用及配置:选择“我的AI应用”、“model-custom-algo(同步请求)”、“0.0.1(正常)”“CPU:2核8GB” image

  3. 点击“下一步”。如下图所示: image 点击“提交”。如下图所示: image 点击“查看服务详情”。如下图所示: image 状态显示“部署中”。如下图所示: image 部署成功,状态显示“运行中”。如下图所示: image

4. 上传测试图片并预测

detection(1|8|52|2||10|6)

  1. 在OBS数据目录下,下载任意一张图片。如下图所示: image

  2. 在服务预测界面上传图片,并进行测试。如下图所示:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。