使用VGGNet、ResNet、Inception和Xception分类图像

一、简介

  1. VGGNet
    2014年。该网络使用3×3卷积核的卷积层堆叠并交替最大池化层,有两个4096维的全连接层,然后是softmax分类器。16和19分别代表网络中权重层的数量。
  2. ResNet
    2015年。该网络使用残差模块来组成更复杂的网络(网络中的网络),使用标准随机梯度下降法训练。与VGG相比,ResNet更深,但是由于使用全局平均池操作而不是全连接密集层,所以模型的尺寸更小。
  3. Inception
    2015年。该网络使用多个尺度的卷积核提取特征,并在同一模块中同时计算1×1、3×3、5×5卷积,然后将这些滤波器的输出沿通道维度堆叠并传递到下一层。
    Inception-v4编写于2016年。
  4. Xception
    2016年。该网络是Inception网络的扩展,使用了深度可分离卷积运算。其参数数量与Inception-v3相同,由于更高效地利用模型参数,该网络性能获得提升并在大型图像分类数据集胜过Inception-v3。

二、代码

import numpy as np
from PIL import Image
from matplotlib.pyplot import imshow
from keras.applications import VGG16
from keras.applications import VGG19
from keras.applications import ResNet50
from keras.applications import InceptionV3
from keras.applications import Xception
from keras.applications import imagenet_utils
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array

MODELS = {
    "vgg16": (VGG16, (224, 224)),
    "vgg19": (VGG19, (224, 224)),
    "inception": (InceptionV3, (299, 299)),
    "xception": (Xception, (299, 299)),
    "resnet": (ResNet50, (224, 224))
}


def image_load_and_convert(image_path, model_name):
    pil_im = Image.open(image_path, 'r')
    imshow(np.asarray(pil_im))
    inputShape = MODELS[model_name][1]
    preprocess = imagenet_utils.preprocess_input
    image = load_img(image_path, target_size=inputShape)
    image = img_to_array(image)
    image = np.expand_dims(image, axis=0)
    image = preprocess(image)
    return image


def classify_image(image_path, model_name):
    img = image_load_and_convert(image_path, model_name)
    Network = MODELS[model_name][0]
    model = Network(weights="imagenet")
    preds = model.predict(img)
    P = imagenet_utils.decode_predictions(preds)
    print(model_name)
    for (i, (imagenetID, label, prob)) in enumerate(P[0]):
        print("{}. {}: {:.2f}%".format(i + 1, label, prob * 100))


# classify_image("lesser_panda.jpg", "vgg16")
classify_image("lesser_panda.jpg", "vgg19")
classify_image("lesser_panda.jpg", "inception")
classify_image("lesser_panda.jpg", "xception")
classify_image("lesser_panda.jpg", "resnet")

使用VGGNet、ResNet、Inception和Xception分类图像_第1张图片

三、结果

Inception和Xception会预测成别的东西。

vgg16
1. lesser_panda: 100.00%
2. titi: 0.00%
3. giant_panda: 0.00%
4. indri: 0.00%
5. gibbon: 0.00%

vgg19
1. lesser_panda: 100.00%
2. giant_panda: 0.00%
3. howler_monkey: 0.00%
4. red_fox: 0.00%
5. American_black_bear: 0.00%

inception
1. stopwatch: 100.00%
2. web_site: 0.00%
3. bow: 0.00%
4. stole: 0.00%
5. coffeepot: 0.00%

xception
1. ping-pong_ball: 46.78%
2. necklace: 16.60%
3. military_uniform: 8.55%
4. buckle: 6.82%
5. bib: 6.74%

resnet
1. lesser_panda: 99.99%
2. giant_panda: 0.01%
3. titi: 0.00%
4. polecat: 0.00%
5. marmoset: 0.00%

你可能感兴趣的:(Python,机器学习,Keras)