读研期间对视频图像处理很感兴趣,从研一开始自学Python和AI相关的知识,到目前面临找工作时期,才发现做项目学习这么久的过程中一直在看别人的博客学习,然而没有好好写一次博客,于是把自己做的一个项目简单地介绍下相当于一个纪念吧。另外项目的传送门:https://github.com/junchou9463
1 概述
对人脸的研究一直是个很有意思的话题,从刚开始的人脸特征提取,如Hog特征,然后根据Hog特征进行人脸识别,行人检测等一系列的应用。这些都是很早的研究,后面我根据这些年对人脸的研究做了一系列的开发应用,包括:1.人脸比对识别登陆 2.人脸性别,表情识别 3.人脸眼动跟踪识别 4.人脸姿态识别 5.人脸运动单元的识别 6.人的心率呼吸速率血氧饱和度的获取 7.人脸的血流标注 8.程序打包等。接下来是相关的介绍。
2 人脸比对识别登陆
Dlib库有个方法是 face_recognition_model_v1.compute_face_descriptor,可以通过Cnn获取人脸128维的特征,所以我们可以将摄像头获取的人脸图像进行特征提取然后和数据库里的进行比对,找出偏差最小的那一项对应的姓名即是用户名,下面是相应的代码:
rects = detector(rgbImage, 0)
if len(rects)> 0:
largest_face=max(rects, key=lambda rect: rect.width() * rect.height())
shape = predictor(rgbImage, largest_face)
face_rec = face_rec_model.compute_face_descriptor(rgbImage, shape)
files = os.listdir(path)
for file in files: # 遍历文件夹
video_folder = os.path.join(path, file)
data1 = np.load(video_folder)
diff = np.linalg.norm(data1 - data2)
if (diff < 0.6):
(name, format_name) = file.split('.')
return name
3 人脸性别,表情识别
通过Keras训练IMDB和fer2013数据库可以得到性别和表情的分类模型,后面只需加载该训练模型,然后提取人脸区域进行识别分类即可,训练代码和调用方式如下:
# -*- coding:utf-8 -*-
# Author:Jun
from keras.callbacks import CSVLogger, ModelCheckpoint, EarlyStopping
from keras.callbacks import ReduceLROnPlateau
from keras.preprocessing.image import ImageDataGenerator
from models.cnn import mini_XCEPTION
from utils.datasets import DataManager
from utils.datasets import split_data
from utils.preprocessor import preprocess_input
# parameters
batch_size = 32
num_epochs = 10000
input_shape = (64, 64, 1)
validation_split = .2
verbose = 1
num_classes = 7
patience = 50
base_path = '../trained_models/emotion_models/'
# data generator
data_generator = ImageDataGenerator(
featurewise_center=False,
featurewise_std_normalization=False,
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=.1,
horizontal_flip=True)
# model parameters/compilation
model = mini_XCEPTION(input_shape, num_classes)
model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
datasets = ['fer2013']
for dataset_name in datasets:
print('Training dataset: