目录
基于MTCNN的实时人脸检测方法及系统 II
目录 III
第1章 引言 1
1.1背景介绍与研究意义 1
1.2研究内容与目标 4
第2章 深度学习及MTCNN深度级联神经网络原理 5
2.1 深度学习简介 5
2.1.1 Proposal Network (P-Net)层 5
2.1.2 Refine Network (R-Net)层 5
2.1.3 Output Network (O-Net)层 6
2.2小结 6
第3章 人脸检测算法 7
3.1 人脸检测算法 7
3.1.1 面部分类: 7
3.1.2 边界框回归 7
3.1.3 面部地标定位 7
3.1.4 多源训练 8
3.2 小结 8
第4章 系统设计与实验结果分析 9
4.1系统框架设计 9
4.2前端界面设计 9
4.3系统实现 9
4.3.1 环境配置 9
4.3.2 前端界面实现 10
4.3.4功能逻辑实现 11
4.4实验步骤与分析 12
4.4.1 实验设置 12
4.4.2 数据集 12
4.4.3 评估指标 13
4.4.4 实验结果分析 14
4.4.4.1多种方法对比 14
4.4.4.2多种环境对比 14
4.5小结 17
结 论 18
参考文献 19
1.2研究内容与目标
本课题研究内容主要是基于级联神经网络优化人脸检测模型,提升人脸检测精度。一是在公开的大规模人脸数据集上训练人脸检测模型;二是采用三层级联神经网络提取特征和对损失函数进行优化。三是基于人脸检测实现的定制人脸检测系统。
本课题目标主要有两个:一方面是,在数据集上基于级联神经网络训练出一个好的人脸检测模型;另一方面是, 在Python上开发构建出一个人脸检测系统,实现对图片或视频中人脸进行实时人脸检测,并显示人脸置信度。
第2章 深度学习及MTCNN深度级联神经网络原理
2.1 深度学习简介
深度学习(Deep Learning)是机器学习的分支,是一种以人工神经网络为架构,对数据进行特征学习的算法。目前,深度学习结构已有数种,经典代表有深度神经网络、卷积神经网络、递归神经网络等。深度目前已经广泛应用于计算机视觉、自然语言处理、语音识别等领域,并取得了巨大的成果。2016年3月,AlphaGo的表现,展现了深度学习在围棋领域的重大突破。
2.1.1 Proposal Network (P-Net)层
该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。
系统框架决定系统开发、维护和扩展的效率。图4-1描述了整个人脸检测系统的框架设计,包括数据源、人脸检测、结果呈现三个模块,用户通过GUI界面进行交互。整个系统首先通过数据源获取图片信息,数据源来自摄像头、本地照片。人脸检测模块是本系统核心模块,将预训练的模型存储在系统中,本文转载自http://www.biyezuopin.vip/onews.asp?id=14877然后通过提取图片或者视频帧中的人脸特征,将结果呈现在GUI界面中。
4.2前端界面设计
系统的GUI设计采用Tkinter实现,主要分为两部分,一部分是图片检测模式,通过上传本地图片完成检测。另外一部分是摄像头检测模式,支持本地摄像头采集人脸信息并实时检测。
from tkinter import *
from tkinter import messagebox
from tkinter import simpledialog
from tkinter import filedialog
from PIL import Image, ImageTk
from test import oneImg
from test import openCma
import cv2
import os
Flag = True #控制摄像头的变量
capture = cv2.VideoCapture(0)#摄像头对象作为全局变量会更快些
def ui_process():
root =Tk()
root.title("人脸检测系统")
root.geometry("1000x850")
tempImg=Image.open("D:/working/tensorflow_mtcnn_zip/tensorflow-MTCNN-master/bg.jpg")
tempImg=tempImg.resize((1000,900))
bgImg=ImageTk.PhotoImage(tempImg)
theLabel = Label(root,image=bgImg,compound=CENTER)
theLabel.pack()
#标签
L_titile = Label(root,text='基于MTCNN的实时人脸检测系统',)
L_titile.config(font='Helvetica -15 bold',fg='blue')
L_titile.place(x=150,y=20,anchor="center")
L_author = Label(root, text='作者:刘佳昇')
L_author.config(font='Helvetica -10 bold')
L_author.place(x=920,y=830)
S_title = Label(root,text='图片识别模式')
S_title.config(font='Helvetica -20 bold',fg='red')
S_title.place(x=40,y=50)
S_title = Label(root, text='摄像头实时识别模式')
S_title.config(font='Helvetica -20 bold', fg='red')
S_title.place(x=40, y=450)
S_title = Label(root, text='图片识别结果')
S_title.config(font='Helvetica -15 bold', fg='red')
S_title.place(x=740, y=100)
#图区
canvas = Canvas(root, bd=2, relief=SUNKEN)
canvas.place(x=40,y=140)
resultCanvas = Canvas(root,bd=2,relief=SUNKEN)
resultCanvas.place(x=600,y=140)
#摄像头
cmaCanvas = Canvas(root,bd=2,relief=SUNKEN,height=350,width=580)
cmaCanvas.place(x=400,y=470)
#按钮
B_NO1 = Button(root, text="打开一张图片",command=lambda :OpenFile(canvas,resultCanvas))
B_NO1.place(x=40, y=100)
B_NO2 = Button(root, text="打开输出文件夹", command=lambda: openOutPut())
B_NO2.place(x=600, y=100)
B_OpenCma = Button(root,text="打开摄像头",command=lambda :openGuiCma(cmaCanvas,root))
B_OpenCma.place(x=40,y=500)
B_OpenCma = Button(root, text="关闭摄像头", command=lambda: closeGuiCma())
B_OpenCma.place(x=140, y=500)
#菜单栏
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=lambda :openOutPut())
mainloop()
def openOutPut():
os.system("start explorer D:\working\\tensorflow_mtcnn_zip\\tensorflow-MTCNN-master\\output")
#文件操作的对话框
def OpenFile(canvas,resultCanvas):
File = filedialog.askopenfilename(title='打开图片', filetypes=[ ('All Files', '*')])
print(type(File))
# resultImg = ImageTk.PhotoImage(Image.fromarray(oneImg(File).astype('uint8')).convert('RGB')) #这个转换方式会导致颜色异常
resultImg = ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(oneImg(File),cv2.COLOR_BGR2RGB))) #这里需要把cv的图像格式转换成PIL.img
filename = Image.open(File)
# filename.resize((3500,300))
filename = ImageTk.PhotoImage(filename)
print(type(Image.open(File)))
canvas.image = filename # <--- keep reference of your image
canvas.create_image(0, 0, anchor='nw', image=filename)
resultCanvas.image = resultImg
resultCanvas.create_image(0,0,anchor='nw',image=resultImg)
print(File)
def closeGuiCma():
global Flag
print(Flag)
Flag = False
def openGuiCma(resultCanvas,root):
# 摄像头
if(messagebox.askokcancel('Python Tkinter', '确认打开摄像头?')==True):
global Flag
Flag=True
while Flag==True:
ref, frame = capture.read()
cvimage = cv2.cvtColor(openCma(frame), cv2.COLOR_BGR2RGBA)
pilImage = Image.fromarray(cvimage)
tkImage = ImageTk.PhotoImage(image=pilImage)
resultCanvas.create_image(0, 0, anchor='nw', image=tkImage)
root.update()
root.after(100)
if __name__ == "__main__":
print("开始")
ui_process()