Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理)

2024-08-29 06:04

本文主要是介绍Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 简介

2. 解析

2.1 获取标签

2.1.1 载入数据集

2.1.2 标签-Index

2.1.3 保存和读取类别标签

2.2 读取单个图片

2.3 载入模型并推理

2.3.1 tiny-vgg 模型结构

2.3.2 运行推理

 2.4 置信度柱状图

2.5 预测标签

3. 完整代码

4. 总结


1. 简介

本博文在《Vitis AI 基本认知(Tiny-VGG 项目代码详解)-CSDN博客》基础上,详细介绍如何使用TensorFlow框架进行单个图片的推理,从获取和处理数据集的标签开始,到模型的加载与推理,再到结果的可视化展示。关键信息如下:

  • 获取数据集的标签
  • 保存和读取类别标签
  • 加载模型并推理
  • 绘制图像
  • 使用中文标签
  • 置信度柱状图

2. 解析

2.1 获取标签

2.1.1 载入数据集

通过 image_dataset_from_directory 方法

vali_dataset = tf.keras.preprocessing.image_dataset_from_directory('./dataset/class_10_val/val_images/',image_size=(64, 64),batch_size=32)

取出一个图片,并查看其标签:

for images, labels in vali_dataset.take(1):# 取出第一个图片和标签image = images[0].numpy().astype("uint8")label = labels[0].numpy()# 显示图片plt.figure(figsize=(2, 2))plt.imshow(image)plt.title(f"Label: {label}")plt.axis('off')plt.show()

2.1.2 标签-Index

查看类别标签及其 Index:

class_names = vali_dataset.class_namesfor i, class_name in enumerate(class_names):print(f"Class name: {class_name:<4}, Index: {i}")
---
Class name: 咖啡   , Index: 0
Class name: 小熊猫 , Index: 1
Class name: 披萨   , Index: 2
Class name: 救生艇 , Index: 3
Class name: 校车   , Index: 4
Class name: 橙子   , Index: 5
Class name: 灯笼椒 , Index: 6
Class name: 瓢虫   , Index: 7
Class name: 考拉   , Index: 8
Class name: 跑车   , Index: 9

类别标签对应的 one-hot 标签:

for index, class_name in enumerate(class_names):one_hot = tf.one_hot(index, len(class_names)).numpy()print(f"Class: {class_name}, One-hot: {one_hot}")
---
Class: 咖啡  , One-hot: [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
Class: 小熊猫, One-hot: [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
Class: 披萨  , One-hot: [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
Class: 救生艇, One-hot: [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
Class: 校车  , One-hot: [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
Class: 橙子  , One-hot: [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
Class: 灯笼椒, One-hot: [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
Class: 瓢虫  , One-hot: [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
Class: 考拉  , One-hot: [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
Class: 跑车  , One-hot: [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

2.1.3 保存和读取类别标签

将类别标签写入文本文档:

with open('tiny_VGG_class_names.txt', 'w') as file:for class_name in class_names:file.write(f"{class_name}\n")

从文本文档中读取类别标签: 

with open('tiny_VGG_class_names.txt', 'r') as file:class_names = [line.strip() for line in file]print(class_names)
---
['咖啡', '小熊猫', '披萨', '救生艇', '校车', '橙子', '灯笼椒', '瓢虫', '考拉', '跑车']

2.2 读取单个图片

读取图片,并显示在 Jupyter Lab 中:

img = cv2.imread('./dataset/class_10_val/val_images/橙子/val_1067.JPEG')plt.figure(figsize=(2, 2))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

 对图片归一化操作:

normalization_layer = tf.keras.layers.Rescaling(1./255)
img_norm = normalization_layer(img)
img_norm = np.expand_dims(img_norm, axis=0)
np.shape(img_norm)
---
(1, 64, 64, 3)

训练过程中,对数据集做了归一化处理,推理时也要做同样的处理。

2.3 载入模型并推理

2.3.1 tiny-vgg 模型结构

# Create an instance of the model
filters = 10
tiny_vgg = Sequential([Conv2D(filters, (3, 3), input_shape=(64, 64, 3), name='conv_1_1'),Activation('relu', name='relu_1_1'),Conv2D(filters, (3, 3), name='conv_1_2'),Activation('relu', name='relu_1_2'),MaxPool2D((2, 2), name='max_pool_1'),Conv2D(filters, (3, 3), name='conv_2_1'),Activation('relu', name='relu_2_1'),Conv2D(filters, (3, 3), name='conv_2_2'),Activation('relu', name='relu_2_2'),MaxPool2D((2, 2), name='max_pool_2'),Flatten(name='flatten'),Dense(NUM_CLASS, activation='softmax', name='output')
])

2.3.2 运行推理

tiny_vgg = tf.keras.models.load_model('trained_vgg_best.h5')
prediction = tiny_vgg.predict(img_norm)
prediction
---
array([[6.2276758e-02, 3.6967881e-03, 9.2534656e-06, 4.8701441e-01,3.6426269e-02, 2.9939638e-02, 7.1093095e-03, 2.9743392e-02,2.1278052e-02, 3.2250613e-01]], dtype=float32)

注意:模型的最后一层已经经过 softmax 计算,无需单独调用 softmax 计算概率:

sum = np.sum(prediction)
print(sum)
---
1.0

 2.4 置信度柱状图

fig = plt.figure(figsize=(18,6))# 绘制左图-预测图,调整比例
ax1 = plt.subplot(1,6,1)
ax1.imshow(img)
ax1.axis('off')# 绘制右图-柱状图,调整比例
ax2 = plt.subplot(1,6,(2,6))
y = prediction[0]
ax2.bar(class_names, y, alpha=0.5, width=0.3, color='yellow', edgecolor='red', lw=3)
ax2.set_xticks(x)
ax2.set_xticklabels(class_names, fontproperties=font)
plt.ylim([0, 1.0]) # y轴取值范围# 显示置信度数值
for i in range(len(y)):plt.text(i, y[i] + 0.01, f'{y[i]:.2f}', ha='center', fontsize=15)plt.xlabel('类别', fontsize=20, fontproperties=font)
plt.ylabel('置信度', fontsize=20, fontproperties=font)
ax2.tick_params(labelsize=16)plt.tight_layout()

2.5 预测标签

predict_label = class_names[np.argmax(prediction)]
print("类别: {}".format(predict_label))# 显示图片
plt.figure(figsize=(2, 2))
plt.imshow(img)
plt.axis('off')
plt.show()

3. 完整代码

import tensorflow as tf
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import cv2font = matplotlib.font_manager.FontProperties(fname="./SimHei.ttf")vali_dataset = tf.keras.preprocessing.image_dataset_from_directory('./dataset/class_10_val/val_images/',image_size=(64, 64),batch_size=32)class_names = vali_dataset.class_namesimg = cv2.imread('./dataset/class_10_train/橙子/n07747607_0.JPEG')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)tiny_vgg = tf.keras.models.load_model('trained_vgg_best.h5')prediction = tiny_vgg.predict(img_norm)fig = plt.figure(figsize=(18,6))# 绘制左图-预测图,调整比例
ax1 = plt.subplot(1,6,1)
ax1.imshow(img)
ax1.axis('off')# 绘制右图-柱状图,调整比例
ax2 = plt.subplot(1,6,(2,6))
y = prediction[0]
ax2.bar(class_names, y, alpha=0.5, width=0.3, color='yellow', edgecolor='red', lw=3)
ax2.set_xticks(x)
ax2.set_xticklabels(class_names, fontproperties=font)
plt.ylim([0, 1.0]) # y轴取值范围# 显示置信度数值
for i in range(len(y)):plt.text(i, y[i] + 0.01, f'{y[i]:.2f}', ha='center', fontsize=15)plt.xlabel('类别', fontsize=20, fontproperties=font)
plt.ylabel('置信度', fontsize=20, fontproperties=font)
ax2.tick_params(labelsize=16)plt.tight_layout()

4. 总结

本博文详继续介绍 Tiny-VGG 项目,对模型进行单张图片的推理,关键要点包括:

1). 数据处理与标签管理:通过 image_dataset_from_directory 方法加载数据,并提取类别名称作为标签,同时展示了如何保存和读取类别标签到/从文本文件。

2). 图片预处理:读取单个图片,并对其进行归一化处理,以匹配训练时的数据处理方式,确保模型能正确解读输入数据。

3). 模型加载与推理:加载预训练的Tiny-VGG模型,并对单张图片进行推理,获取预测结果。

4). 结果可视化:通过绘制图片和置信度柱状图来可视化模型的预测结果,使用中文标签和显示每个类别的置信度值。

5). 实用代码示例:提供了完整的代码示例,包括数据加载、模型推理和结果展示,方便读者理解和实际操作。
 

这篇关于Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息