解读Keras在ImageNet中应用:详解5种图像识别模型
作者头像
  • 爱分析ifenxi
  • 2022-03-15 12:31:24 5

几个月前,我撰写了一篇关于如何利用卷积神经网络(CNN),特别是VGG16,来分类图像的文章。当时,模型需要单独从GitHub仓库下载和安装;但现在,这些模型已经被整合进了Keras包中,因此原来的教程已经不再适用,所以我决定重新撰写一篇新的教程。

在这篇新教程中,你将学会如何编写一个Python脚本,用于对图像进行分类。以下是文章的大致结构:

  1. 简要介绍几种网络架构;
  2. 使用Python编写代码,加载训练好的模型并分类输入图像;
  3. 审查一些示例图像的分类结果。

Keras中的最新深度学习图像分类器

Keras提供了五种可以直接使用的CNN模型:

  1. VGG16
  2. VGG19
  3. ResNet50
  4. Inception V3
  5. Xception

ImageNet简介

ImageNet曾是一个计算机视觉研究项目,旨在为22000种不同的物体打标签和分类。但在讨论深度学习和CNN时,“ImageNet”通常指的是ImageNet大规模视觉识别挑战赛(ILSVRC)。

ILSVRC的目标是训练一个能够准确识别并分类1000种不同物体的模型,该模型使用大约120万张图像进行训练,5万张图像用于验证,10万张图像用于测试。这些分类涵盖了许多日常生活中常见的物品。

VGG16和VGG19

VGG网络架构于2014年首次提出,其特点是使用堆叠的3×3卷积层,通过最大池化来缩小体积,最后是两个4096节点的全连接层和一个softmax分类器。VGG16和VGG19的区别在于它们的权重层数量不同。

尽管VGG16和VGG19在图像分类任务上表现出色,但它们的权重文件较大(分别超过533MB和574MB),这使得部署变得困难。因此,较小规模的网络架构(如SqueezeNet、GoogleNet等)更受欢迎。

ResNet

ResNet的网络结构不同于传统的顺序型网络,它采用了微架构模块(micro-architecture modules),这种模块由一系列微架构单元组成,共同构成了整个网络。ResNet于2015年被引入,并且展示了极深的网络也能通过标准的随机梯度下降法(SGD)进行训练。

Inception V3

Inception V3采用了多级特征提取器的概念,在同一模块内计算1×1、3×3和5×5的卷积。这一架构最初被称为GoogleNet,后续版本则被称为Inception vN,其中N代表Google推出的版本号。

Xception

Xception是Inception架构的一种扩展,使用深度分离卷积替代了标准卷积,从而减少了参数数量。

SqueezeNet

SqueezeNet是一种非常轻量级的网络架构,能够达到与AlexNet相近的精度,而权重文件大小仅为4.9MB。

使用Python和Keras通过VGGNet、ResNet、Inception和Xception对图像进行分类

首先,创建一个名为classify_image.py的文件,并插入以下代码:

```python

导入所需的包

from keras.applications import ResNet50, InceptionV3, Xception, VGG16, VGG19 from keras.applications import imagenetutils from keras.applications.inceptionv3 import preprocessinput from keras.preprocessing.image import imgtoarray, loadimg import numpy as np import argparse import cv2

构建命令行参数解析器

ap = argparse.ArgumentParser() ap.addargument("-i", "--image", required=True, help="path to the input image") ap.addargument("-model", "--model", type=str, default="vgg16", help="name of pre-trained network to use") args = vars(ap.parse_args())

定义一个字典,将模型名映射到对应的类

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

确保提供的模型名有效

if args["model"] not in MODELS.keys(): raise AssertionError("The --model command line argument should be a key in the MODELS dictionary")

初始化输入图像的形状和预处理函数

inputShape = (224, 224) preprocess = imagenetutils.preprocessinput

如果使用InceptionV3或Xception,则需要调整输入形状和预处理函数

if args["model"] in ("inception", "xception"): inputShape = (299, 299) preprocess = preprocess_input

加载网络权重

print("[INFO] loading {}...".format(args["model"])) Network = MODELS[args["model"]] model = Network(weights="imagenet")

加载输入图像并进行预处理

print("[INFO] loading and pre-processing image...") image = loadimg(args["image"], targetsize=inputShape) image = imgtoarray(image) image = np.expand_dims(image, axis=0) image = preprocess(image)

对图像进行分类

print("[INFO] classifying image with '{}'...".format(args["model"])) preds = model.predict(image) P = imagenetutils.decodepredictions(preds)

输出分类结果

for (i, (imagenetID, label, prob)) in enumerate(P[0]): print("{}. {}: {:.2f}%".format(i + 1, label, prob * 100))

使用OpenCV显示分类结果

orig = cv2.imread(args["image"]) (imagenetID, label, prob) = P[0][0] cv2.putText(orig, "Label: {}, {:.2f}%".format(label, prob * 100), (10, 30), cv2.FONTHERSHEYSIMPLEX, 0.8, (0, 0, 255), 2) cv2.imshow("Classification", orig) cv2.waitKey(0) ```

示例分类结果

以下是几个示例分类结果,均使用Keras和TensorFlow后端实现:

  • 使用VGG16分类足球

    • 输出:soccer_ball,精确度为93.43%。
  • 使用VGG19分类汽车

    • 输出:convertible(敞篷车),精确度为91.76%。
  • 使用ResNet分类手枪

    • 输出:revolver(左轮手枪),精确度为69.79%。
  • 使用Inception分类沉船

    • 输出:wreck(沉船),精确度为96.29%。
  • 使用Xception分类桶

    • 输出:barrels(桶),精确度为较高值。

通过这些示例可以看出,使用ImageNet数据集训练的模型能够准确识别大量的日常生活中的物品。希望你能够在自己的项目中使用这些代码。

如果你有兴趣从头开始训练自己的深度学习网络,可以参考我的新书《Deep Learning for Computer Vision with Python》。

总结

在今天的文章中,我们回顾了几种卷积神经网络(CNN)架构,包括VGG16、VGG19、ResNet50、Inception V3和Xception,并探讨了如何使用这些架构对图像进行分类。希望这些内容对你有所帮助。

    本文来源:图灵汇
责任编辑: : 爱分析ifenxi
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
详解解读识别ImageNet模型图像应用Keras
    下一篇