CNN卷积神经网络应用于人脸识别(代码实现)(1)图片加载

声明 :本文采用的代码来自博主点击这里,并对此进行了改进。

此项目是基于CNN的多分类项目,是一个简单易懂且简单易懂的项目,非常适合初学者学习。

项目采用的是olivettifaces人脸数据库,这里不过多介绍,原博主已经说明的很详细,我只做代码研究。

代码的主要功能是将整个数据库分为训练集,验证集,以及测试集。

首先,导入需要用到的库。

import os
import sys
import time

import numpy
from PIL import Image

import theano
import theano.tensor as T
from theano.tensor.signal import pool
#from theano.tensor.signal import downsample
from theano.tensor.nnet import conv

然后是将人脸数据库分为训练集,验证集以及测试集。

def load_data(dataset_path):
    img = Image.open(dataset_path)    //打开图片
    img_ndarray = numpy.asarray(img, dtype='float64')/256    //将img的灰度值改为0`1 方便后面梯度下降
    faces=numpy.empty((400,2679))     //400张脸,每张脸2679个像素
    for row in range(20):
      for column in range(20):
          faces[row*20+column]=numpy.ndarray.flatten(img_ndarray [row*57:(row+1)*57,column*47:(column+1)*47])         //每一行的10张脸来自同一个人

    label=numpy.empty(400)             //标签数组,每10张脸的标签属于同一个人,故数值相同
    for i in range(40):
       label[i*10:i*10+10]=i
    label=label.astype(numpy.int)

    #分成训练集、验证集、测试集,大小如下
    train_data=numpy.empty((320,2679))
    train_label=numpy.empty(320) //320张脸为训练集
    valid_data=numpy.empty((40,2679))
    valid_label=numpy.empty(40)  //40张脸为验证集
    test_data=numpy.empty((40,2679))
    test_label=numpy.empty(40)  //40张脸为测试集

    for i in range(40):
       train_data[i*8:i*8+8]=faces[i*10:i*10+8]
       train_label[i*8:i*8+8]=label[i*10:i*10+8]  //训练集标签
       valid_data[i]=faces[i*10+8]
       valid_label[i]=label[i*10+8]              //验证集标签
       test_data[i]=faces[i*10+9]
       test_label[i]=label[i*10+9]               //测试集标签

    #将数据集定义成shared类型,才能将数据复制进GPU,利用GPU加速程序。
    def shared_dataset(data_x, data_y, borrow=True):
        shared_x = theano.shared(numpy.asarray(data_x,
                                               dtype=theano.config.floatX),
                                 borrow=borrow)
        shared_y = theano.shared(numpy.asarray(data_y,
                                               dtype=theano.config.floatX),
                                 borrow=borrow)
        return shared_x, T.cast(shared_y, 'int32')



    train_set_x, train_set_y = shared_dataset(train_data,train_label)
    valid_set_x, valid_set_y = shared_dataset(valid_data,valid_label)
    test_set_x, test_set_y = shared_dataset(test_data,test_label)
    rval = [(train_set_x, train_set_y), (valid_set_x, valid_set_y),
            (test_set_x, test_set_y)]
    return rval  //返回数据集数组

 

你可能感兴趣的:(人脸识别)