儿童安全监控系统
在一家儿童游乐场,需要确保没有成年人在没有监护的情况下进入儿童区域。请开发一个程序,使用DNN进行人脸识别和年龄估计,当检测到年龄小于10岁的儿童且没有成年人在场时,系统将模拟报警。
项目描述:
编写一个Python程序,使用OpenCV的DNN模块加载预训练的人脸识别、年龄和性别识别模型。程序将从视频流中捕获图像,识别人脸,并估计每个人的年龄和性别。如果检测到只有儿童(年龄小于10岁)而没有成年人(年龄大于或等于18岁),则程序将打印一条报警消息。
Python编码示例:
import cv2
import numpy as np
# 加载预训练的模型
face_net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000_fp16.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('age_deploy.prototxt', 'age_net.caffemodel')
gender_net = cv2.dnn.readNetFromCaffe('gender_deploy.prototxt', 'gender_net.caffemodel')
# 打开视频流
cap = cv2.VideoCapture('path_to_video_or_camera')
while True:
ret, frame = cap.read()
if not ret:
break
# 人脸检测
face_blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), (104, 177, 123))
face_net.setInput(face_blob)
faces = face_net.forward()
# 检查每个检测到的人脸
for i in range(faces.shape[2]):
confidence = faces[0, 0, i, 2]
if confidence > 0.5:
box = faces[0, 0, i, 3:7] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
startX, startY, endX, endY = box.astype("int")
face = frame[startY:endY, startX:endX]
# 年龄和性别检测
age_blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), (78, 87, 114), swapRB=False)
age_net.setInput(age_blob)
age_preds = age_net.forward()
age = np.argmax(age_preds[0])
# 检查年龄是否小于10岁且没有成年人在场
if age < 2 and all(a >= 2 for a in ages): # 假设年龄标签为0-6, 7-12, ..., 61-67
print("Alert: Unaccompanied child detected!")
# 显示结果
cv2.imshow('Frame', frame)
key = cv2.waitKey(1) & 0xFF
if key == 27: # 按Esc键退出
break
# 释放资源
cap.release()
cv2.destroyAllWindows()