学习来源:https://www.cnblogs.com/neo-T/p/6477378.html
原博主写得非常详细,我只是用他的代码实现一遍,修改的地方不多,把一些遇到的问题记录一下而已,更详细的讲解建议去看原博主的。
修改:
- 出现 ModuleNotFoundError: No module named ‘sklearn.cross_validation’ 问题:sklearn.cross_validation是sklearn老版本的模块,新版本都迁移到了sklearn.model_selection。修改代码为
from sklearn.model_selection import train_test_split
- TypeError: softmax() got an unexpected keyword argument ‘axis’:keras 2.1.6的softmax没有axis这个参数了,回退一下:
pip install keras==2.1
- 图片没有被缩放到64*64:原博客好像在调用了resize后没有加cv2.imwrite(full_path, image),所以未保存。
- 原博主是分段来的,每次贴上一段代码然后进行解释,清晰明了。我直接把代码全贴上了,训练和测试改一下注释就好。
#图片缩放代码:
#在原博主的基础上进行了一些修改:
#1.原本把每一帧截图下来的时候就已经是正方形了,所以不需要调整形状,直接缩放就好了
#2.添加了cv2.imwrite(full_path, image)保存好缩放到64*64后的
#3.把控制台输入路径直接用了 path = "D:\\pycharm\\MyWorks\\MyFace\\data"
# -*- coding: utf-8 -*-
import os
import numpy as np
import cv2
IMAGE_SIZE = 64
images = []
labels = []
def read_path(path_name):
for dir_item in os.listdir(path_name):
# 从初始路径开始叠加,合并成可识别的操作路径
full_path = os.path.abspath(os.path.join(path_name, dir_item))
if os.path.isdir(full_path): # 如果是文件夹,继续递归调用
read_path(full_path)
else: # 文件
if dir_item.endswith('.jpg'):
image = cv2.imread(full_path)
image = cv2.resize(image, (IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_CUBIC)
cv2.imwrite(full_path, image)
images.append(image)
labels.append(path_name)
return images, labels
# 从指定路径读取训练数据
def load_dataset(path_name):
images, labels = read_path(path_name)
images = np.array(images)
print(images.shape)
#pm是我的人脸数据所在文件夹标注为0,另一个是我室友的标注为1
labels = np.array([0 if label.endswith('pm') else 1 for label in labels])
return images, labels
path = "D:\\pycharm\\MyWorks\\MyFace\\data"
if __name__ == '__main__':
images, labels = load_dataset(path)
#模型建立、保存与评估
# -*- coding: utf-8 -*-
import cv2
import random
from sklearn.model_selection import train_test_split
from keras.preproce