人脸对齐 python代码

来源:互联网 发布:淘宝优惠券群推广 编辑:程序博客网 时间:2024/06/18 14:15
本文人脸对齐,基于Deep Convolutional Network Cascade for Facial Point Detection进行,将双眼、鼻尖、双嘴角(共五点)校准至同一位置,为人脸识别的预处理环节
参考:https://github.com/RiweiChen/FaceTools
           http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm

有可能报错UnicodeEncodeError: 'ascii' codec can't encode character,可在文件头添加

import sys  

reload(sys)  

sys.setdefaultencoding('utf-8') 

注意:此种方法造成print函数无法输出

在Python安装目录下的lib\site-packages文件夹,新建sitecustomize.py,文件中的代码为:

import sys  

sys.setdefaultencoding('utf-8')   

即可解决输出问题
[python] view plain copy
  1. import os  
  2. import cv2  
  3. import glob  
  4. import struct  
  5. import numpy as np  
  6. from skimage import io  
  7.   
  8. ImagePath = 'xxx'       
  9. PointPath = 'xxx'      
  10. AlignPath = 'xxx'    
  11.   
  12. print 'Face Alignment - Get Image List. step(1/6)'  
  13.   
  14. if not os.path.exists('output'):    
  15.     os.makedirs('output')  
  16.   
  17. lines = []     
  18. def getImageList(filePath):  
  19.     dirlist = os.listdir(filePath)  
  20.     for dirs in dirlist:       
  21.         if os.path.isdir(os.path.join(filePath,dirs)):    
  22.             getImageList(os.path.join(filePath,dirs))  
  23.     for filename in glob.glob(filePath+'/*.jpg'):         
  24.         lines.append(filename)  
  25. getImageList(ImagePath)  
  26.   
  27. text = str(len(lines))  
  28. lines.insert(0,text)  
  29.   
  30. imagelist = './output/imagelist.list'     
  31. file0 = open(imagelist,'w')  
  32. for i in range(len(lines)):  
  33.     file0.write(lines[i]+'\n')  
  34. file0.close()   

step1 获取图像列表

为了匹配人脸检测的格式需求,需要在文件列表头添加文件数目

[python] view plain copy
  1. print 'Face Alignment - Face Detection. step(2/6)'  
  2.   
  3. facelist = './Output/facelist.list'  
  4. os.system('FacePartDetect.exe data '+imagelist+' '+facelist)  
step2 人脸检测
# 参考 Y. Sun, X. Wang, and X. Tang. Deep Convolutional Network Cascade for Facial Point Detection. InProceedings
   of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)
, 2013.
# http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm
下载后,将FacePartDetect.exe、data拷贝至当前文件夹
[python] view plain copy
  1. print 'Face Alignment - Face Detection Refine. step(3/6)'  
  2.   
  3. def find_max_face(line):  
  4.     word = line.split()  
  5.     num_detect = len(word)/4  
  6.     areas = np.empty([num_detect],dtype=np.int32)   
  7.     for i in range(num_detect):  
  8.         areas[i]=(int(word[4*i+2])-int(word[4*i+1]))*(int(word[4*i+4])-int(word[4*i+3]))  
  9.     m = np.argmax(areas)  
  10.     line_refine = word[0]+' '+word[4*m+1]+' '+word[4*m+2]+' '+word[4*m+3]+' '+word[4*m+4]+'\n'  
  11.     return line_refine  
  12.   
  13. facelist_refine = './Output/facelist_refine.list'  
  14. file1 = open(facelist,'r')  
  15. file2 = open(facelist_refine,'w')  
  16. for line in file1.readlines():     
  17.     if line.count(" ")==4:  
  18.         newline = line.replace(ImagePath,'')  
  19.         file2.write(newline.split('\\')[-1])  
  20.     else:  
  21.         if line.count(" ")>4:   
  22.             newline = find_max_face(line)  
  23.             file2.write(newline.split('\\')[-1])  
  24. file1.close()  
  25. file2.close()  
step3 人脸检测校准
去除没检测到人脸或检测到多个人脸(取最大人脸)的情况
[python] view plain copy
  1. print 'Face Alignment - Point Detection. step(4/6)'  
  2.   
  3. pointbin = './Output/pointlist.bin'  
  4. os.system('TestNet.exe '+facelist_refine+' '+ImagePath+' Input '+pointbin)  
step4 特征点检测
# 参考 Y. Sun, X. Wang, and X. Tang. Deep Convolutional Network Cascade for Facial Point Detection. In Proceedings 
   of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)
, 2013.
# http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm
下载后,将TestNet.exe、Input、tbb.dll、opencv_core231.dll、opencv_highgui231.dll、opencv_imgproc231.dll拷贝至当前文件夹
[python] view plain copy
  1. print 'Face Alignment - Get Points File. step(5/6)'  
  2.   
  3. pointlist = './Output/pointlist.list'  
  4.   
  5. file3 = open(pointbin,'rb');  
  6. imageNum = struct.unpack('i',file3.read(4))[0]  
  7. pointNum = struct.unpack('i',file3.read(4))[0]  
  8. for i in range(imageNum):  
  9.     valid = struct.unpack('b',file3.read(1))  
  10. pointData = np.empty((2*pointNum * imageNum,1),dtype = np.float64)  
  11. k = 0  
  12. for i in range(imageNum):  
  13.     for j in range(pointNum*2):  
  14.         pointData[k] = struct.unpack('d',file3.read(8))  
  15.         k = k+1  
  16. points = np.reshape(pointData,(imageNum,2*pointNum))  
  17. file3.close()  
  18.   
  19. file4 = open(facelist_refine,'r')  
  20. file5 = open(pointlist,'w')  
  21. for i in range(imageNum):  
  22.     fn = file4.readline().split()[0]   
  23.     file5.write(fn)  
  24.     for j in range(10):  
  25.         file5.write(' '+str(int(points[i][j])))  
  26.     file5.write('\n')  
  27.   
  28.     img = io.imread(os.path.join(ImagePath,fn))  
  29.     for j in range(5):  
  30.         cv2.circle(img,(int(points[i][j*2+0]),int(points[i][j*2+1])),3,(255,0,0),-1)  
  31.     io.imsave(os.path.join(PointPath,fn),img)  
  32.   
原创粉丝点击