基于Python的视频中的人脸识别系统设计与实现
Posted biyezuopin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Python的视频中的人脸识别系统设计与实现相关的知识,希望对你有一定的参考价值。
目录
一:问题描述 2
二:实现思路 2
2.1 切换点 2
2.1.2 镜头切换点 3
2.1.2 音频切换点。 3
2.2 嘉宾识别 = 人脸识别 & 声纹识别 4
2.2.1 人脸识别 4
2.2.2 声纹识别 5
三:实验环境 5
四:分帧 6
4.1 直方图计算法 6
4.2 图像指纹:hash 7
4.3 SSIM法 8
4.4 实验输出及结果 8
五:人脸识别 10
5.1 数据集的构建 10
5.2 训练集和测试集的构建 12
5.3 数据的处理 15
5.4 人脸识别的历程 17
5.4.1 早期 模板匹配技术 17
5.4.2 中期 voila-jonesVJ框架 17
5.4.3 现在 深度学习 17
5.5 配置神经网络 17
5.5.1 CNN 17
5.5.3 VGG 20
5.5.3 定义损失函数和准确率 21
5.5.4 定义优化方法 22
5.6 训练网络和保存模型 22
5.6.1创建Executor 22
5.6.2展示模型训练曲线 23
5.6.3训练并保存模型 23
5.7 模型评估 25
5.7.1CNN 25
5.7.2VGG 26
5.8 对视频进行识别并且进行可视化输出 27
5.8.1 对视频进行识别 27
5.8.2 将结果可视化输出 30
5.9 实验结果及分析 32
六:音频识别 34
6.1 分段式声纹识别 34
6.2 说话人日志 35
6.2.1 说话人日志原理 35
6.2.2 说话人日志结果分析 36
6.3 数据可视化 37
七:代码查看方式 37
7.1 视频识别: 37
7.2 音频识别: 37
九:参考文献 37
二:实现思路
一开始拿到这个题目是有点懵的,因为我们组里都是信安,并没有学习过机器学习类似的课程,但是这道题目是一定要用到机器学习。再加上这道题老师并没有给出参考代码,所以可以说是完全是“从头开始”。不过功夫不负有心人并且老师给了我们最后一个选题充裕的时间,所以我们才可以将其做出来。
2.1 切换点
而根据问题的描述:根据声音或者视频,给出镜头的切换点,按照时间段给出时间起点和终点。
我们所理解的切换点为两种:镜头切换点和音频切换点。
2.1.2 镜头切换点
对于镜头切换点:对于这个视频来说,可以很明显的看到这个视频的拍摄并不是一个机位拍摄的,而是多机位进行拍摄。每个机位对着一个嘉宾或者主持人。如下图所示:
所以我们想到如果说我们可以找到这个视频的镜头切换点或者说剪辑点,对于一个视频而言后期剪辑会将不同机位拍摄的视频剪辑在一起,而这个剪辑点是很好找的,所以只要找到这视频的剪辑点就相当于找到了这个视频的镜头切换点,就可以将一段视频分段,分成一段只有一个主持人的样子,并且将每一段所对应的时间记录下来生成一个列表,这样就可以达到选题给出的要求。
至于如何找这个剪辑点在之后的第三段:分帧中会提到,这里就不赘述了。
2.1.2 音频切换点。
对比寻找视频切换点,音频切换点就显得不是友好了。
这是我们用来测试的波形图
对于这段音频,当一个人停止说话时就是波谷,然后后面一个人又接话这样就可以判断音频的切换点。
虽然说理论上这样是没有错的,但是实际实现上是有很多纰漏的:当一个人说完了一句话,其实就有停顿,这个时候如果说时音频切换点的话那么一段视频中就有很多很多个切换点,如上图,本文转载自http://www.biyezuopin.vip/onews.asp?id=14818其实里面实际的音频切换点没有几个,但是可以观察到波谷有二十来个左右,所以这种方法一开始就被我们摒弃了,但是不无参考价值。
对于这个切换点我们给出了两种方案:
1:设定相应的步长,分块进行声纹识别,得出说话人队列。
2:说话人日志(Speaker Diarization):基于深度学习的说话人日志,通过深度学习的方法,从训练数据中学习语音和说话人的特征,从而实现说话人“谁在什么时候说话”的目标。
2.2 嘉宾识别 = 人脸识别 & 声纹识别
2.2.1 人脸识别
对于人脸识别这方面,现在技术上已经做的很发达了。比如说图书馆和宿舍用的人脸识别系统:可以说秒识别了。而且识别准确率特别高。
我们在这里先假设我们的人脸识别准确率可以达到90%以上,实际上我们也达到了90%以上。但是在这里我们假设人脸识别是成功的,是可移植的。如果说分帧做好了的话,对于人脸识别的话我们就可以在一段视频中取多帧图片,对其进行人脸识别,然后取匹配结果中的最匹配的那一项作为结果,成为那个片段的标签用来标记这个片段中是哪个嘉宾。
这样我们就可以将嘉宾识别出来。
具体的人脸识别是怎么样实现的之后会有详细的介绍。
2.2.2 声纹识别
对于声纹识别这方面,通过对市面上的调研,声纹识别的应用场景并没有人脸识别广泛。所以对于声纹识别这方面的实现来说,并不是一件简单的事情。
所以对于声纹识别这个部分,我们也像人脸识别一样假设,我们实现的声纹识别准确率可以达到90%以上,(实际上可能最高只有80%)。
通过上面介绍的两种找音频切换点的方案:这样也可以像人脸识别一样得到一项列表,也可以将嘉宾实现出来。
具体的声纹识别是怎么样实现的在之后会有所涉及。
三:实验环境
操作系统:Windows 10 pro
编译环境: Python 3.7.4 + Pychram 2019.3 + Jupyter Notebook
视频播放器:potplayer Mini
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
class recoder:
NUM_SAMPLES = 2000 #pyaudio内置缓冲大小
SAMPLING_RATE = 8000 #取样频率
LEVEL = 500 #声音保存的阈值
COUNT_NUM = 20 #NUM_SAMPLES个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
SAVE_LENGTH = 8 #声音记录的最小长度:SAVE_LENGTH * NUM_SAMPLES 个取样
TIME_COUNT = 60 #录音时间,单位s
Voice_String = []
def savewav(self,filename):
wf = wave.open(filename, 'wb')
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(self.SAMPLING_RATE)
wf.writeframes(np.array(self.Voice_String).tostring())
# wf.writeframes(self.Voice_String.decode())
wf.close()
def recoder(self):
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=self.SAMPLING_RATE, input=True,
frames_per_buffer=self.NUM_SAMPLES)
save_count = 0
save_buffer = []
time_count = self.TIME_COUNT
while True:
time_count -= 1
# print time_count
# 读入NUM_SAMPLES个取样
string_audio_data = stream.read(self.NUM_SAMPLES)
# 将读入的数据转换为数组
audio_data = np.fromstring(string_audio_data, dtype=np.short)
# 计算大于LEVEL的取样的个数
large_sample_count = np.sum( audio_data > self.LEVEL )
print(np.max(audio_data))
# 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
if large_sample_count > self.COUNT_NUM:
save_count = self.SAVE_LENGTH
else:
save_count -= 1
if save_count < 0:
save_count = 0
if save_count > 0 :
# 将要保存的数据存放到save_buffer中
#print save_count > 0 and time_count >0
save_buffer.append( string_audio_data )
else:
#print save_buffer
# 将save_buffer中的数据写入WAV文件,WAV文件的文件名是保存的时刻
#print "debug"
if len(save_buffer) > 0 :
self.Voice_String = save_buffer
save_buffer = []
print("Recode a piece of voice successfully!")
return True
if time_count==0:
if len(save_buffer)>0:
self.Voice_String = save_buffer
save_buffer = []
print("Recode a piece of voice successfully!")
return True
else:
return False
if __name__ == "__main__":
r = recoder()
r.recoder()
r.savewav("test.wav")
Python基于OpenCV的人脸表情识别系统[源码&部署教程]
1.项目背景
人脸表情识别是模式识别中一个非常重要却十分复杂的课题。首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾。然后对近期人脸表情识别的方法进行了分类综述。通过对各种识别方法的分析与比较 ,提出了人脸表情识别技术实用化所需要考虑的几个方面 ,进而展望了今后人脸表情识别技术的发展方向。
2.识别效果展示
3.识别视频演示
Python基于OpenCV的人脸表情识别系统[源码&部署教程]_哔哩哔哩_bilibili
4.实现方法分析
人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。
5.实现方法分析
人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。
本设计报告采用人脸检测技术,并进行标记,图像灰度化,图像几何归一化等方法,通过提取出嘴巴,眼睛两个地方的大小变化进行判断。
5.算法流程图
6.fer2013人脸表情数据集简介
Fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(PrivateTest)各3589张,每张图片是由大小固定为48×48的灰度图像组成,共有7种表情,分别对应于数字标签0-6,具体表情对应的标签和中英文如下:0 anger 生气; 1 disgust 厌恶; 2 fear 恐惧; 3 happy 开心; 4 sad 伤心;5 surprised 惊讶; 6 normal 中性。
但是,数据集并没有直接给出图片,而是将表情、图片数据、用途的数据保存到csv文件中,如下图所示,
如上图所示,第一张图是csv文件的开头,第一行是表头,说明每列数据的含义,第一列表示表情标签,第二列即为图片数据,这里是原始的图片数据,最后一列为用途。
7.表情图片提取
知道数据结构以后,就好办了,使用pandas解析csv文件,(pandas的简单用法可以查看这篇博客:https://blog.csdn.net/rookie_wei/article/details/82974277 ),再将原始图片数据保存为jpg文件,并根据用途和标签标签进行分类,分别保存到对应文件夹下,代码比较简单,并且做了详细备注,直接给完整代码如下
代码实现
#encoding:utf-8
import pandas as pd
import numpy as np
import scipy.misc as sm
import os
emotions =
'0':'anger', #生气
'1':'disgust', #厌恶
'2':'fear', #恐惧
'3':'happy', #开心
'4':'sad', #伤心
'5':'surprised', #惊讶
'6':'normal', #中性
#创建文件夹
def createDir(dir):
if os.path.exists(dir) is False:
os.makedirs(dir)
def saveImageFromFer2013(file):
#读取csv文件
faces_data = pd.read_csv(file)
imageCount = 0
#遍历csv文件内容,并将图片数据按分类保存
for index in range(len(faces_data)):
#解析每一行csv文件内容
emotion_data = faces_data.loc[index][0]
image_data = faces_data.loc[index][1]
usage_data = faces_data.loc[index][2]
#将图片数据转换成48*48
data_array = list(map(float, image_data.split()))
data_array = np.asarray(data_array)
image = data_array.reshape(48, 48)
#选择分类,并创建文件名
dirName = usage_data
emotionName = emotions[str(emotion_data)]
#图片要保存的文件夹
imagePath = os.path.join(dirName, emotionName)
# 创建“用途文件夹”和“表情”文件夹
createDir(dirName)
createDir(imagePath)
#图片文件名
imageName = os.path.join(imagePath, str(index) + '.jpg')
sm.toimage(image).save(imageName)
imageCount = index
print('总共有' + str(imageCount) + '张图片')
if __name__ == '__main__':
saveImageFromFer2013('fer2013.csv')
运行完上面的代码后,得到3个文件夹,文件下有相应的表情的子文件夹
子文件夹下又有相应的图片
8.系统整合
9.完整源码&环境部暑视频教程&数据集&自定义UI界面
百度面包多搜索标题名即可下载源码
10.参考文献
- [1]人工心理模型驱动的人脸表情动画合成[J]. 谷学静,许广宾,熊伟,王志良. 计算机工程与应用. 2008(08)
- [2]基于CNN的人脸识别解压助眠微信小程序[J]. 胡文寒,李健喆,曾天伦,沈青. 电脑编程技巧与维护. 2022(08)
- [3]小波变换在人脸表情识别研究中的应用[J]. 崔景霞. 长春理工大学学报(自然科学版). 2011(03)
- [4]基于活动外观模型的人脸表情分析与识别[J]. 左坤隆,刘文耀. 光电子·激光. 2004(07)
- [5]人脸表情识别方法综述[J]. 陈俊. 中国集体经济. 2009(16)
- [6]基于语义属性的人脸表情识别新方法[J]. 于永斌,刘清怡,毛启容,詹永照. 小型微型计算机系统. 2016(02)
- [7]人脸表情特征提取方法的研究进展[J]. 乔明,陈亚军. 重庆工学院学报(自然科学版). 2008(06)
- [8]人脸表情自动识别技术研究进展[J]. 张家树,陈辉,李德芳,罗小宾,夏小东. 西南交通大学学报. 2005(03)
- [9]基于多群体遗传算法的人脸表情识别[J]. 朱娅妮,吴国华,杜加友. 杭州电子科技大学学报. 2013(01)
- [10]基于生成对抗网络的人脸表情数据增强方法[J]. 孙晓,丁小龙. 计算机工程与应用. 2020(04)
以上是关于基于Python的视频中的人脸识别系统设计与实现的主要内容,如果未能解决你的问题,请参考以下文章
python实现人脸识别系统设计_基于ROS的人脸识别系统设计与实现
Python基于OpenCV的人脸表情识别系统[源码&部署教程]