人脸识别模型训练集处理
前面已经实现将人脸拍摄下来存储在traindata文件夹内,但是这还不够,我们需要对测试图片进行大小的调整,因为有些图片的格式长短不一样,这样对于后面我们训练模型不方便处理,而且较大的图片文件处理运算量也非常大。
这里再次说一下问价夹的存放形式,不然无法读取,程序无法执行,如果看懂了程序,稍加改动其实还是可以适应不同的文件夹形式
这里先贴上代码,所有详细的解释都在注释上
# -*- coding: utf-8 -*-
import os
import numpy as np
import cv2
IMAGE_SIZE = 64
# 按照指定图像大小调整尺寸
def resize_image(image, height=IMAGE_SIZE, width=IMAGE_SIZE):
top, bottom, left, right = (0, 0, 0, 0)
# 获取图像尺寸
h, w, _ = image.shape
# 对于长宽不相等的图片,找到最长的一边
longest_edge = max(h, w)
# 计算短边需要增加多上像素宽度使其与长边等长
if h < longest_edge:
dh = longest_edge - h
top = dh // 2
bottom = dh - top
elif w < longest_edge:
dw = longest_edge - w
left = dw // 2
right = dw - left
else:
pass
# RGB颜色
BLACK = [0, 0, 0]
# 给图像增加边界,是图片长、宽等长,cv2.BORDER_CONSTANT指定边界颜色由value指定
constant = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)
# 调整图像大小并返回
return cv2.resize(constant, (height, width))
# 读取训练数据i
images = []
labels = []
def file_exit(path_name,son_path_name):#判断path_name文件夹下是否有file_name
lists = os.listdir(path_name)#该目录下的所有文件夹
for list in lists:#遍历所有文件,如果存在与son_path_name同名的文件夹,返回1即找到测试集文件
if list == son_path_name:
print ('file exits')
return 1
return 0
def read_path(path_name,son_path_name):#读取路径下的数据集,并为每张图片添加一个类别标签
parent_path = os.path.abspath(os.path.join(path_name, '..'))
exit_code=file_exit(parent_path,son_path_name)#判断该路径下是否有测试集目录
if exit_code == 1:#如果有,则全路径是当前路径上一级+测试集文件夹名
fullpath = parent_path +'/'+ son_path_name
for dir_item in os.listdir(fullpath):#遍历所有的图片
if dir_item.endswith('.jpg'):#如果格式是图片,则进行大小处理
image = cv2.imread(fullpath+'/'+dir_item)
image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)
images.append(image)
labels.append(son_path_name)
print labels
return images, labels
# 从指定路径读取训练数据,path_name是当前文件所在路径,son_path_name是需要寻找的存放测试数据的子目录名
def load_dataset(path_name,son_path_name):
images, labels = read_path(path_name,son_path_name)#读取子目录下的所有测试数据集
# 将输入的所有图片转成四维数组,尺寸为(图片数量*IMAGE_SIZE*IMAGE_SIZE*3)
# IMAGE_SIZE为64,故对我来说尺寸为1200 * 64 * 64 * 3
# 图片为64 * 64像素,一个像素3个颜色值(RGB)
images = np.array(images)
print(images.shape)
# 标注数据,'traindata'文件夹下都是训练集的脸部图像,全部指定为0,另外一个文件夹下是测试集的,全部指定为1
labels = np.array([0 if label==('traindata') else 1 for label in labels])
print labels
return images, labels
if __name__ == '__main__':
path_name=os.getcwd()#getcwd()获取当前.py文件所在目录,加载与此目录所在路径上一级的traindata文件夹下的所有训练文件
images, labels = load_dataset(path_name,'traindata')
原博主是对文件夹的一些操作进行全部处理,这种处理方式在我看来不是很好,这里自己代码自己进行重写和添加一些自己的方法,进行文件夹的读取和操作,对于相关的文件夹的处理操作可以参见:python——【转载】os操作文件目录
主要的文件操作代码在:
def file_exit(path_name,son_path_name):#判断path_name文件夹下是否有file_name
lists = os.listdir(path_name)#该目录下的所有文件夹
for list in lists:#遍历所有文件,如果存在与son_path_name同名的文件夹,返回1即找到测试集文件
if list == son_path_name:
print ('file exits')
return 1
return 0
def read_path(path_name,son_path_name):#读取路径下的数据集,并为每张图片添加一个类别标签
parent_path = os.path.abspath(os.path.join(path_name, '..'))
exit_code=file_exit(parent_path,son_path_name)#判断该路径下是否有测试集目录
if exit_code == 1:#如果有,则全路径是当前路径上一级+测试集文件夹名
fullpath = parent_path +'/'+ son_path_name
for dir_item in os.listdir(fullpath):#遍历所有的图片
if dir_item.endswith('.jpg'):#如果格式是图片,则进行大小处理
image = cv2.imread(fullpath+'/'+dir_item)
image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)
images.append(image)
labels.append(son_path_name)
print labels
return images, labels
这里分为两个方法,第一个方法是判断该路径下是否有一个名为son_path_name的文件夹,也就是traindata文件夹。第二个方法是读取当前Python文件的路径的上一级目录,也就是前面图片贴出来的openvideo_test文件夹,我们需要进入到该路径的父目录才能访问traindata文件夹。具体操作请看上面代码。
下面我们将利用keras库对这些训练数据进行模型的训练。
【原创文章】转载请注明出处:http://blog.csdn.net/wearge/article/details/77323535