(人脸识别2-5)——人脸识别模型训练集处理

来源:互联网 发布:淘宝网首页登陆电脑版 编辑:程序博客网 时间:2024/06/14 05:41

人脸识别模型训练集处理

前面已经实现将人脸拍摄下来存储在traindata文件夹内,但是这还不够,我们需要对测试图片进行大小的调整,因为有些图片的格式长短不一样,这样对于后面我们训练模型不方便处理,而且较大的图片文件处理运算量也非常大。

这里再次说一下问价夹的存放形式,不然无法读取,程序无法执行,如果看懂了程序,稍加改动其实还是可以适应不同的文件夹形式

这里先贴上代码,所有详细的解释都在注释上

# -*- coding: utf-8 -*-import osimport numpy as npimport cv2IMAGE_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))# 读取训练数据iimages = []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 0def 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, labelsif __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 0def 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

原创粉丝点击