首页 > 其他分享 >图像分类识别——(3)单张图片的分类识别并显示中文

图像分类识别——(3)单张图片的分类识别并显示中文

时间:2023-02-20 13:55:12浏览次数:44  
标签:plt 置信度 idx img pred 分类 import 识别 单张

本项目的最终实现效果如图:

设置中文显示

中文显示中,大部分步骤和之前相同,只不过导入了一些中文字体库。详细的介绍可以参考之前的文章,这里一些地方就不再详述。

 

# 设置matplotlib中文字体

# # windows操作系统
# plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
# plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

# Mac操作系统,参考 https://www.ngui.cc/51cto/show-727683.html
# 下载 simhei.ttf 字体文件
# !wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220716-mmclassification/dataset/SimHei.ttf

# Linux操作系统,例如 云GPU平台:https://featurize.cn/?s=d7ce99f842414bfcaea5662a97581bd1
# 如果遇到 SSL 相关报错,重新运行本代码块即可
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220716-mmclassification/dataset/SimHei.ttf -O /environment/miniconda3/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/SimHei.ttf
!rm -rf /home/featurize/.cache/matplotlib

import matplotlib
matplotlib.rc("font",family='SimHei') # 中文字体

 

 

 

 

# 对于pillow在图像上写中文的字体,也要进行导入
from PIL import ImageFont, ImageDraw
# 导入中文字体,指定字号
font = ImageFont.truetype('SimHei.ttf', 32)

 

# 导入工具包

 

import os

 

import cv2
from PIL import Image, ImageFont, ImageDraw

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

 

import torch
from torchvision import models
import torch.nn.functional as F
from torchvision import transforms

 

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

 

载入预训练图像分类模型

model = models.resnet18(pretrained=True)

# model = models.resnet152(pretrained=True)

model = model.eval()
model = model.to(device)

 

载入ImageNet 1000图像分类中文标签

 

 

# 这里的标签就换成了中文chinese
df = pd.read_csv('imagenet_class_index.csv')
idx_to_labels = {}
for idx, row in df.iterrows():
idx_to_labels[row['ID']] = [row['wordnet'], row['Chinese']]

 

idx_to_labels

 

 

 

图像预处理

# 测试集图像预处理-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/watermelon1.jpg'
img_path = 'test_img/cat_dog.jpg'

img_pil = Image.open(img_path) # 用 pillow 载入

 

img_pil

 

 

 

 

执行图像分类预测

input_img = test_transform(img_pil).unsqueeze(0).to(device) # 预处理
pred_logits = model(input_img) # 执行前向预测,得到所有类别的 logit 预测分数
pred_softmax = F.softmax(pred_logits, dim=1) # 对 logit 分数做 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.title(img_path, fontsize=30)
plt.xlabel('类别', fontsize=20)
plt.ylabel('置信度', fontsize=20)
plt.tick_params(labelsize=16) # 坐标文字大小

plt.show()

 

 

取置信度最大的 n 个结果

n = 10
top_n = torch.topk(pred_softmax, n) # 取置信度最大的 n 个结果
pred_ids = top_n[1].cpu().detach().numpy().squeeze() # 解析出类别
confs = top_n[0].cpu().detach().numpy().squeeze() # 解析出置信度

 

图像分类结果写在原图上

# opencv不能写中文,这里用pil来写中文
draw = ImageDraw.Draw(img_pil)

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)

# 文字坐标,中文字符串,字体,rgba颜色
draw.text((50, 100 + 50 * i), text, font=font, fill=(255, 0, 0, 1))

 

 

img_pil

 

 

 

# 保存图像
img_pil.save('output/img_pred.jpg')

 

图像和柱状图一起显示

 

fig = plt.figure(figsize=(18,6))

# 绘制左图-预测图
ax1 = plt.subplot(1,2,1)
ax1.imshow(img_pil)
ax1.axis('off')

# 绘制右图-柱状图
ax2 = plt.subplot(1,2,2)
x = df['ID']
y = pred_softmax.cpu().detach().numpy()[0]
ax2.bar(x, y, alpha=0.5, width=0.3, color='yellow', edgecolor='red', lw=3)
plt.ylim([0, 1.0]) # y轴取值范围
plt.xlabel('类别', fontsize=20)
plt.ylabel('置信度', fontsize=20)
ax2.tick_params(labelsize=16) # 坐标文字大小

plt.title('{} 图像分类预测结果'.format(img_path), fontsize=30)

plt.tight_layout()
fig.savefig('output/预测图+柱状图.jpg')

 

 

 

预测结果表格输出

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] # 获取 WordNet
confidence = 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) # 展示预测结果表格

 

 

标签:plt,置信度,idx,img,pred,分类,import,识别,单张
From: https://www.cnblogs.com/yenaibo/p/17137107.html

相关文章

  • 00013.07 内部类概述与分类以及匿名内部类的讲解
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参......
  • 《黑马旅游网》综合案例七 分类展示功能缓存
    对分类数据进行缓存优化分析发现,分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,而且分类的数据不会经常产生变化,所有可以使用redis来缓存这......
  • 模式识别开发之项目---基于opencv的手势识别
    我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序。本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等。废......
  • K8S-pod基础与分类
    一、Pod基础概念1.1Pod基础概念Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大......
  • 从汇编角度识别与还原静态局部变量
    msvcx86.text:00468FC1moveax,largefs:2Ch;这一段代码不知道有啥用,反正每次都会跳入00469033.text:00468FC7movecx,T......
  • 信源分类及数学模型
    本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:​​information-theory​​】,需要的朋友们自取。或者关注公众号......
  • 非关系型数据库的产生背景与分类
    1、关系型数据库遇到的问题2008年左右,网站、论坛、社交网络开始高速发展,关系型数据库的地位受到了很大的挑战。关系型数据库的以下问题逐渐凸显:●难以应付每秒上万次的......
  • 【MySQL-索引:分类,语法,性能分析,使用,设计原则】
    零、本文纲要一、索引概述二、索引分类三、索引语法四、SQL性能分析五、索引使用六、索引设计原则tips:Ctrl+F快速定位到所需内容阅读吧。一、索引概述索引(index)是帮助MySQ......
  • 为什么MBR分区表最大只能识别2T硬盘?
    理解这个问题需要的基础知识:1、机械硬盘的结构:盘片、盘面、磁头、磁道、柱面、扇区的概念。2、硬盘的寻址方式:从CHS到LBA。上面的基础知识在网上搜索即得,不赘述了。......
  • 返回关键词对应的分类
     问题:地点中包含的关键词对应的分类放入一个单元格内,并以逗号分隔。函数公式解决:公式一:{=TEXTJOIN(",",1,IFERROR(IF(FIND(B$2:B$5,E2),C$2:C$5),""))}公式二:{=TEXT......