Appearance
人脸AI智能检测系统交互流程设计
1.导入库
python
import os
import time
import cv2
import numpy as np
import vision.utils.box_utils_numpy as box_utils
import onnxruntime as ortos: ⽤于⽂件和⽬录操作time: ⽤于时间相关操作,这⾥⽤来计算推理时间cv2: OpenCV 库,⽤于图像处理numpy: 数值计算库box_utils: 包含边界框处理⼯具的⾃定义模块onnxruntime: ONNX 模型推理运⾏时
2.预测函数 predict 函数详细解
这个函数⽤于对⽬标检测模型的原始输出进⾏后处理,主要完成以下任务:
函数参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| width | int | 原始图像的宽度(像素) |
| height | int | 原始图像的高度(像素) |
| confidences | np.array | 模型输出的置信度数组(每个边界框的类别概率) |
| boxes | np.array | 模型输出的边界框数组(归⼀化坐标) |
| prob_threshold | float | 置信度阈值,过滤低置信度预测 |
| iou_threshold | float | IoU 阈值,⽤于⾮极⼤值抑制( NMS ) |
| top_k | int | 每个类别保留的最⼤检测框数量 |
函数执行步骤详解
提取单个图像的结果
pythonboxes = boxes[0] confidences = confidences[0]模型输出通常是批量处理结果,这⾥只处理第⼀个图像的结果(假设批大小为 1 )
初始化结果容器
pythonpicked_box_probs = [] # 存储筛选后的边界框和置信度 picked_labels = [] # 存储对应的类别标签便利每个类别(跳过背景类 0)
pythonfor class_index in range(1, confidences.shape[1]):筛选置信度高于阈值的预测
pythonprobs = confidences[:, class_index] # 获取当前类别的所有置信度 mask = probs > prob_threshold # 创建置信度阈值掩码 probs = probs[mask] # 应用掩码筛选置信度跳过没有有效预测的类别
pythonif probs.shape[0] == 0: continue获取符合条件的边界框
pythonsubset_boxes = boxes[mask, :] # 应用相同的掩码筛选边界框组合边界框和置信度
pythonbox_probs = np.concatenate([subset_boxes, probs.reshape(-1, 1)], axis=1)创建形状为
[N, 5]的数组,每⾏包含[x_min, y_min, x_max, y_max, confidence]应⽤非极大值抑制( NMS )
pythonbox_probs = box_utils.hard_nms(box_probs, iou_threshold=iou_threshold, top_k=top_k)去除重叠度⾼的冗余边界框,保留最具代表性的检测结果
保存筛选结果
pythonpicked_box_probs.append(box_probs) picked_labels.extend([class_index] * box_probs.shape[0])处理无检测结果的情况
pythonif not picked_box_probs: return np.array([]), np.array([]), np.array([])合并所有类别的结果
pythonpicked_box_probs = np.concatenate(picked_box_probs)将归⼀化坐标转换为原始图像尺寸
pythonpicked_box_probs[:, 0] *= width # x_min picked_box_probs[:, 1] *= height # y_min picked_box_probs[:, 2] *= width # x_max picked_box_probs[:, 3] *= height # y_max返回最终结果
pythonreturn ( picked_box_probs[:, :4].astype(np.int32), # 边界框坐标 (整数像素值) np.array(picked_labels), # 类别标签 picked_box_probs[:, 4] # 置信度 )
函数输出说明
该函数返回三个数组组成的元组:
- 边界框坐标:形状为 [N, 4] 的整数数组,每⾏表⽰⼀个边界框的
2. 类别标签:形状为 [x_min, y_min, x_max, y_max] [N] 的整数数组,每个元素表⽰对应边界框的类别索引 3. 置信度:形状为 [N] 的浮点数数组,每个元素表⽰对应预测的置信度
这个函数是⽬标检测流程中的关键后处理步骤,负责将模型的原始输出转换为可直接使⽤的检测结果
3.类别名称读取
python
class_names = [name.strip() for name in open('voc-model-labels.txt').readlines()]从 'voc-model-labels.txt' ⽂件中读取类别名称列表,并去除每⾏⾸尾的空⽩字符
4. ONNX 模型加载
python
ort_session = ort.InferenceSession('version-RFB-320.onnx')创建 ONNX Runtime 推理会话,加载 'version-RFB-320.onnx' 模型
5.获取输入名称
python
input_name = ort_session.get_inputs()[0].name获取模型输入节点的名称
6.路径和参数设置
python
result_path = "./detect_imgs_results_onnx"
threshold = 0.7
path = "imgs"
sum = 0- result_path : 结果保存路径
- threshold : 置信度阈值 (0.7)
- path : 待检测图像⽬录
- sum : ⽤于统计总检测框数
7.创建结果目录
python
if not os.path.exists(result_path):
os.makedirs(result_path)如果结果⽬录不存在则创建
8.处理每张图像
python
for file_path in listdir:
img_path = os.path.join(path, file_path)
orig_image = cv2.imread(img_path)遍历目录中的每个文件
拼接完整图像路径
用 OpenCV 读取图像
9.图像预处理
python
image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (320, 240))
image_mean = np.array([127, 127, 127])
image = (image - image_mean) / 128
image = np.transpose(image, [2, 0, 1])
image = np.expand_dims(image, axis=0)
image = image.astype(np.float32)- BGR 转 RGB
- 调整⼤⼩为 320x240
- 定义均值并归⼀化
- 转换维度顺序为 (C,H,W)
- 增加 batch 维度
- 转换为 float32 类型
10. 模型推理
time_time = time.time()
confidences, boxes = ort_session.run(None, {input_name: image})
print("cost time:{}".format(time.time() - time_time))记录开始时间
运⾏模型推理
打印推理耗时
11.后处理
python
boxes, labels, probs = predict(orig_image.shape[1], orig_image.shape[0], confidences, boxes, threshold)调用 predict 函数处理模型输出
12.绘制结果
for i in range(boxes.shape[0]):
box = boxes[i, :]
label = f"{class_names[labels[i]]}: {probs[i]:.2f}"
cv2.rectangle(orig_image, (box[0], box[1]), (box[2], box[3]), (255, 255, 0), 4)
cv2.imwrite(os.path.join(result_path, file_path), orig_image)遍历每个检测框
获取框坐标
⽣成标签⽂本 ( 类别 + 置信度 )
在图像上绘制矩形框
保存结果图像
13.统计总数
python
sum += boxes.shape[0]
print("sum:{}".format(sum))累加检测框数量
打印总数
人机交互的最优方式
(1)用户界面设计:提供一个简洁直观的用户界面,方便用户上传图片和查看识别结果。
(2)加载 “version-RFB-320.onnx” 模型和 “voc-model-labels.txt” 类别标签;
(3)加载本地测试图片文件夹 “imgs” 中的所有图片,并对每张图片进行预处理以符合模型输入要求;
(4)使用 “version-RFB-320.onnx” 模型对加载的图片进行人脸检测;
(5)在图片上绘制检测到的人脸框,并将处理后的图片保存到 “./detect_imgs_results_onnx” 文件夹中;
(6)统计所有图片中检测到的人脸总数并输出。