如何使用内置算法语义分割在AWS SageMaker上训练的模型上在本地PC上进行推理?

时间:2020-02-26 01:40:49

标签: amazon-sagemaker mxnet gluon

类似于The trained model can be deployed on the other platform without dependency of sagemaker or aws service?的问题。

我已经使用内置算法Semantic Segmentation在AWS SageMaker上训练了一个模型。名为model.tar.gz的经过训练的模型存储在S3上。因此,我想从S3下载此文件,然后使用它在本地PC上进行推理,而不再使用AWS SageMaker。由于内置的​​语义分割算法是使用MXNet Gluon framework and the Gluon CV toolkit构建的,因此,我尝试参考mxnetgluon-cv的文档在本地PC上进行推断。

从S3下载此文件很容易,然后我将该文件解压缩以获得三个文件:

  1. hyperparams.json :包括用于网络体系结构,数据输入和培训的参数。请参阅Semantic Segmentation Hyperparameters
  2. model_algo-1
  3. model_best.params

model_algo-1 model_best.params 都是经过训练的模型,我认为这是net.save_parameters的输出(请参阅Train the neural network )。我也可以使用功能mxnet.ndarray.load加载它们。

请参阅Predict with a pre-trained model。我发现有两个必要的东西:

  1. 重构网络以进行推理。
  2. 加载经过训练的参数。

关于重构网络以进行推理,由于我已经从训练中使用了PSPNet,因此可以使用类gluoncv.model_zoo.PSPNet来重构网络。而且我知道如何使用AWS SageMaker的某些服务(例如批处理转换作业)进行推理。我想在本地PC上重现它。如果我使用类gluoncv.model_zoo.PSPNet来重建网络,则在推理时无法确定该网络的参数是否与AWS SageMaker上使用的参数相同。因为我看不到图像501404015308.dkr.ecr.ap-northeast-1.amazonaws.com/semantic-segmentation:latest的详细信息。

关于加载训练后的参数,我可以使用load_parameters。但是对于 model_algo-1 model_best.params ,我不知道应该使用哪个。

1 个答案:

答案 0 :(得分:0)

以下代码对我来说很好。

import mxnet as mx
from mxnet import image
from gluoncv.data.transforms.presets.segmentation import test_transform
import gluoncv

# use cpu
ctx = mx.cpu(0)

# load test image
img = image.imread('./img/IMG_4015.jpg')
img = test_transform(img, ctx)
img = img.astype('float32')

# reconstruct the PSP network model
model = gluoncv.model_zoo.PSPNet(2)

# load the trained model
model.load_parameters('./model/model_algo-1')

# make inference
output = model.predict(img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()