1. 程式人生 > >使用keras內建的模型進行圖片預測

使用keras內建的模型進行圖片預測

keras 模組裡面為我們提供了一個預訓練好的模型,也就是開箱即可使用的影象識別模型
趁著國慶假期有時間我們就來看看這個預訓練模型如何使用吧

可用的模型有哪些?

根據官方文件目前可用的模型大概有如下幾個

  1. VGG16
  2. VGG19
  3. ResNet50
  4. InceptionResNetV2
  5. InceptionV3
    它們都被整合到了keras.applications 中

模型檔案從哪來

當我們使用了這幾個模型時,keras就會去自動下載這些已經訓練好的模型儲存到我們本機上面
模型檔案會被下載到 ~/.keras/models/並在載入模型時自動載入
各個模型的資訊:
models

如何使用預訓練模型

使用大致分為三個步驟

  1. 匯入所需模組
  2. 找一張你想預測的影象將影象轉為矩陣
  3. 將影象矩陣放到模型中進行預測

關於影象矩陣的大小

VGG16,VGG19,ResNet50 預設輸入尺寸是224x224
InceptionV3, InceptionResNetV2 模型的預設輸入尺寸是299x299

程式碼demo

假設我現在有一張圖片
在這裡插入圖片描述

我需要使用預訓練模型來識別它
那我們就按照上面的步驟

第一步匯入模組

from keras.applications import VGG16
from keras.applications import VGG19
from keras.applications import ResNet50
from keras.applications import InceptionV3
from keras.applications import InceptionResNetV2

第二步將影象轉為矩陣
這裡我們需要使用 keras.preprocessing.image 裡面 img_to_array 來幫我們轉

 image = cv2.imread(img)
 image = cv2.resize(image, self.dim)
 image = img_to_array(image)
  image = np.expand_dims(image, axis=0)

第三步 將影象矩陣丟到模型中進行預測

predict = model.predict(preprocess)
decode_predict = decode_predictions(predict)

完整程式碼如下

  1. 配置檔案
  2. 獲取配置檔案的模組
  3. 影象預測模組

配置檔案

[image]
image_path=/home/fantasy/Pictures/cat.jpg
[model]
model=vgg16
[weights]
weight=imagenet

獲取配置檔案的模組

import configparser

cf = configparser.ConfigParser()

cf.read("configs.cnf")

def getOption(section, key):
    
    return cf.get(section, key)

影象預測模組以及主要實現

# keras 提供了一些預訓練模型,也就是開箱即用的 已經訓練好的模型
# 我們可以使用這些預訓練模型來進行影象識別,目前的預訓練模型大概可以識別2.2w種類型的東西
# 可用的模型:
# VGG16
# VGG19
# ResNet50
# InceptionResNetV2
# InceptionV3 
# 這些模型被整合到 keras.applications 中
# 當我們使用了這些內建的預訓練模型時,模型檔案會被下載到 ~/.keras/models/並在載入模型時自動載入
# VGG16,VGG19,ResNet50 預設輸入尺寸是224x224
# InceptionV3, InceptionResNetV2 模型的預設輸入尺寸是299x299

# 使用內建的預訓練模型的步驟
# step1 匯入需要的模型
# step2 將需要識別的影象資料轉換為矩陣(矩陣的大小需要根據模型的不同而定)
# step3 將影象矩陣丟到模型裡面進行預測
# ----------------------------------------------------------------------------------
# step1 
import cv2
import numpy as np
from getConfig import getOption
from keras.applications import VGG16
from keras.applications import VGG19
from keras.applications import ResNet50
from keras.applications import InceptionV3
from keras.applications import InceptionResNetV2
from keras.applications import imagenet_utils
from keras.applications.imagenet_utils import decode_predictions
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.inception_v3 import preprocess_input


class ImageTools(object):
    """
    使用keras預訓練模型進行影象識別
    """
    def __init__(self, img, model, w):
        self.image = img
        self.model = model
        self.weight = w
        
    # step2
    def image2matrix(self, img):
        """
        將影象轉為矩陣
        """
        image = cv2.imread(img)
        image = cv2.resize(image, self.dim)
        image = img_to_array(image)
        image = np.expand_dims(image, axis=0)
        return image

    @property
    def dim(self):
        """
        影象矩陣的維度
        """
        if self.model in ["inceptionv3", "inceptionresnetv2"]:
            shape = (299, 299)
        else:
            shape = (224, 224)

        return shape

    @property
    def Model(self):
        """
        模型
        """
        models = {
            "vgg16": VGG16,
            "vgg19": VGG19,
            "resnet50": ResNet50,
            "inceptionv3": InceptionV3,
            "inceptionresnetv2": InceptionResNetV2
        }

        return models[self.model]

    # step3 
    def prediction(self):
        """
        預測
        """
        model = self.Model(weights=self.weight)
        if self.model in ["inceptionv3", "inceptionresnetv2"]:
            preprocess = preprocess_input(self.image2matrix(self.image))
        else:
            preprocess = imagenet_utils.preprocess_input(self.image2matrix(self.image))

        predict = model.predict(preprocess)

        decode_predict = decode_predictions(predict)

        for (item, (imgId, imgLabel, proba)) in enumerate(decode_predict[0]):
            print("{}, {}, {:.2f}%".format(item + 1, imgLabel, proba * 100))


if __name__ == "__main__":
    image = getOption("image", "image_path")
    model = getOption("model", "model")
    weight = getOption("weights", "weight")
    tools = ImageTools(image, model, weight)
    tools.prediction()

執行起來時會將模型檔案下載到本機,因此第一次執行會比較久(有可能出現的情況就是下載不了,被牆了)
在這裡插入圖片描述

我們來看看使用VGG16的模型預測輸出的效果如何
在這裡插入圖片描述

最後如果大家需要使用其他模型時修改 配置檔案的model 即可

以上就是keras預訓練模型的使用啦,最後祝大家國慶節玩的愉快~
在這裡插入圖片描述