基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 (请自行安装向日葵远程软件,以便提供远程帮助) 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均可。 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。

界面这块用PyQt5搭了个简易操作台,核心是QFrame嵌套OpenCV的画面显示。这里有个坑要注意——得单独开线程处理视频流,不然界面会卡成PPT:

class VideoThread(QThread):
    frame_signal = pyqtSignal(np.ndarray)
    
    def run(self):
        cap = cv2.VideoCapture(0)
        while True:
            ret, frame = cap.read()
            if ret:
                self.frame_signal.emit(frame)

表情识别核心用了轻量化的MobileNet,自己重写了全连接层。加载模型的时候记得处理下输入尺寸:

emotion_model = load_model('models/mobilenet_emotion.h5')
emotion_dict = {0: "生气", 1: "厌恶", 2: "恐惧", 3: "开心", 4: "中性", 5: "悲伤", 6: "惊讶"}

def predict_emotion(face_roi):
    resized = cv2.resize(face_roi, (48,48))  # 必须缩放到模型输入尺寸
    normalized = resized / 255.0
    result = emotion_model.predict(np.expand_dims(normalized, axis=0))
    return emotion_dict[np.argmax(result)]

人脸检测还是老伙计Haar级联,实测比DNN版速度快三倍。不过要注意光照补偿:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

def detect_faces(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist(gray)  # 这个直方图均衡化不能少
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)
    return faces

打包成exe的时候遇到个坑——OpenCV的依赖项会丢失。用PyInstaller得加个hook:

pyinstaller --add-data "haarcascade_frontalface_default.xml;." --hidden-import sklearn.utils._weight_vector main.py

实测在i5-8250U上跑,CPU占用稳定在40%左右。如果想优化性能,可以把MobileNet换成ONNX格式,速度还能再提20%。界面右上角的模式切换按钮建议加个快捷键,比如按V切换视频文件,按C切回摄像头,用户体验直接上档次。

代码仓库里有个utils文件夹放了几个预设视频,测试时发现.mp4格式兼容性最好。有同学反馈戴眼镜检测不准,可以试试在detectMultiScale里调minNeighbors参数到8,误检率能降不少。

最后说个骚操作——在requirements.txt里加opencv-python-headless版本,打包后的体积能瘦身30%。这个项目改改还能做课堂签到系统,把表情识别换成学号二维码扫描,又是一篇毕业设计(手动狗头)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐