Appearance
3.2.1 图像识别评估系统交互流程设计
1.导入库
python
import onnxruntime as ort
import numpy as np
import scipy.special
from PIL import Imageonnxruntime: 用于加载和运⾏ ONNX 模型numpy: 用于数值计算和数组操作scipy.special: 提供特殊数学函数,这里使用softmax PIL.Image: Python 图像处理库
2.图像预处理函数
python
def preprocess_image(image, resize_size=256, crop_size=224, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):定义预处理函数,参数:
- image : 输入的 PIL 图像
- resize_size=256 : 先调整到的尺⼨
- crop_size=224 : 最终裁剪的尺⼨
- mean : 各通道的均值,⽤于归⼀化
- std : 各通道的标准差,⽤于归⼀化
python
image = image.resize((resize_size, resize_size), Image.BILINEAR)将图像缩放到 256×256 像素,使⽤双线性插值
python
w, h = image.size
left = (w - crop_size) / 2
top = (h - crop_size) / 2
image = image.crop((left, top, left + crop_size, top + crop_size))计算中心裁剪位置并裁剪出 224×224 区域
python
image = np.array(image).astype(np.float32)将图像转换为 numpy 数组并转为 float32 类型
python
image = image / 255.0
image = (image - mean) / std将像素值归⼀化到 [0,1] ,然后⽤ ImageNet 的均值和标准差标准化
python
image = np.transpose(image, (2, 0, 1))
image = image.reshape((1,) + image.shape)将通道维度移到前⾯ (C,H,W) ,然后添加 batch 维度 (1,C,H,W)
python
return image返回处理后的图像张量
3.加载模型
python
session = ort.InferenceSession('resnet.onnx')创建 ONNX 运⾏时会话,加载 resnet.onnx 模型
4.加载类别标签
python
labels_path = 'labels.txt'
with open(labels_path) as f:
labels = [line.strip() for line in f.readlines()]读取 labels.txt ⽂件,每⾏⼀个类别标签,存入列表
5.获取输入输出名称
python
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name获取模型输入和输出的名称,⽤于后续推理
6.加载测试图像
python
image = Image.open('img_test.jpg').convert('RGB')打开 img_test.jpg 并转换为 RGB 格式
7.预处理图像
python
processed_image = preprocess_image(image)
processed_image = processed_image.astype(np.float32)调⽤预处理函数,并确保数据类型为 float32
8.模型推理
python
output = session.run([output_name], {input_name: processed_image})[0]运⾏模型推理,输入处理后的图像,获取输出结果
9.计算概率
python
probabilities = scipy.special.softmax(output, axis=-1)对输出应⽤ softmax 函数,得到各类别的概率分布
10.获取 Top5 结果
python
top5_idx = np.argsort(probabilities[0])[-5:][::-1]
top5_prob = probabilities[0][top5_idx]- 对概率排序,获取前 5 个最⼤值的索引 ( 降序 )
- 获取对应的概率值
11.打印结果
python
print("Top 5 predicted classes:")
for i in range(5):
print(f"{i+1}: {labels[top5_idx[i]]} - Probability: {top5_prob[i]}")按概率从⾼到低打印前 5 个预测结果,包括类别名称和概率值
人机交互的最优方式
用户界面设计:提供一个简洁直观的用户界面,方便用户上传图片和查看识别结果。
模型加载:系统启动时预加载模型和标签,减少用户等待时间。
图像上传与预处理:允许用户上传图片,并自动进行必要的预处理。
图像识别:后台使用“resnet.onnx”模型处理预处理后的图片。
结果展示:清晰展示识别结果,包括最可能的类别和概率。
交互反馈:提供用户反馈选项,以改进模型性能。
帮助与支持:内置帮助文档和客服支持,提升用户体验。
性能优化:优化系统响应速度和模型处理能力。
安全性考虑:确保用户数据安全和隐私保护。
多语言支持:界面支持多语言,满足全球用户需求。
可访问性:确保UI无障碍,方便所有用户操作。