Keras - 使用 ResNet 模型进行实时预测

  • 简述

    ResNet是一个预训练模型。它是使用ImageNet训练的。在ImageNet上预训练的 ResNet 模型权重。它具有以下语法 -
    
    
    keras.applications.resnet.ResNet50 (
    
       include_top = True, 
    
       weights = 'imagenet', 
    
       input_tensor = None, 
    
       input_shape = None, 
    
       pooling = None, 
    
       classes = 1000
    
    )
    
    
    说明
    • include_top指的是网络顶部的全连接层。
    • weights是指 ImageNet 上的预训练。
    • input_tensor是指可选的 Keras 张量,用作模型的图像输入。
    • input_shape是指可选的形状元组。此模型的默认输入大小为 224x224。
    • classes是指可选数量的类来对图像进行分类。
    让我们通过写一个简单的例子来理解模型 -
  • 第一步:导入模块

    让我们加载必要的模块,如下所示 -
    
    
    >>> import PIL 
    
    >>> from keras.preprocessing.image import load_img 
    
    >>> from keras.preprocessing.image import img_to_array 
    
    >>> from keras.applications.imagenet_utils import decode_predictions 
    
    >>> import matplotlib.pyplot as plt 
    
    >>> import numpy as np 
    
    >>> from keras.applications.resnet50 import ResNet50 
    
    >>> from keras.applications import resnet50
    
    
  • 第 2 步:选择输入

    让我们选择一个输入图像,Lotus,如下所示 -
    
    
    >>> filename = 'banana.jpg' 
    
    >>> ## load an image in PIL format 
    
    >>> original = load_img(filename, target_size = (224, 224)) 
    
    >>> print('PIL image size',original.size)
    
    PIL image size (224, 224) 
    
    >>> plt.imshow(original) 
    
    <matplotlib.image.AxesImage object at 0x1304756d8> 
    
    >>> plt.show()
    
    
    在这里,我们加载了一个图像(banana.jpg)并显示它。
  • 第 3 步:将图像转换为 NumPy 数组

    让我们将输入Banana转换为 NumPy 数组,以便可以将其传递到模型中进行预测。
    
    
    >>> #convert the PIL image to a numpy array 
    
    >>> numpy_image = img_to_array(original) 
    
    
    
    >>> plt.imshow(np.uint8(numpy_image)) 
    
    <matplotlib.image.AxesImage object at 0x130475ac8> 
    
    
    
    >>> print('numpy array size',numpy_image.shape) 
    
    numpy array size (224, 224, 3) 
    
    
    
    >>> # Convert the image / images into batch format 
    
    >>> image_batch = np.expand_dims(numpy_image, axis = 0) 
    
    
    
    >>> print('image batch size', image_batch.shape) 
    
    image batch size (1, 224, 224, 3)
    
    >>> 
    
    
  • 第 4 步:模型预测

    让我们将输入输入模型以获得预测
    
    
    >>> prepare the image for the resnet50 model >>> 
    
    >>> processed_image = resnet50.preprocess_input(image_batch.copy()) 
    
    
    
    >>> # create resnet model 
    
    >>>resnet_model = resnet50.ResNet50(weights = 'imagenet') 
    
    >>> Downloavding data from https://github.com/fchollet/deep-learning-models/releas
    
    es/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels.h5 
    
    102858752/102853048 [==============================] - 33s 0us/step 
    
    
    
    >>> # get the predicted probabilities for each class 
    
    >>> predictions = resnet_model.predict(processed_image) 
    
    
    
    >>> # convert the probabilities to class labels 
    
    >>> label = decode_predictions(predictions) 
    
    Downloading data from https://storage.googleapis.com/download.tensorflow.org/
    
    data/imagenet_class_index.json 
    
    40960/35363 [==================================] - 0s 0us/step 
    
    
    
    >>> print(label)
    
    
  • 输出

    
    
    [
    
       [
    
          ('n07753592', 'banana', 0.99229723), 
    
          ('n03532672', 'hook', 0.0014551596), 
    
          ('n03970156', 'plunger', 0.0010738898), 
    
          ('n07753113', 'fig', 0.0009359837) , 
    
          ('n03109150', 'corkscrew', 0.00028538404)
    
       ]
    
    ]
    
    
    在这里,模型正确地将图像预测为香蕉。