使用CNN检测脸部关键点教程(一)

目录: 

1, 环境需求 

2, 数据介绍 

3, 模型卷积神经网络  

4, 测试卷积神经网络的性能

第一部分:环境需求

注意:如果你只想看一遍教程其实不需要非要把这里的代码跑一遍,但如果你手头有支持CUDA的GPU,并想按照教程的步骤执行代码的话,下面提供一些指导: 

1, 假设你支持CUDA的GPU已经应该安装的配套环境已经就绪,Python3.6.x,numpy,pandas,matplotlib,scikit-learn 、tensorflow-gpu1.4、keras2.x都已经安装好。 

第二部分 数据介绍

对 Facial Keypoint Detection这个竞赛来说,训练集是96*96的灰度图:(数据连接:链接:https://pan.baidu.com/s/1XBswM0Xiz9QwcdddYnB_Hw 密码:xym7)

15个特征点分别是: 

左、右眼中心,2 

左、右眼外侧点,2 

左、右眼内侧点,2 

左、右眉毛外侧点,2 

左、右眉毛内侧点,2 

左、右嘴角,2 

上、下唇中心,2 

鼻尖,1

一个有趣的意外是,整个样本集合对有的特征点来说有7000个训练样本,然而对有的点只有2000个。下面来读取数据:

import os

import numpyas np

from pandas.io.parsersimport read_csv

from sklearn.utilsimport shuffle

FTRAIN ='training.csv'

FTEST ='test.csv'

def load(test=False, cols=None):

"""Loads data from FTEST if *test* is True, otherwise from FTRAIN.

Pass a list of *cols* if you're only interested in a subset of the

target columns.

"""

    fname = FTESTif testelse FTRAIN

df = read_csv(os.path.expanduser(fname))# load pandas dataframe

#  The Image column has pixel values separated by space; convert

# the values to numpy arrays:

    df['Image'] = df['Image'].apply(lambda im: np.fromstring(im, sep=' '))

if cols:# get a subset of columns

        df = df[list(cols) + ['Image']]

print(df.count())# prints the number of values for each column

    df = df.dropna()# drop all rows that have missing values in them

    X = np.vstack(df['Image'].values) /255.  # scale pixel values to [0, 1]

    X = X.astype(np.float32)

if not test:# only FTRAIN has any target columns

        y = df[df.columns[:-1]].values

y = y  /96 # scale target coordinates to [-1, 1]

        X, y = shuffle(X, y, random_state=42)# shuffle train data

        y = y.astype(np.float32)

else:

y =None

    return X, y

X, y = load()

print("X.shape == {}; X.min == {:.3f}; X.max == {:.3f}".format(

X.shape, X.min(), X.max()))

print("y.shape == {}; y.min == {:.3f}; y.max == {:.3f}".format(

y.shape, y.min(), y.max()))

读取结果如下:

left_eye_center_x 7039

left_eye_center_y            7039

right_eye_center_x          7036

right_eye_center_y          7036

left_eye_inner_corner_x      2271

left_eye_inner_corner_y      2271

left_eye_outer_corner_x      2267

left_eye_outer_corner_y      2267

right_eye_inner_corner_x    2268

right_eye_inner_corner_y    2268

right_eye_outer_corner_x    2268

right_eye_outer_corner_y    2268

left_eyebrow_inner_end_x    2270

left_eyebrow_inner_end_y    2270

left_eyebrow_outer_end_x    2225

left_eyebrow_outer_end_y    2225

right_eyebrow_inner_end_x    2270

right_eyebrow_inner_end_y    2270

right_eyebrow_outer_end_x    2236

right_eyebrow_outer_end_y    2236

nose_tip_x                  7049

nose_tip_y                  7049

mouth_left_corner_x          2269

mouth_left_corner_y          2269

mouth_right_corner_x        2270

mouth_right_corner_y        2270

mouth_center_top_lip_x      2275

mouth_center_top_lip_y      2275

mouth_center_bottom_lip_x    7016

mouth_center_bottom_lip_y    7016

Image                        7049

dtype: int64

X.shape == (2140, 9216); X.min == 0.000; X.max == 1.000

y.shape == (2140, 30); y.min == 0.040; y.max == 0.998

Process finished with exit code 0

这个结果告诉我们,很多图的特征点是不全的,比如右唇角,只有2267个样本。我们丢掉所有特征点不到15个的图片,这一行做了这件事: 

df = df.dropna() # drop all rows that have missing values in them 

用剩下的2140张图片作为训练集训练我们的网络。

另外一个值得注意的地方是,我们在读取数据的函数中,把图片像素值从0~255缩放到[0,1]之间,目标值(特征点的位置)也从0~95放缩到[0,1]之间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容