ImageNet预训练图像分类模型预测单张图像

2024-01-31 14:44

本文主要是介绍ImageNet预训练图像分类模型预测单张图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导入基础工具包

import osimport cv2import pandas as pd
import numpy as npimport torchimport matplotlib.pyplot as plt
%matplotlib inline

计算设备确定

# 有 GPU 就用 GPU,没有就用 CPU
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

载入预训练模型

from torchvision import models
# 载入预训练图像分类模型model = models.resnet18(pretrained=True) # model = models.resnet152(pretrained=True)
model = model.eval() #将模型设为eval
model = model.to(device)

图像预处理,比较固定的四个部分,其他分类任务也可以用。

四步:

  1. 缩放裁剪
  2. 中心获取
  3. 转为Tensor
  4. 归一化处理:更近似于正态分布,易于神经网络处理。mean、std这六个数也是通用的。
from torchvision import transforms# 测试集图像预处理-RCTN:缩放裁剪、转 Tensor、归一化
test_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

载入图片

# img_path = 'test_img/banana1.jpg'
# img_path = 'test_img/husky1.jpeg'
img_path = 'test_img/basketball_shoe.jpeg'# img_path = 'test_img/cat_dog.jpg'# 用 pillow 载入
from PIL import Image
img_pil = Image.open(img_path)

执行图像分类预测:

input_img = test_transform(img_pil) # 预处理,将图片传入图片与处理的函数

 转换模型所需要的维度:

input_img = input_img.unsqueeze(0).to(device)
input_img.shape

运行后为:

torch.Size([1, 3, 224, 224]),即一张3通道224*224的图片

执行前向预测:
 

# 执行前向预测,得到所有类别的 logit 预测分数
pred_logits = model(input_img) 
pred_logits.shape

结果为:

torch.Size([1, 1000])

利用softmax对分数大小进行比较:

import torch.nn.functional as F
pred_softmax = F.softmax(pred_logits, dim=1) # 对 logit 分数做 softmax 运算
pred_softmax.shape

预测结果分析

对softmax结果画一个柱状图:

plt.figure(figsize=(8,4))x = range(1000)
y = pred_softmax.cpu().detach().numpy()[0]ax = plt.bar(x, y, alpha=0.5, width=0.3, color='yellow', edgecolor='red', lw=3)
plt.ylim([0, 1.0]) # y轴取值范围
# plt.bar_label(ax, fmt='%.2f', fontsize=15) # 置信度数值plt.xlabel('Class', fontsize=20)
plt.ylabel('Confidence', fontsize=20)
plt.tick_params(labelsize=16) # 坐标文字大小
plt.title(img_path, fontsize=25)plt.show()

取置信度最大的n个结果:

n = 10
top_n = torch.topk(pred_softmax, n)
top_n

out:

torch.return_types.topk(
values=tensor([[0.5988, 0.3556, 0.0064, 0.0047, 0.0041, 0.0041, 0.0037, 0.0025, 0.0022,0.0022]], device='cuda:0', grad_fn=<TopkBackward0>),
indices=tensor([[430, 514, 522, 630, 502, 770, 427, 768, 805,  35]], device='cuda:0'))

解析出类别:

# 解析出类别
pred_ids = top_n[1].cpu().detach().numpy().squeeze()
pred_ids

out:

array([430, 514, 522, 630, 502, 770, 427, 768, 805,  35])

如何知道430、514是哪一类?

df = pd.read_csv('imagenet_class_index.csv')

将分类结果写在原图上:

# 用 opencv 载入原图
img_bgr = cv2.imread(img_path)for i in range(n):class_name = idx_to_labels[pred_ids[i]][1] # 获取类别名称confidence = confs[i] * 100 # 获取置信度text = '{:<15} {:>.4f}'.format(class_name, confidence)print(text)# !图片,添加的文字,左上角坐标,字体,字号,bgr颜色,线宽img_bgr = cv2.putText(img_bgr, text, (25, 50 + 40 * i), cv2.FONT_HERSHEY_SIMPLEX, 1.25, (0, 0, 255), 3)# 保存图像
cv2.imwrite('output/img_pred.jpg', img_bgr)# 载入预测结果图像
img_pred = Image.open('output/img_pred.jpg')
img_pred

 

预测结果用表格输出:

pred_df = pd.DataFrame() # 预测结果表格
for i in range(n):class_name = idx_to_labels[pred_ids[i]][1] # 获取类别名称label_idx = int(pred_ids[i]) # 获取类别号wordnet = idx_to_labels[pred_ids[i]][0] # 获取 WordNetconfidence = confs[i] * 100 # 获取置信度pred_df = pred_df.append({'Class':class_name, 'Class_ID':label_idx, 'Confidence(%)':confidence, 'WordNet':wordnet}, ignore_index=True) # 预测结果表格添加一行
display(pred_df) # 展示预测结果表格

 

这篇关于ImageNet预训练图像分类模型预测单张图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664137

相关文章

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O