Skip to content

人脸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 ort
  • os : ⽤于⽂件和⽬录操作
  • time : ⽤于时间相关操作,这⾥⽤来计算推理时间
  • cv2 : OpenCV 库,⽤于图像处理
  • numpy : 数值计算库
  • box_utils : 包含边界框处理⼯具的⾃定义模块
  • onnxruntime : ONNX 模型推理运⾏时

2.预测函数 predict 函数详细解

这个函数⽤于对⽬标检测模型的原始输出进⾏后处理,主要完成以下任务:

函数参数说明

参数类型说明
widthint原始图像的宽度(像素)
heightint原始图像的高度(像素)
confidencesnp.array模型输出的置信度数组(每个边界框的类别概率)
boxesnp.array模型输出的边界框数组(归⼀化坐标)
prob_thresholdfloat置信度阈值,过滤低置信度预测
iou_thresholdfloatIoU 阈值,⽤于⾮极⼤值抑制( NMS )
top_kint每个类别保留的最⼤检测框数量

函数执行步骤详解

  1. 提取单个图像的结果

    python
    boxes = boxes[0]
    confidences = confidences[0]

    模型输出通常是批量处理结果,这⾥只处理第⼀个图像的结果(假设批大小为 1 )

  2. 初始化结果容器

    python
    picked_box_probs = []  # 存储筛选后的边界框和置信度
    picked_labels = []     # 存储对应的类别标签
  3. 便利每个类别(跳过背景类 0)

    python
    for class_index in range(1, confidences.shape[1]):
  4. 筛选置信度高于阈值的预测

    python
    probs = confidences[:, class_index]  # 获取当前类别的所有置信度
    mask = probs > prob_threshold        # 创建置信度阈值掩码
    probs = probs[mask]                  # 应用掩码筛选置信度
  5. 跳过没有有效预测的类别

    python
    if probs.shape[0] == 0:
        continue
  6. 获取符合条件的边界框

    python
    subset_boxes = boxes[mask, :]  # 应用相同的掩码筛选边界框
  7. 组合边界框和置信度

    python
    box_probs = np.concatenate([subset_boxes, probs.reshape(-1, 1)], axis=1)

    创建形状为 [N, 5] 的数组,每⾏包含 [x_min, y_min, x_max, y_max, confidence]

  8. 应⽤非极大值抑制( NMS )

    python
    box_probs = box_utils.hard_nms(box_probs,
                                   iou_threshold=iou_threshold,
                                   top_k=top_k)

    去除重叠度⾼的冗余边界框,保留最具代表性的检测结果

  9. 保存筛选结果

    python
    picked_box_probs.append(box_probs)
    picked_labels.extend([class_index] * box_probs.shape[0])
  10. 处理无检测结果的情况

    python
    if not picked_box_probs:
    return np.array([]), np.array([]), np.array([])
  11. 合并所有类别的结果

    python
    picked_box_probs = np.concatenate(picked_box_probs)
  12. 将归⼀化坐标转换为原始图像尺寸

    python
    picked_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
  13. 返回最终结果

    python
    return (
        picked_box_probs[:, :4].astype(np.int32),  # 边界框坐标 (整数像素值)
        np.array(picked_labels),                   # 类别标签
        picked_box_probs[:, 4]                     # 置信度
    )

函数输出说明

该函数返回三个数组组成的元组:

  1. 边界框坐标:形状为 [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)统计所有图片中检测到的人脸总数并输出。