OpenCV 使用 pytorch 模型 通过摄像头实时表情识别

表情识别

上次拿Fer2013数据集训练出来的模型,可以借助opencv实现摄像头实时检测表情,准确率当然一言难尽,不过玩一下还是阔以的。

代码

import cv2
import torchvision
from Mynn import * # 储存pytorch网络结构
from PIL import Image

model = My_model('./m0.pth').cuda()  #加载训练好的pytorch模型

transforms = torchvision.transforms.Compose([
    torchvision.transforms.Grayscale(),
    torchvision.transforms.Resize((48,48)),
    torchvision.transforms.ToTensor()
])#定义图像变换以符合网络输入

emotion = ["angry","disgust","fear","happy","sad","surprised","neutral"]#表情标签

cap = cv2.VideoCapture(0)# 摄像头,0是笔记本自带摄像头
face_cascade = cv2.CascadeClassifier('C:\\Users\\11705\\Anaconda3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
#opencv自带的一个面部识别分类器
while(cap.isOpened()):
    ret, frame = cap.read()
    frame = frame[:,::-1,:]#水平翻转,符合自拍习惯
    frame= frame.copy()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  
    face = face_cascade.detectMultiScale(gray,1.1,3)  
    img = frame
    if(len(face)>=1):
        (x,y,w,h)= face[0]
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        img = frame[:][y:y+h,x:x+w]  
    # 如果分类器能捕捉到人脸,就对其进行剪裁送入网络,否则就将整张图片送入 
    img = Image.fromarray(img)
    img = transforms(img)
    img = img.reshape(1,1,48,48).cuda()
    pre = model(img).max(1)[1].item()
    frame = cv2.putText(frame, emotion[pre], (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (55,255,155), 2)
    #显示窗口第一个参数是窗口名,第二个参数是内容
    cv2.imshow('emotion', frame)
    if cv2.waitKey(1) == ord('q'):#按q退出
        break
cap.release()
cv2.destroyAllWindows()
posted @ 2020-04-01 16:57  尾巴一米八  阅读(5472)  评论(4编辑  收藏  举报