【发布时间】:2022-01-18 08:01:43
【问题描述】:
我正在使用 python 进行我的最后一年项目(面罩检测)。我做了所有的事情,但我的指南建议在我的项目中附加一个通用警报系统。所以我附上了警报系统。这意味着如果有人没有戴口罩,那么它通常会以三种语言(泰米尔语、印地语、英语)发出警报。
但它需要一个单独的时间来运行这三个音频(泰米尔语 3 秒、印地语 2 秒和英语 1 秒)。所以我在我的程序中使用了睡眠功能sleep()。我成功连接了它,但是这个睡眠功能干扰了视频运动。这意味着如果我移动(带面具)并且有人移动(不带面具)它将在 6 秒后显示。所以它是慢动作。我什至尝试过多线程概念,但我无法实现它,所以我想要这个(如果有人没有戴口罩,那么它会播放这些音频,但不会干扰视频帧(慢动作))。
代码:
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
from imutils.video import VideoStream
import numpy as np
import imutils
import time
import cv2
import os
import voice
import threading
from pygame import mixer
mixer.init()
#sound=mixer.Sound('mixkit-security-facility-breach-alarm-994.wav')
alert1=mixer.Sound('Tamilalert.mp3')
alert2=mixer.Sound('Hindialert.mp3')
alert3=mixer.Sound('Englishalert.mp3')
#t2=threading.Thread(target=voice.alertsystem())
def detect_and_predict_mask(frame, faceNet, maskNet):
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(frame, 1.0, (224, 224),
(104.0, 177.0, 123.0))
faceNet.setInput(blob)
detections = faceNet.forward()
print(detections.shape)
faces = []
locs = []
preds = []
for i in range(0, detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
(startX, startY) = (max(0, startX), max(0, startY))
(endX, endY) = (min(w - 1, endX), min(h - 1, endY))
face = frame[startY:endY, startX:endX]
face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
face = cv2.resize(face, (224, 224))
face = img_to_array(face)
face = preprocess_input(face)
faces.append(face)
locs.append((startX, startY, endX, endY))
if len(faces) > 0:
faces = np.array(faces, dtype="float32")
preds = maskNet.predict(faces, batch_size=32)
return (locs, preds)
prototxtPath = r"face_detector\deploy.prototxt"
weightsPath = r"face_detector\res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)
maskNet = load_model("mask_detector.model")
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
while True:
frame = vs.read()
frame = imutils.resize(frame, width=1000)
(locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
for (box, pred) in zip(locs, preds):
(startX, startY, endX, endY) = box
(mask, withoutMask) = pred
if mask>withoutMask:
label = "Mask"
color = (0, 255, 0)
print("Normal")
else:
label = "No Mask"
color = (0, 0, 255)
alert1.play()
time.sleep(3)
alert2.play()
time.sleep(2)
alert3.play()
time.sleep(1)
#sound.play()
#t2=threading.Thread(target=voice.alertsystem())
#voice.alertsystem()
print("Alert!!!")
label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
cv2.putText(frame, label, (startX, startY - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
```
so kindly see else part of my program. and I hope you understood my problem kindly give solution
【问题讨论】:
-
您在线程方面做得对,我认为您需要尝试使其工作。排队“睡觉”当然会干扰您尝试执行的任何实时处理。
-
使用 playsound 模块。
-
首先,感谢您的回复,但这里的问题是睡眠功能每个音频都必须运行一些特定的时间示例泰米尔语 3 秒,所以我设置了 sleep(3),所以所有进程都停止到 3 秒,所以我想要同步.但我无法在那里实现多线程概念
标签: python tensorflow keras