4.使用预训练的pytorch网络进行图像分类(代码片段)

程序媛一枚~ 程序媛一枚~     2023-04-03     578

关键词:

4. 使用预训练的PyTorch网络进行图像分类

这篇博客将介绍如何使用PyTorch预先训练的网络执行图像分类。利用这些网络只需几行代码就可以准确地对1000个常见对象类别进行分类。这些图像分类网络是开创性的、最先进的图像分类网络,包括VGG16、VGG19、Inception、DenseNet和ResNet。
这些模型是由负责发明和提出上述新型架构的研究人员训练的。训练完成后,这些研究人员将模型权重保存到磁盘上,然后将其发布给其他研究人员、学生和开发人员,供他们学习并在自己的项目中使用。
虽然模型可以自由使用,但请确保检查了与之相关的任何条款/条件,因为有些模型在商业应用中不能自由使用(AI领域的企业家通常通过训练模型本身而不是使用原始作者提供的预训练权重来绕过这一限制)。

图像分类允许为输入图像指定一个或多个标签,然而它并没有告诉对象在图像中的位置。要确定给定对象在输入图像中的位置,需要应用对象检测。
对象检测可以检测到图像中的对象及其位置;
就像有用于图像分类的预训练网络一样,也有用于目标检测的预训练网络。

下一篇博客将介绍如何使用PyTorch使用专门的对象检测网络检测图像中的对象。

1. 效果图

第一次运行会默认下载模型文件:

densenet121-a639ec97.pth
resnet50-0676ba61.pth
vgg16-397923af.pth
inception_v3_google-0cc3c7bd.pth
vgg19-dcbb9e9d.pth

E:\\mat\\py-demo-22>python classify_image.py --image images/cat.jpg
Downloading: "https://download.pytorch.org/models/vgg16-397923af.pth" to C:\\Users\\Administrator/.cache\\torch\\hub\\checkpoints\\vgg16-397923af.pth

vgg16 效果图如下
可以看到飞机以97.45%的可能性被成功识别,该模型的第二个顶级预测——翼,飞机有翅膀该预测也很准确。

vgg19效果图如下:

inception 效果图如下

densenet 效果图如下
可以看到猫以39.28%的可能性被检测到。

resnet 效果图如下
可以看到第2,3,4也检测的全是猫的品种;

2. 原理

基于预训练网络的PyTorch图像分类

2.1 什么是经过预训练的图像分类网络?

图像分类:没有比ImageNet更著名的数据集/挑战了。ImageNet的目标是将输入图像精确分类为1000个计算机视觉系统日常生活中常见的对象类别。

最流行的深度学习框架,包括PyTorch、Keras、TensorFlow和fast。人工智能和其他技术包括预先训练的网络。这些是计算机视觉研究人员在ImageNet数据集上训练的高度精确、最先进的模型。
在ImageNet上训练完成后,研究人员将其模型保存到磁盘,然后免费发布,供其他研究人员、学生和开发人员学习并在自己的项目中使用。

本文将演示如何使用PyTorch使用以下最先进的分类网络对输入图像进行分类:

  • VGG16
  • VGG19
  • Inception
  • DenseNet
  • ResNet

2.2 环境配置

pip install torch torchvision
pip install opencv-contrib-python

3. 源码

# USAGE
# python classify_image.py --image images/cat.jpg
# python classify_image.py --image images/mg.jpg --model densenet
# 使用PyTorch预训练的网络识别和分类图像


import argparse

import cv2  # opencv绑定
import imutils
import numpy as np  # 数值array计算
import torch  # 使用PyTorch API
# 导入必要的包
from pyimagesearch import config
from torchvision import models  # 包含PyTorch预训练的网络


# 接收输入图像,预处理
def preprocess_image(image):
    # 转换图像色彩空间(BGR--RGB)
    # 等比例缩放,并缩放像素值为[0,1]范围
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (config.IMAGE_SIZE, config.IMAGE_SIZE))
    image = image.astype("float32") / 255.0

    # 减去ImageNet图像均值,除以ImageNet标准偏差,
    # 设置“通道优先”排序,并添加一个维度
    image -= config.MEAN
    image /= config.STD
    image = np.transpose(image, (2, 0, 1))
    image = np.expand_dims(image, 0)

    # 返回预处理后的图像
    return image


# 构建命令行参数及解析
# --image 输入图像路径
# --model PyTorch自带的模型路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
                help="path to the input image")
ap.add_argument("-m", "--model", type=str, default="vgg16",
                choices=["vgg16", "vgg19", "inception", "densenet", "resnet"],
                help="name of pre-trained network to use")
args = vars(ap.parse_args())

# 定义一个模型字典,它将--model命令行参数的名称映射到对应的PyTorch函数
# 字典的键是模型的可读名称,通过--model命令行参数传入。
# 字典的值是相应的PyTorch函数,用于加载模型,并在ImageNet上预先训练权重
# 可选择:VGG16、VGG19、Inception、DenseNet、ResNet
# (如果从未下载过模型权重,则会自动下载并缓存这些权重)
MODELS = 
    "vgg16": models.vgg16(pretrained=True),  # 指定pretrained=True标志指示PyTorch不仅加载模型体系结构定义,还下载模型的预先训练的ImageNet权重。
    "vgg19": models.vgg19(pretrained=True),
    "inception": models.inception_v3(pretrained=True),
    "densenet": models.densenet121(pretrained=True),
    "resnet": models.resnet50(pretrained=True)


# 加载网络,并闪存到当前设备,设置为评估模式
# 指示PyTorch处理特殊层,如退出和批量规范化,这与训练期间处理这些层的方式不同。在进行预测之前,将模型置于评估模式至关重要的
print("[INFO] loading ...".format(args["model"]))
model = MODELS[args["model"]].to(config.DEVICE)
model.eval()

# 从磁盘加载图像,克隆,预处理
print("[INFO] loading image...")
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
orig = image.copy()
image = preprocess_image(image)

# 将图像从NumPy阵列转换为PyTorch张量,传递到当前设备
image = torch.from_numpy(image)
image = image.to(config.DEVICE)

# 加载预处理的ImageNet labels
print("[INFO] loading ImageNet labels...")
imagenetLabels = dict(enumerate(open(config.IN_LABELS, 'r', encoding='utf-8')))

# 执行网络的前向传递,从而产生网络的输出
# 分类图像,提取预测结果
print("[INFO] classifying image with ''...".format(args["model"]))
logits = model(image)
# 通过Softmax函数来获得模型训练时可能用到的1000个类别标签的预测概率。
probabilities = torch.nn.Softmax(dim=-1)(logits)
sortedProba = torch.argsort(probabilities, dim=-1, descending=True)

# 遍历预测结果值,并显示前5个预测结果,关联结果到终端
# 使用imagenetLabels字典查找类标签的名称显示预测概率
for (i, idx) in enumerate(sortedProba[0, :5]):
    print(". : :.2f%".format
          (i, imagenetLabels[idx.item()].strip(),
           probabilities[0, idx.item()] * 100))

# 将最高预测结果绘制在图像上并显示
(label, prob) = (imagenetLabels[probabilities.argmax().item()],
                 probabilities.max().item())
label = str(label).split(":")[1]
cv2.putText(orig, "Label: , :.2f%".format(label.strip(), prob * 100),
            (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.imshow("Classification " + args["model"], orig)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考

获取 torchvision 预训练网络的分类标签

...trainednetworks【发布时间】:2020-06-1714:09:25【问题描述】:Pytorch的torchvision包提供pre-trainedneuralnetworks用于图像分类。我一直在使用以下代码使用Alexnet对图像进行分类(注意:其中一些代码来自 查看详情

使用预训练的 pytorch vgg16 模型及其类进行分类

】使用预训练的pytorchvgg16模型及其类进行分类【英文标题】:Classificationwithpretrainedpytorchvgg16modelanditsclasses【发布时间】:2020-10-1010:05:21【问题描述】:我用pytorch的预训练vgg16模型写了一个图像vgg分类模型。importmatplotlib.pyplotasplti... 查看详情

我应该如何使用预训练模型优化神经网络以进行图像分类

】我应该如何使用预训练模型优化神经网络以进行图像分类【英文标题】:HowshouldIoptimizeneuralnetworkforimageclassificationusingpretrainedmodels【发布时间】:2018-02-2505:47:08【问题描述】:感谢您查看我的问题。我正在尝试根据一些预先训... 查看详情

pytorch预训练集进行训练测试

首先主题:使用pytorch的预训练集来进行训练测试;安装配置环境:直接在GPU上跟着先跑通一遍,能当成一个调包侠。主要是安装一些库,其中最基础的库:mmcv来做底层的运算。下载1000多个类别分类数据集... 查看详情

在预训练的 pytorch 网络中加载单个图像

】在预训练的pytorch网络中加载单个图像【英文标题】:Loadasingleimageinapretrainedpytorchnet【发布时间】:2018-10-0808:45:29【问题描述】:这里的总新手,我正在使用thispytorchSegNet实现和一个“.pth”文件,其中包含来自50个epoch训练的权... 查看详情

pytorch之基于经典网络架构训练图像分类模型(代码片段)

...型,并且直接用训练的好权重当做初始化参数2.参考pytorch官网例子3.设置哪些层需要训练4.优化器设置5.训练模块6.测试模型效果本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052一、模块简单介绍我们... 查看详情

Pytorch 预训练模型中的类数

】Pytorch预训练模型中的类数【英文标题】:TheNumberofClassesinPytorchPretrainedModel【发布时间】:2021-10-2900:08:20【问题描述】:我想使用Pytorch中的预训练模型在自己的数据集中进行图像分类,但是我应该如何在冻结特征提取层的参数... 查看详情

pytorch学习01-训练图像分类器(代码片段)

...据测试网络总结前言  提示:本篇博客主要是记录pytorch的学习过程,当作是一个笔记来使用。  本篇内容:训练图像分类器,步骤如下:1.使用torchvision加 查看详情

为啥我的 CNN 预训练图像分类器过拟合?

...【发布时间】:2020-01-2410:05:46【问题描述】:我刚刚开始使用计算机视觉,在当前任务中我将图像分为4个类别。图片文件总数=1043我正在使用预训练的InceptionV3并在我的数据集上对其进行微调。这是我在时代之后所拥有的:纪元1... 查看详情

pytorch从头搭建并训练一个神经网络模型(图像分类cnn)(代码片段)

...多稍微修改下源码的接口满足自己的需求。还从来没有用PyTorch从头搭建并训练一个模型出来。正好最近在较为系统地学PyTorch,就总结一下如何从头搭建并训练一个神经网络模型。1.使用torchvision加载数据集并做预处理我们使... 查看详情

六pytorch进阶训练技巧(代码片段)

六、PyTorch进阶训练技巧文章目录六、PyTorch进阶训练技巧1.自定义损失函数1.1.函数定义1.2.类定义1.2.1.DiceLoss1.2.2.DiceBCELoss1.2.3.IoULoss1.2.4.FocalLoss2.动态调整学习率2.1.使用官方提供的scheduler2.2.自定义scheduler3.模型微调-torchvision3.1使用... 查看详情

5.使用pytorch预先训练的模型执行目标检测(代码片段)

5.使用PyTorch预先训练的网络执行目标检测这篇博客将介绍如何使用PyTorch预训练的网络执行目标检测,这些网络是开创性的、最先进的图像分类网络,包括使用ResNet的更快R-CNN、使用MobileNet的更快R-CNN和RetinaNet。具有ResNet50... 查看详情

pytorch学习笔记第五篇——训练分类器(代码片段)

文章目录1.数据2.训练图像分类器2.1加载并标准化CIFAR102.2训练图像3.定义卷积神经网络、损失函数、优化器、训练网络和保存模型4.测试自己的模型5.在GPU上进行训练1.数据通常,当您必须处理图像,文本,音频或视频... 查看详情

加载pytorch中的预训练模型及部分结构的导入(代码片段)

torchvision.modelmodel子包中包含了用于处理不同任务的经典模型的定义,包括:图像分类、像素级语义分割、对象检测、实例分割、人员关键点检测和视频分类。图像分类:语义分割: 对象检测、实例分割和人员关键点检测:&n... 查看详情

[pytorch系列-67]:生成对抗网络gan-图像生成开源项目pytorch-cyclegan-and-pix2pix-使用预训练模型进行测试pix2pix模型(代码片段)

...HiWangWenBing/article/details/122030093目录第1步:下载或克隆pytorch-CycleGAN-and-pix2pix所有代码第2步:切换当前目录第3步:安装依赖文件:第4步:下载pix2pix数据集第5步:下载预训练模型第6步:训练模型第7步... 查看详情

[pytorch系列-72]:生成对抗网络gan-图像生成开源项目pytorch-cyclegan-and-pix2pix-使用预训练模型训练cyclegan模型(代码片段)

...本思路1.3训练方式第2章测试步骤第1步:下载或克隆pytorch-CycleGAN-and-pix2pix所有代码第2步:切换当前目录第3步:安装依赖文件(可视化工具)第4步:下载CycleGAN数据集第5步:下载预训练模型第6步:... 查看详情

pytorch深度学习实战|搭建卷积神经网络进行图像分类与图像风格迁移

PyTorch是当前主流深度学习框架之一,其设计追求最少的封装、最直观的设计,其简洁优美的特性使得PyTorch代码更易理解,对新手非常友好。本文为实战篇,介绍搭建卷积神经网络进行图像分类与图像风格迁移。1... 查看详情

使用pytorch框架自己制作做数据集进行图像分类(代码片段)

第一章:Pytorch制作自己的数据集实现图像分类第一章:Pytorch框架制作自己的数据集实现图像分类第二章:Pytorch框架构建残差神经网络(ResNet)第三章:Pytorch框架构建DenseNet神经网络提示:本文代码,含有部... 查看详情