感谢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