智慧巡检-8基于深度学习的人脸表情检测识别系统含UI界面、yolov8、Python代码、数据集外接摄像头实时检测识别。以官方yolov8为主干实现对人脸7种类别表情的检测识别OpenCV实现对人脸的检测训练的分类模型识别对人脸表情种类别的检测且利用PyQt5设计了简约的系统UI界面。在界面中您可以选择自己的视频文件、图片文件进行检测。此外还可选择添加SE注意力机制的主干模型您还可以更换自己训练的主干模型进行自己数据的检测。它具备多目标实时检测同时可以自由选择感兴趣的检测目标。数据集近万张fer2013数据集精选。11这是一个非常经典且实用的计算机视觉项目。根据截图和描述这个系统的核心逻辑其实是“两阶段检测”先用OpenCV (Haar Cascades)快速定位人脸裁剪出人脸区域再送入YOLOv8模型进行具体的7种表情分类。这种架构比直接用YOLOv8从头训练人脸检测要快得多且精度很高。以下是构建这个系统的核心代码框架分为模型训练和PyQt5 UI 界面两部分。数据准备你需要将 FER2013 数据集整理成 YOLOv8 的格式。FER2013 包含 7 种表情愤怒、厌恶、恐惧、快乐、悲伤、惊讶、中性。目录结构应如下dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/创建data.yaml文件path:../datasettrain:images/trainval:images/valnames:0:Angry1:Disgust2:Fear3:Happy4:Sad5:Surprise6:Neutral第一步训练 YOLOv8 表情分类模型你需要一段 Python 代码来训练模型。这里使用 Ultralytics 官方库。fromultralyticsimportYOLOdeftrain_expression_model():# 1. 加载预训练模型 (使用yolov8n.pt即nano版本速度最快)modelYOLO(yolov8n.pt)# 2. 开始训练# data: 数据配置文件路径# epochs: 训练轮数# imgsz: 图片尺寸# name: 实验名称resultsmodel.train(datadata.yaml,epochs100,imgsz64,# 人脸表情图片通常较小64x64足够batch64,nameyolov8_expression_v1,patience10# 早停机制)if__name____main__:train_expression_model()第二步PyQt5 系统主界面与逻辑代码这是截图中的核心部分。它实现了加载图片/视频/摄像头 - OpenCV检测人脸 - 裁剪 - YOLOv8识别表情 - 绘制界面。你需要安装依赖pip install PyQt5 opencv-python ultralytics numpyimportsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QWidget,QFileDialog,QMessageBoxfromPyQt5.QtGuiimportQPixmap,QImage,QFont,QColorfromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignalfromultralyticsimportYOLO# --- 加载预训练的人脸检测模型 (Haar Cascades) ---face_cascadecv2.CascadeClassifier(cv2.data.haarcascades.haarcascade_frontalface_default.xml)# --- 加载训练好的表情识别模型 (YOLOv8) ---# 请确保这里的路径是你训练好的 best.pt 路径expression_modelYOLO(runs/detect/yolov8_expression_v1/weights/best.pt)classVideoThread(QThread):change_pixmap_signalpyqtSignal(np.ndarray)def__init__(self):super().__init__()self._run_flagTrueself.source0# 默认摄像头defrun(self):capcv2.VideoCapture(self.source)whileself._run_flag:ret,cv_imgcap.read()ifret:# 在这里进行核心处理processed_imgself.process_frame(cv_img)self.change_pixmap_signal.emit(processed_img)cap.release()defprocess_frame(self,frame):# 1. 转灰度用于人脸检测graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)facesface_cascade.detectMultiScale(gray,1.1,4)# 2. 遍历检测到的人脸for(x,y,w,h)infaces:# 提取人脸区域face_roiframe[y:yh,x:xw]# 3. 使用YOLOv8预测表情 (注意这里输入的是裁剪后的人脸)# 如果模型是分类模型直接用 model(face_roi)如果是检测模型需注意# 这里假设你训练的是分类模型或者单目标检测模型resultsexpression_model(face_roi,verboseFalse)labelUnknownconf0.0# 解析结果forrinresults:# 假设是分类任务ifhasattr(r,probs):top1r.probs.top1 confr.probs.top1conf labelr.names[top1]# 假设是检测任务 (检测框就是人脸)eliflen(r.boxes)0:top1int(r.boxes.cls[0])confr.boxes.conf[0]labelr.names[top1]# 4. 在原图上画框和标签color(0,255,0)# 绿色框cv2.rectangle(frame,(x,y),(xw,yh),color,2)# 绘制标签背景cv2.rectangle(frame,(x,y-30),(xw,y),color,-1)# 绘制文字cv2.putText(frame,f{label}{conf:.2f},(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,0,0),2)returnframedefstop(self):self._run_flagFalseself.wait()classEmotionApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(人脸表情检测识别系统)self.setGeometry(100,100,1000,700)self.setStyleSheet(background-color: #2c3e50; color: white;)# UI布局self.image_labelQLabel(self)self.image_label.resize(800,600)self.btn_cameraQPushButton(打开摄像头,self)self.btn_camera.clicked.connect(self.start_camera)self.btn_imageQPushButton(选择图片文件,self)self.btn_image.clicked.connect(self.load_image)# 布局设置layoutQVBoxLayout()layout.addWidget(self.image_label)layout.addWidget(self.btn_camera)layout.addWidget(self.btn_image)containerQWidget()container.setLayout(layout)self.setCentralWidget(container)self.threadNonedefstart_camera(self):ifself.threadisNone:self.threadVideoThread()self.thread.change_pixmap_signal.connect(self.update_image)self.thread.start()defupdate_image(self,cv_img):将OpenCV图像转换为Qt图像并显示qt_imgself.convert_cv_qt(cv_img)self.image_label.setPixmap(qt_img)defconvert_cv_qt(self,cv_img):Convert from an opencv image to QPixmaprgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(800,600,Qt.KeepAspectRatio)returnQPixmap.fromImage(p)defload_image(self):# 实现加载本地图片并推理的逻辑类似上面的VideoThread逻辑但只运行一次fileName,_QFileDialog.getOpenFileName(self,选择图片,,Image Files (*.png *.jpg *.bmp))iffileName:imgcv2.imread(fileName)# 复用处理逻辑processed_imgVideoThread().process_frame(img)self.update_image(processed_img)defcloseEvent(self,event):ifself.thread:self.thread.stop()event.accept()if__name____main__:appQApplication(sys.argv)windowEmotionApp()window.show()sys.exit(app.exec_())如何加入 SE 注意力机制 (进阶)截图中提到了“可选择添加SE注意力机制”。这需要在模型定义阶段修改。如果你使用的是ultralytics库你需要自定义一个包含 SE 模块的模型配置文件yaml。定义 SE 模块在ultralytics/nn/modules.py中添加或自定义。创建一个新的 yaml 文件例如yolov8-se.yaml在 Backbone 部分插入 SE 模块。训练时使用model YOLO(yolov8-se.yaml)。总结截图中的系统是一个典型的OpenCV Deep Learning混合应用。前端PyQt5 负责显示视频流、按钮交互。后端逻辑OpenCV 负责视频解码和人脸粗定位速度快。核心算法YOLOv8 负责高精度的表情特征提取和分类。这套代码可以直接运行前提是你有了训练好的.pt模型能够复现截图中的基本功能。