引言
如果关注Kaggle 机器学习项目的同学,一定很熟悉人脸关键点检测这个任务,在2013 年的时候,ICML举办一个的challgene,现在放在kaggle 上作为 一种最常规kaggle入门任务而存在。
本文的主要目的在于验证深度学习模型在人脸点检测效果,踩踩里面的坑。
任务介绍
人脸关键点检测,也称之为人脸点检测,是在一张已经被人脸检测器检测到的人脸图像中,再进一步检测出五官等关键点的二维坐标信息,以便于后期的人脸对齐(face alignment)任务。
根据不同的任务,需要检测的关键点数目有多有少,有些仅要求检测2只眼睛的坐标位置,有些要求检测眼睛、嘴巴、鼻子的5个坐标位置,还有更多的,68个位置,它包含了五官的轮廓信息。
如图所示:
根据任务,可以把要学习的模型函数表示为:
Y=F(X,W)
其中,X 是输入的人脸图像,W是我们要学习的模型参数,Y∈[(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)] 是我们需要检测的人脸点坐标位置。
这是一个典型的回归问题,可以采用最简单的平方误差损失函数,然后用机器学习方法学习这个模型。
Loss=15∑i=15((xi?xi′)2+(yi?yi′)2)
其中(xi,yi)为预测的位置,(xi′,yi′) 为标注的关键点位置。
很显然,也很容易的就将该任务放到caffe中进行学习。
实验过程:
数据准备
由于港中文[1]他们有公开了训练集,所以我们就可以直接使用他们提供的图像库就好了。
数据是需要转化的:
1、框出人脸图像部分,从新计算关键点的坐标
2、缩放人脸框大小,同时更新计算的关键点坐标
3、一些数据增强处理:我只采样了左右对称的增强方法(还可以采用的数据增强方法有旋转图像,图像平移部分)
转换脚本如下:
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 04 16:36:33 2015
@author: RiweiChen
"""
import skimage
import skimage.io
import numpy as np
import cv2
def face_draw_point(filelist,savePath):
'''
人脸的剪切
'''
fid = open(filelist)
lines = fid.readlines()
fid.close()
for line in lines:
words = line.split(' ')
filename = words[0]
#im=skimage.io.imread(filename)
im=cv2.imread(filename)
#保存人脸的点,需要经过转换
point = np.zeros((10,))
point[0]=float(words[5])
point[1]=float(words[6])
point[2]=float(words[7])
point[3]=float(words[8])
point[4]=float(words[9])
point[5]=float(words[10])
point[6]=float(words[11])
point[7]=float(words[12])
point[8]=float(words[13])
point[9]=float(words[14])
for i in range(0,10,2):
#skimage.draw.circle(point[i+1],point[i])
cv2.circle(im, (int(point[i]),int(point[i+1])), 5, [0,0,255])
#skimage.io.imsave(savePath+filename,imcrop)
cv2.imwrite(savePath+filename,im)
#print words[0]
#print words[1]
def face_prepare(filelist,fileout,savePath,w,h):