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

人脸识别模型训练集处理

前面已经实现将人脸拍摄下来存储在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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值