利用CNN判断CelebA数据集中人脸是否戴眼镜

感谢Cloudox_
按照大神的教程跑了一遍程序,兴奋 ~
按捺住激动的心情总结一下,哈哈哈。

主要流程:1.数据预处理 2.网络结构 3. 训练和测试

1.数据预处理
实验用的是CelebA人脸数据集,每张人脸含有多个标签,所以要先根据标签把有没有戴眼镜分类一下。

数据集示例

然后,使用python face_recognition把人脸从图像中分割出来,使得人脸能充满整个图像(非常好用!)

import face_recognition
import os 
import cv2
import matplotlab.pyplot as plt

files = os.listdir(img_path)

fig = plt.figure()
imgs = []
for idx,f in enumerate(files):
    img = face_recognition.load_image_file(img_path+f)
    face_locations = face_recognition.face_locations(img)
    for face_location in face_locations:
        top,right,bottom,left = face_location
        width = right-left
        height = bottom-top
        # 方形人脸
        if(width>height):
            right -= (width-height)
        elif(height>width):
            bottom -= (height-width)
   
    face_image = img[top:bottom,left:right]
    reshaped_img = cv2.resize(face_image,(100,100))

    ax = fig.add_subplot(1,len(files),idx+1) 
    ax.imshow(reshaped_img)
    ax.axis('off')
    imgs.append(reshaped_img)

这是我在网上找的几张图片用来做测试,在测试的时候也要crop和resize一下。


测试图片

因为卷积网络需要固定输入图片的大小,所以把训练图片resize成(100,100)的大小(这里可能改成2的指数会更好,因为每次卷积和池化都会缩小原图的一半)。

2.构建网络
CNN+FC 的结构:
卷积网络用来提取特征,全连接用来分类。


卷积分类网络

3.训练和测试
上述网络结构,batch_size=64,epoch=50 在CPU上训练了一天(心好累...),训练精度达到97%,验证精度达到95%,在网上找的几张图上测试了一下结果,是正确的。


训练结果

训练结果

红色是训练精度,蓝色是验证精度。
训练结果

测试的时候有一点疑问:在训练的时候 logits = inference(x,True,regularizer)把第二个参数设置成True,这样就在全连接层引入了dropout正则化方法,使每一次迭代的结果都不太一样。在测试的时候,恢复了模型的图结构和参数,这里有没有加dropout呢?我用同样的数据测试了两遍,得到的结果不太一样,第二张图会被误分(@.@)
测试结果

放上我用jupyter notebook写的程序:cnn_classify

你可能感兴趣的:(利用CNN判断CelebA数据集中人脸是否戴眼镜)