Skip to content

3.2.1 图像识别评估系统交互流程设计

1.导入库

python
import onnxruntime as ort
import numpy as np
import scipy.special
from PIL import Image
  • onnxruntime : 用于加载和运⾏ 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 个预测结果,包括类别名称和概率值

人机交互的最优方式

  1. 用户界面设计:提供一个简洁直观的用户界面,方便用户上传图片和查看识别结果。

  2. 模型加载:系统启动时预加载模型和标签,减少用户等待时间。

  3. 图像上传与预处理:允许用户上传图片,并自动进行必要的预处理。

  4. 图像识别:后台使用“resnet.onnx”模型处理预处理后的图片。

  5. 结果展示:清晰展示识别结果,包括最可能的类别和概率。

  6. 交互反馈:提供用户反馈选项,以改进模型性能。

  7. 帮助与支持:内置帮助文档和客服支持,提升用户体验。

  8. 性能优化:优化系统响应速度和模型处理能力。

  9. 安全性考虑:确保用户数据安全和隐私保护。

  10. 多语言支持:界面支持多语言,满足全球用户需求。

  11. 可访问性:确保UI无障碍,方便所有用户操作。