车险理赔机器人模型训练

这里,我们来介绍一下如何使用sagemaker训练一个图片分类模型。共分为以下几步:

建立笔记本

在本教程中,我们将使用图像分类任务来说明如何使用 AutoGluon 的 API。

我们将图像和相应的标签加载到 AutoGluon 中,并使用这些数据获取可对新图像进行分类的神经网络。这与传统的机器学习不同,我们需要手动定义神经网络,然后在训练过程中指定超参数。相反,只需对 AutoGluon 的拟合函数fit进行一次调用,AutoGluon 就会自动训练许多具有不同超参数配置的模型,并返回实现最高精度的模型。

下载数据集

在本教程中,我们将使汽车图像数据集, 该数据集包含 196 类汽车的 16,185 张图像。这些数据分为 8,144 张训练图像和 8,041 张测试图像,其中每个班级大致被分割为 50-50 分。类别通常是在品牌、模型、年份等级,例如 2012 年特斯拉 S 型或 2012 年宝马 M3 轿跑车。

!wget http://imagenet.stanford.edu/internal/car196/cars_train.tgz
!wget http://imagenet.stanford.edu/internal/car196/cars_test.tgz
!wget http://ai.stanford.edu/~jkrause/cars/car_devkit.tgz

数据格式转换

解压缩数据集

if not os.path.exists("devkit"):
    !tar xf car_devkit.tgz
if not os.path.exists("cars_train"):
    !tar xf cars_train.tgz
if not os.path.exists("cars_test"):
    !tar xf cars_test.tgz

读取标注数据

import scipy.io
cars_meta = scipy.io.loadmat('devkit/cars_meta.mat')

转换数据格式

meta = [m[0] for m in cars_meta['class_names'][0]]
for m in meta:
    dirname = "data/train/{}".format(m)
    if not os.path.exists(dirname):
        os.mkdir(dirname)
    dirname = "data/test/{}".format(m)
    if not os.path.exists(dirname):
        os.mkdir(dirname)

可视化数据中的样本

import cv2
import matplotlib.pyplot as plt
img = cv2.imread("data/train/Jeep_Patriot_SUV_2012/00086.jpg")
img[:, :, (0, 1, 2)] = img[:, :, (2, 1, 0)]
ax = plt.imshow(img)

构建训练任务

安装AutoGluon工具包

!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple autogluon==0.0.12 -t package

开始使用AutoGluon工具包,并定义任务

import autogluon as ag
from autogluon import ImageClassification as task
dataset = task.Dataset('data/train')
classifier = task.fit(dataset,
                      net='ResNet50_v1b',
                      batch_size=64,
                      epochs=20,
                      ngpus_per_trial=1,
                      num_trials=1,
                      verbose=True)
if not os.path.exists("models"):
    os.makedirs("models")
classifier.save("models/resnet50_cars-0000.ag")

查看结果

print('Top-1 val acc: %.3f' % classifier.results['best_reward'])
"Top-1 val acc: 0.724"
image_path = 'cars_test/00003.jpg'
img = cv2.imread(image_path)
clsidx, prob, _ = classifier.predict(image_path)
print(clsidx.asscalar(), prob.asscalar(), classes[clsidx.asscalar()])
img[:, :, (0, 1, 2)] = img[:, :, (2, 1, 0)]
ax = plt.imshow(img)

模型部署

import sagemaker
from sagemaker import get_execution_role, local, Model, utils, fw_utils, s3

session = sagemaker.Session()
local_session = local.LocalSession()
bucket = session.default_bucket()
prefix = 'sagemaker/autogluon-image-classification'
region = session.boto_region_name
role = get_execution_role()
client = session.boto_session.client(
    "sts", region_name=region, endpoint_url=utils.sts_regional_endpoint(region)
    )
account = client.get_caller_identity()['Account']
ecr_uri_prefix = utils.get_ecr_image_uri_prefix(account, region)
registry_id = fw_utils._registry_id(region, 'mxnet', 'py3', account, '1.6.0')
registry_uri = utils.get_ecr_image_uri_prefix(registry_id, region)

inference_algorithm_name = 'autogluon-sagemaker-inference'
algorithm_name = inference_algorithm_name
fullname=f"{ecr_uri_prefix}/{algorithm_name}:latest"
sagemaker_model = MXNetModel(model_data=model_data,
                             image=fullname,
                             role=role,
                             sagemaker_session=session,
                             py_version='py3',
                             entry_point='docker/serve.py',
                             framework_version='1.6.0')
predictor = sagemaker_model.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')