python 遇到的问题

代码:Github

问题描述

文件

  1. faceDetector.py 主要的逻辑,识别人脸并说话
  2. speech_api/jatts.py 谷歌的text2speech api
  3. trainingData.yml 人脸照片学习之后的模型数据

    主要代码

faceDetector.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import cv2
from speech_api import jatts
import time

# 找出画面中人脸位置的模块
detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture(0) # 启动摄像头
cap.set(cv2.CAP_PROP_FPS, 60) # 设置画面帧数60
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # 设置画面宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 设置画面高度

recognizer =cv2.face.LBPHFaceRecognizer_create() #生产识别器

recognizer.read("trainingData.yml") # 读取训练过人脸的数据

id=-1
font=cv2.FONT_HERSHEY_SIMPLEX

flag=False
while True:
# 主要的代码逻辑:while 文不断扫描画面找出人脸与训练数据做比对
# 如果扫描到的人脸和训练数据相同 => text2speech api => 像他问好
ret,img=cap.read()
gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# size, likelyhood
faces=detector.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
# 在人脸周围画方框的函数
cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0),2)
# 返回侦测到的人脸的ID和近似度conf(数字越大和训练数据越不像)
id,conf =recognizer.predict(gray[y:y+h,x:x+w])
if(conf>90):
username="Unknown"
else:
if(id==1):
username="chou"
elif(id==-1):
username="Unknown"
# 如果侦测到人脸 就说 你好 某某,flag保证只说一次
if( (username !="Unknown") & flag==False):
flag=True
jatts.jatts("你好"+username)
# 在人脸上方显示用户名和conf值(近似度)
cv2.putText(img,"User:"+username,(x,y-10),font,1,(0,255,0),3)
cv2.putText(img, "Conf:" + str(conf), (x, y - 50), font, 1, (0, 255, 0), 3)

cv2.imshow('img',img)
# 推出按钮=q
if cv2.waitKey(1) & 0xFF==ord('q'):
break

cap.release()
cv2.destroyAllWindows()

问题1 卡顿现象

1
2
3
4
5
while:
# 图像处理code
if( (username !="Unknown") & flag==False):
flag=True
jatts.jatts("你好"+username)

在while的频率大概10次每秒,在while之中调用api导致突然画面会卡住,有没有让图像处理和声音处理分开的方法。
比如图像的频率10次每秒,声音每秒确认一次是否问好。

问题2 识别精度不够

现在的逻辑是第一次做出username的判断,立刻通过api说话。
但是username的预测现在不稳定,大概十次里面能预测对名字6次,理想状态是三秒左右按多数决给username赋值=>问好。
比如判断成用户1=60次,用户2=40次,所以应该识别成用户1

据说喜欢打赏的人运气都不会太差