人工智能训练师(三级)实操考试 — 3.2.5 人脸AI智能检测系统交互流程设计

← 返回题目列表 考核时间:20 分钟 20:00
工作任务

在安防监控、智能交通等领域,实时准确的人脸检测需求日益增长。本系统所使用的 "version-RFB-320.onnx" 模型,通过大量数据训练,能够快速准确地检测出图像中的人脸。

AI 模型说明:"version-RFB-320.onnx" 模型是用于人脸检测的 ONNX 格式模型,对应的类别标签文件为 "voc-model-labels.txt"。该模型的使用交互流程为:

(1)加载 "version-RFB-320.onnx" 模型和 "voc-model-labels.txt" 类别标签;

(2)加载本地测试图片文件夹 "imgs" 中的所有图片,并对每张图片进行预处理以符合模型输入要求;

(3)使用模型对加载的图片进行人脸检测;

(4)在图片上绘制检测到的人脸框,并将处理后的图片保存到 "./detect_imgs_results_onnx" 文件夹中;

(5)统计所有图片中检测到的人脸总数并输出。

具体要求

补全该模型的使用交互流程对应的 Python 代码(3.2.5.ipynb),实现本地测试图片文件夹 "imgs" 中所有图片的人脸检测。

注意事项
  • 在代码的 橙色下划线 处填写正确的 Python 代码
  • 请勿修改源代码的其他部分
  • 填写完成后点击 "检查答案" 查看评分
  • 点击 "显示答案" 可直接查看所有参考答案
  • 点击 "重置" 清空所有填写内容
请在下划线处填写代码
当前得分
0 / 17
In [1] — 人脸检测完整代码 17分
import os import time import cv2 import numpy as np import vision.utils.box_utils_numpy as box_utils import onnxruntime as ort # 定义预测函数,对模型输出的边界框和置信度进行后处理 def predict(width, height, confidences, boxes, prob_threshold, iou_threshold=0.3, top_k=-1): boxes = boxes[0] confidences = confidences[0] picked_box_probs = [] picked_labels = [] for class_index in range(1, confidences.shape[1]): probs = confidences[:, class_index] mask = probs > prob_threshold probs = probs[mask] if probs.shape[0] == 0: continue subset_boxes = boxes[mask, :] box_probs = np.concatenate([subset_boxes, probs.reshape(-1, 1)], axis=1) box_probs = box_utils.hard_nms(box_probs, iou_threshold=iou_threshold, top_k=top_k, ) picked_box_probs.append(box_probs) picked_labels.extend([class_index] * box_probs.shape[0]) if not picked_box_probs: return np.array([]), np.array([]), np.array([]) picked_box_probs = np.concatenate(picked_box_probs) picked_box_probs[:, 0] *= width picked_box_probs[:, 1] *= height picked_box_probs[:, 2] *= width picked_box_probs[:, 3] *= height return picked_box_probs[:, :4].astype(np.int32), np.array(picked_labels), picked_box_probs[:, 4] # 从标签文件中读取每一行,并去除行首尾的空白字符,得到类别名称列表 2分 class_names = [ for name in open('voc-model-labels.txt').readlines()] # 创建 ONNX Runtime 的推理会话,用于运行模型进行推理 2分 ort_session = ('version-RFB-320.onnx') # 获取模型输入的名称 2分 input_name = ()[0].name # 定义保存检测结果图像的目录路径 result_path = "./detect_imgs_results_onnx" # 定义置信度阈值,用于筛选出置信度较高的检测结果 threshold = 0.7 # 定义存储待检测图像的目录路径 path = "imgs" # 用于统计所有图像中检测到的目标框总数,初始化为 0 sum = 0 # 如果保存结果的目录不存在,则创建该目录 2分 if not os.path.exists(result_path): os. # 获取指定目录下的所有文件和文件夹名称列表 listdir = os.listdir(path) # 遍历目录下的每个文件 for file_path in listdir: # 拼接图像文件的完整路径 img_path = os.path.join(path, file_path) # 使用 OpenCV 读取图像文件 2分 orig_image = # 将图像从 BGR 颜色空间转换为 RGB 颜色空间 image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB) # 将图像调整为 320x240 的尺寸(符合模型输入的尺寸要求) 2分 image = (, (320, 240)) # 定义图像归一化的均值数组 2分 image_mean = ([127, 127, 127]) # 对图像进行归一化处理,减去均值并除以 128 image = (image - image_mean) / 128 # 将图像的维度从 (高度, 宽度, 通道数) 转换为 (通道数, 高度, 宽度) image = np.transpose(image, [2, 0, 1]) # 在第一个维度上扩展一个维度 1分 image = (image, axis=0) # 将图像数据类型转换为 float32 类型 image = image.astype(np.float32) # 记录开始时间 time_time = time.time() # 使用 ONNX Runtime 运行模型,输入图像数据,得到输出 2分 confidences, boxes = (None, {input_name: image}) # 计算并打印模型推理的耗时 print("cost time:{}".format(time.time() - time_time)) # 调用 predict 函数对模型输出进行后处理 boxes, labels, probs = predict(orig_image.shape[1], orig_image.shape[0], confidences, boxes, threshold) # 遍历每个检测到的目标框 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) # 累加当前图像中检测到的目标框数量 sum += boxes.shape[0] # 打印所有图像中检测到的目标框总数 print("sum:{}".format(sum))
答案检查结果