python面部表情识别,微信表情识别
文章目录前言一、人脸旋转二、人脸裁剪
前言微表情识别类似于表情识别,在处理时的不同之处在于微表情的关注区域是特定的(AU),所以我们在裁剪人脸的时候也是主要获得该区域,我们实验室之前用的都是矩阵实验室代码,刚刚把它转为了大蟒代码。
一、人脸旋转方法就是采用dlib68模型找到双眼的位置,计算需要旋转的角度,然后做仿射变换,代码如下
导入cv2导入dlibimport numpy作为np#脸部旋转函数def face_rotate(img,left_eye_x,left_eye_y,right_eye_x,right_eye_y): center_x,center _ y=int((left _ eye _ x right _ eye _ x)/2),int((left _ eye _ y right _ eye _ y)//2)dx,dy=right_eye_x - left_eye_x,right_eye_y - left_eye_y #计算角度角度=np。度(np.arctan2(dy,dx)) #计算仿射矩阵翘曲矩阵=cv2。getrotationmatrix 2d((center _ x,center_y),角度,1) #进行仿射变换,即旋转rotated_img=cv2.warpAffine(img,warp_matrix,(img.shape[1],img.shape[0]))返回rotated_img#脸部剪裁函数def face_crop(img,左眼x,左眼y,右眼x,右眼y, noise _ y):x _ min=left _ eye _ x-(right _ eye _ x-left _ eye _ x)y _ min=int((left _ eye _ y right _ eye _ y)/2-(noise _ y-(left _ eye _ y right _ eye _ y)/2))width=3 *(right _ eye _ x-left _ eye _ x)height=3 *(noise _ y-(left _ eye _ y right _ eye _ y)//2)return img[y _ min:y _ min height,x_min:x_min width]#加载模型predictor _ model=r c:\ users \ S \ Desktop \ python \ model \ dlib \ shape _ predictor _ 68 _ face _ landmarks。 dat detector=dlib。get _ frontier _ face _ detector()predictor=dlib。形状预测器(预测器模型)# cv2读取图像test _ film _ path=r c:\ Users \ S \ Desktop \ img 1024-model \ 0082。png img=cv2。im read(测试_电影_路径)#取灰度,检测人脸img_gray=cv2.cvtColor(img,cv2 .COLOR_RGB2GRAY)rects=范围内我的检测器(img_gray,0)(len(rects)):landmark=NP。matrix([[p . x,p.y] for p in predictor(img,rects[i]).parts()]) left_eye_x,left_eye_y=landmarks[39][0,0],landmarks[39][0,1] right_eye_x,right_eye_y=landmarks[42][0,0],landmarks[42][0,1] noise_x,noise_y=landmarks[33][0,0],landmarks[33][0,1] rotated_img=face_rotate(img,left_eye_x,left_eye_y,right_eye_x,right_eye_y)效果:
二、人脸裁剪方法就是根据双眼和鼻子的位置,向左右各扩展双眼的长度,向上下各扩展眼睛到鼻子的垂直距离,代码如下:
导入cv2导入dlibimport numpy作为np#脸部旋转函数def face_rotate(img,left_eye_x,left_eye_y,right_eye_x,right_eye_y): center_x,center _ y=int((left _ eye _ x right _ eye _ x)/2),int((left _ eye _ y right _ eye _ y)//2)dx,dy=right_eye_x - left_eye_x,right_eye_y - left_eye_y #计算角度角度=np。度(np.arctan2(dy,dx)) #计算仿射矩阵翘曲矩阵=cv2。getrotationmatrix 2d((center _ x,center_y),角度,1) #进行仿射变换,即旋转rotated_img=cv2.warpAffine(img,warp_matrix,(img.shape[1],img.shape[0]))返回rotated_img#脸部剪裁函数def face_crop(img,左眼x,左眼y,右眼x,右眼y, noise _ y):x _ min=left _ eye _ x-(right _ eye _ x-left _ eye _ x)y _ min=int((left _ eye _ y right _ eye _ y)/2-(noise _ y-(left _ eye _ y right _ eye _ y)/2))宽度=3 *(右眼x -左眼x)高度=3 *(noise _ y-(左_ eye _ y右_ eye _ y)//2)#下面这个返回的是完全按照规则裁的# return img[y_min:y_min高度,x分钟:x分钟宽度] #下面这个,得到的是一张长宽相同的图croped _ img=img[y _ min:y _ min height,left _ eye _ x(right _ eye _ x-left _ eye _ x)//2-3 *(noise _ y-(left _ eye _ y right _ eye _ y)//2:left _ eye _ x(right _ eye _ x-left _ eye _ x)//2 3 *(noise _ y-(left _ eye _ y right _ eye _ y)//2]#这里调整大小有两种方法可以得到深度学习所需要的数据,一是将后面长宽不同的图拉伸为224(一般是224); 二是将后面长宽相同的图简单调整大小一下,这里设的是128,有特殊用途,一般是224 resize _ img=cv2。resize(croped _ img,(128,128),插值=cv2 .区间_区域)返回resize_img#加载模型predictor _ model=r c:\ Users \ S \ Desktop \ python \ model \ dlib \ shape _ predictor _ 68 _ face _ landmarks。dat detector=dlib。get _ frontier _ face _ detector()predictor=dlib。形状预测器(预测器模型)# cv2读取图像test _ film _ path=r c:\ Users \ S \ Desktop \ train \ \ 0720。jpg img=cv2。im read(测试_电影_路径)#取灰度,检测人脸img_gray=cv2.cvtColor(img,cv2 .COLOR_RGB2GRAY)rects=范围内我的检测器(img_gray,0)(len(rects)):landmark=NP。matrix([[p . x,p.y] for p in predictor(img,rects[i]).parts()]) left_eye_x,left_eye_y=landmarks[39][0,0],landmarks[39][0,1] right_eye_x,right_eye_y=landmarks[42][0,0],landmarks[42][0,1] noise_x,noise_y=landmarks[33][0,0],landmarks[33][0,1] # rotated_img=face_rotate(img,left_eye_x,left_eye_y,right_eye_x,right_eye_y效果:
这样就基本包含了常见的澳大利亚区域,可以送进网络进行训练了
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。