/Multi_feature_MER

基于多特征融合的微表情识别

Primary LanguagePython

环境说明:
python	3.6.10
numpy	1.19.0
pandas	1.0.1
sklearn	0.22.1
cv2	3.3.1
scipy	1.4.1
tensorflow 2.2.0
dlib	19.6.1
imutils	0.5.3
pillow	7.2.0
xlrd	1.2.0
CUDA	None


1.Local_weighted_mean_register.py

用于裁剪以及配准人脸,包含类LWMRegister(standard_face, predictor_path, width=192, height=192, offset=24)

standard_face:	作为标准人脸的图像,不用经过裁剪
predictor_path:	dlib预训练人脸predictor所在地址
width, height:	目标图像的宽与高
offset:		为了避免映射超出图像边缘,在配准前给图像边缘留出的空余

使用方法:调用LWMRegister.run(face_seq, n = 6, amplify = 1.2, aligned=False)

face_seq: 	需要裁剪与配准的人脸图像序列
n:	计算LWM时采用的相邻点个数
amplify:	在配准时对图像进行一定比例的放大,避免映射超出图像边缘
aligned:	True表示face_seq已经经过裁剪、对齐,False表示没有经过


2.Eulerian_video_magnification.py

用于对视频(图像序列)进行动作放大,包含类EVM(fps=200, low=0.2, high=2.4, level=6, alpha=8, lam_c=16, iq_reduce=0.1)

fps:	视频的帧率
low, high:	动作放大的频率区间
level:	构建拉普拉斯金字塔的层数
alpha:	动作放大的倍数
lam_c:	参数,用于调节被放大的动作大小的上限deta
iq_reduce: 程序将图像转到YIQ颜色空间进行动作放大,iq_reduce表示对IQ通道的缩放倍数,缩小IQ可以减小噪声

使用方法: 调用EVM.run(img_seq)
img_seq: 被放大的图像序列


3.Temporal_interpolation_model.py

用于对图像序列进行时域插值,实现帧数的上采样或下采样,包含类TIM()
使用方法:调用TIM.run(image_seq, target_length)

image_seq:	需要被插值的图像序列
target_length:	目标帧数


4.Features_extraction.py

用于提取图像序列的特征,包括LBP-TOP、3DHOG、HOOF
使用方法:调用函数	get_ep_features(ep, uniform_dict = None, feature='LBP-TOP', t_times=4, y_times=4, x_times=4,
                    			x_radius = 1, y_radius = 1, t_radius = 4, xy_neighbor=8, xt_neighbor=8, yt_neighbor=8,
                    			xy_bins = 8, xt_bins = 12, yt_bins = 12,
                    			bins=8)

ep:		提取特征的图像序列
uniform_dict:	用于减小LBP-TOP特征维度,只有LBP-TOP特征需要
feature:		可选'LBP-TOP', '3DHOG', 'HOOF'
t_times, y_times, x_times:	将图像序列在t, y, x三个维度分成多少子块提取特征,推荐LBP-TOP的t_times=1
x_radius, y_radius, t_radius, xy_neighbor, xy_neighbor, yt_neighbor: 	LBP-TOP参数
xy_bins, xt_bins, yt_bins:	3DHOG参数
bins:		HOOF参数


5.Classification_and_evaluation.py

使用svm评估模型的分类效果,并输出最高的metric以及对应参数,使用方法:
调用函数get_best_average(data, labels, sub_list, kernel='linear', split='loso', average='macro')

data: 	特征数据
labels:	数据标签
sub_list:	每条数据属于哪个subject, 在程序中直接设置为df.Subject
kernel:	选择svm的核函数,可选'linear', 'poly', 'rbf'
split:	分割数据方式,可选'loso', '10-fold'
average:	计算Average F1-score的权重选择,可选'macro', 'micro',  'weighted'

查看某一特定参数下的分类效果,调用avg_score(data, label, sub_list, kernel='rbf', C=2, gamma=10, degree=3, decision_function_shape='ovr',
              					n_splits=10, split='loso', seed=7, average='macro')
data, label, sub_list, kernel, split, average:  同上
C, gamma, degree: 			svm参数
decision_function_shape: 		可选'ovo'与'ovr',推荐'ovr'
n_splits:				k-fold验证的fold数
seed:				k-fold划分的随机数种子

6.main.py

将上述文件与main.py放在同一目录下,直接运行main.py:
a. 从同目录下的CASME II文件夹中提取数据,文件夹的结构为CASME II/subject_name/ep_name/image
b. 程序所需文件在CASME II文件夹下,分别为CASME2.xlsx, shape_predictor_68_face_landmarks.dat, UniformLBP8.txt
c. 程序将CASME II中第一个表情的第一张图片作为标准面部图像,对所有图像序列进行裁剪与配准,得到192*192的图像序列
d. 将配准后的结果存入result/lwm_result.npy中
e. 随后程序对图像序列进行动作放大,其中放大频率区间为[0.2Hz, 2.4Hz], 放大因子为8
f. 随后对图像序列进行时序插值,目标帧数为10帧
g. 随后对图像序列提取LBP-TOP、3DHOG、HOOF特征,存放于result/features/LBP_feature.npy (或HOG_feature.npy, HOOF_feature.npy)
h. 随后分别对特征使用svm进行分类,输出最好的分类结果与对应的svm参数

注意,main.py中参数并非最优,在实际使用时注意调整参数(包括TIM目标帧数、动作放大因子、特征提取分块数等)