MindSpore-Model-Development/tutorials/inference_CN.md

4.9 KiB
Raw Permalink Blame History

图像分类预测

下载Notebook

本教程介绍如何在MindCV中调用预训练模型在测试图像上进行分类预测。

模型加载

查看全部可用的网络模型

通过调用mindcv.models中的registry.list_models函数可以打印出全部网络模型的名字一个网络在不同参数配置下的模型也会分别打印出来例如resnet18 / resnet34 / resnet50 / resnet101 / resnet152。

import sys
sys.path.append("..")
from mindcv.models import registry
registry.list_models()
['BiTresnet50',
 'RepMLPNet_B224',
 'RepMLPNet_B256',
 'RepMLPNet_D256',
 'RepMLPNet_L256',
 'RepMLPNet_T224',
 'RepMLPNet_T256',
 'convit_base',
 'convit_base_plus',
 'convit_small',
 ...
 'visformer_small',
 'visformer_small_v2',
 'visformer_tiny',
 'visformer_tiny_v2',
 'vit_b_16_224',
 'vit_b_16_384',
 'vit_b_32_224',
 'vit_b_32_384',
 'vit_l_16_224',
 'vit_l_16_384',
 'vit_l_32_224',
 'xception']

加载预训练模型

我们以resnet50模型为例介绍两种使用mindcv.modelscreate_model函数进行模型checkpoint加载的方法。 1). 当接口中的pretrained参数设置为True时可以自动下载网络权重。

from mindcv.models import create_model
model = create_model(model_name='resnet50', num_classes=1000, pretrained=True)
# 切换网络的执行逻辑为推理场景
model.set_train(False)
102453248B [00:16, 6092186.31B/s]

ResNet<
  (conv1): Conv2d<input_channels=3, output_channels=64, kernel_size=(7, 7), stride=(2, 2), pad_mode=pad, padding=3, dilation=(1, 1), group=1, has_bias=False, weight_init=normal, bias_init=zeros, format=NCHW>
  (bn1): BatchNorm2d<num_features=64, eps=1e-05, momentum=0.9, gamma=Parameter (name=bn1.gamma, shape=(64,), dtype=Float32, requires_grad=True), beta=Parameter (name=bn1.beta, shape=(64,), dtype=Float32, requires_grad=True), moving_mean=Parameter (name=bn1.moving_mean, shape=(64,), dtype=Float32, requires_grad=False), moving_variance=Parameter (name=bn1.moving_variance, shape=(64,), dtype=Float32, requires_grad=False)>
  (relu): ReLU<>
  (max_pool): MaxPool2d<kernel_size=3, stride=2, pad_mode=SAME>
  ...
  (pool): GlobalAvgPooling<>
  (classifier): Dense<input_channels=2048, output_channels=1000, has_bias=True>
  >

2). 当接口中的checkpoint_path参数设置为文件路径时,可以从本地加载后缀为.ckpt的模型参数文件。

from mindcv.models import create_model
model = create_model(model_name='resnet50', num_classes=1000, checkpoint_path='./resnet50_224.ckpt')
# 切换网络的执行逻辑为推理场景
model.set_train(False)

数据准备

构造数据集

这里我们下载一张Wikipedia的图片作为测试图片使用mindcv.data中的create_dataset函数,为单张图片构造自定义数据集。

from mindcv.data import create_dataset
num_workers = 1
# 数据集目录路径
data_dir = "./data/"
dataset = create_dataset(root=data_dir, split='test', num_parallel_workers=num_workers)
# 图像可视
from PIL import Image
Image.open("./data/test/dog/dog.jpg")

png

数据集的目录结构如下:

data/
└─ test
    ├─ dog
    │   ├─ dog.jpg
    │   └─ ……
    └─ ……

数据预处理

通过调用create_transforms函数获得预训练模型使用的ImageNet数据集的数据处理策略(transform list)。

我们将得到的transform list传入create_loader函数,指定batch_size=1和其他参数,即可完成测试数据的准备,返回Dataset Object作为模型的输入。

from mindcv.data import create_transforms, create_loader
transforms_list = create_transforms(dataset_name='imagenet', is_training=False)
data_loader = create_loader(
        dataset=dataset,
        batch_size=1,
        is_training=False,
        num_classes=1000,
        transform=transforms_list,
        num_parallel_workers=num_workers
    )

模型推理

将自定义数据集的图片传入模型,获得推理的结果。这里使用mindspore.opsSqueeze函数去除batch维度。

import mindspore.ops as P
import numpy as np
images, _ = next(data_loader.create_tuple_iterator())
output = P.Squeeze()(model(images))
pred = np.argmax(output.asnumpy())
with open("imagenet1000_clsidx_to_labels.txt") as f:
    idx2label = eval(f.read())
print('predict: {}'.format(idx2label[pred]))
predict: Labrador retriever