这是个人脸表情识别的UI界面,麻烦给个详细的注释,最好是行注释,因为对这些库都不太熟悉
import operator
import os
import time
import cv2
from PySide2 import QtGui
from PySide2.QtWidgets import QFileDialog, QApplication
from PySide2.QtUiTools import QUiLoader
import numpy as np
import torch
import torch.nn as nn
from torchvision import models, transforms
from PIL import Image
def cvImgtoQtImg(cvImg, isConvertToGray=False):
if isConvertToGray:
QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2GRAY)
QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_Grayscale8)
else:
QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2RGBA)
QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGBA8888)
return QtImg
class Stats:
def __init__(self):
self.open = False
self.ui_face = QUiLoader().load('ui/demo.ui')
self.ui_face.setFixedSize(1239, 824)
self.ui_face.btn_open_cap.clicked.connect(self.opt_cap)
self.ui_face.btn_predict.clicked.connect(self.cap)
self.ui_face.btn_open_res.clicked.connect(self.load_pic)
self.model, self.model_ft = self.load_model()
def load_pic(self):
filePaths, _ = QFileDialog.getOpenFileName(
self.ui_face,
"请选择将要转换的文件",
os.path.join(os.path.expanduser('~'), "Desktop"),
"文件类型 (*.jpg)"
)
self.ui_face.edt_res.setText(filePaths)
self.img = cv2.imread(filePaths)
show = cv2.resize(self.img, (640, 480))
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
self.ui_face.ImgDisp.setPixmap(QtGui.QPixmap.fromImage(showImage))
def opt_cap(self):
if self.open == True:
self.open = False
self.ui_face.edt_cap.setText('摄像头已关闭')
else:
self.open = True
self.ui_face.edt_cap.setText('摄像头已打开')
self.start()
def start(self):
self.cap = cv2.VideoCapture(0)
self.cap.set(3, 640)
self.cap.set(4, 480)
self.cap.set(10, 100)
while True:
success, self.img = self.cap.read()
self.img = cv2.flip(self.img, 1)
show = cv2.resize(self.img, (640, 480))
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
self.ui_face.ImgDisp.setPixmap(QtGui.QPixmap.fromImage(showImage))
cv2.waitKey(0)
if self.open == False:
break
print('展示图片')
def cap(self):
try:
image = Image.fromarray(cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB))
output = self.predict(image, self.model_ft)
ret = []
emo = ['surprized', 'happy', 'disgust', 'normal', 'fear', 'anger', 'sad']
for index, value in enumerate(self.model):
dis = np.linalg.norm(value - output) # 欧氏距离
ret.append({'category': emo[index], 'dis': dis})
ret = sorted(ret, key=operator.itemgetter('dis'), reverse=False)
print(ret)
self.ui_face.label_ret.setText('识别结果为:' + ret[0]['category'])
self.ui_face.label_ret_0.setText('0:' + ret[0]['category'])
self.ui_face.label_ret_1.setText('1:' + ret[1]['category'])
self.ui_face.label_ret_2.setText('2:' + ret[2]['category'])
self.ui_face.label_ret_3.setText('3:' + ret[3]['category'])
self.ui_face.label_ret_4.setText('4:' + ret[4]['category'])
self.ui_face.label_ret_5.setText('5:' + ret[5]['category'])
self.ui_face.label_ret_6.setText('6:' + ret[6]['category'])
except:
pass
def load_model(self):
# 这一块是对图片特征进行提取
model_path = 'model/weights.pth'
# build model
model_ft = models.resnet34(pretrained=False)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(num_ftrs, 7),
nn.Softmax(dim=1)
)
model_ft.load_state_dict(torch.load(model_path))
model_ft.eval()
# 参数写到这里,得到的中心点遍历一下 然后写到这里
model = [
[2.0667151e-04, 3.4240412e-04, 1.4473200e-02, 8.0134422e-03, 6.0332119e-03,
7.7563822e-03, 9.6317458e-01],
[2.5990081e-04, 2.7968729e-04, 1.8215105e-02, 9.3163711e-01, 5.1174462e-03,
6.0818493e-03, 3.8408846e-02],
[0.00336622, 0.00619731, 0.10314032, 0.20358741, 0.27171963, 0.26114,
0.1508491],
[2.0508033e-04, 3.2301957e-04, 8.1134737e-03, 5.8690608e-03, 9.5963997e-01,
1.0704219e-02, 1.5145153e-02],
[4.1064431e-04, 1.2989613e-03, 8.9172471e-01, 2.3929298e-02, 1.7944381e-02,
2.8446108e-02, 3.6245927e-02],
[0.0014531, 0.00288311, 0.21803668, 0.1291624, 0.06903042, 0.04348047,
0.5359538],
[2.0752930e-04, 4.1509242e-04, 8.1426501e-03, 7.6724142e-03, 8.2466751e-03,
9.6485263e-01, 1.0462716e-02]
]
return model, model_ft
def predict(self, image, model):
time_s = time.time()
transform = transforms.Compose([
transforms.Resize(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
img = transform(image)
img = torch.unsqueeze(img, 0)
output = model(img)[0].data.numpy()
time_e = time.time() - time_s
self.ui_face.label_time.setText('用时:' + ('%.3f' % time_e) + 's')
return output
if __name__ == '__main__':
app = QApplication([])
stats = Stats()
stats.ui_face.show()
app.exec_()