• 用keras的cnn做人脸分类


    keras介绍

    Keras是一个简约,高度模块化的神经网络库。采用Python / Theano开发。
    使用Keras如果你需要一个深度学习库:

    可以很容易和快速实现原型(通过总模块化,极简主义,和可扩展性)
    同时支持卷积网络(vision)和复发性的网络(序列数据)。以及两者的组合。
    无缝地运行在CPU和GPU上。
    keras的资源库网址为https://github.com/fchollet/keras

    olivettifaces人脸数据库介绍

    Olivetti Faces是纽约大学的一个比较小的人脸库,由 40个人的400张图片构成,即每个人的人脸图片为10张。每张图片的灰度级为8位,每个像素的灰度大小位于0-255之间,每张图片大小为64×64。 如下图,这个图片大小是1140942,一共有2020张人脸,故每张人脸大小是(1140/20)(942/20)即5747=2679:

    预处理模块

    使用了PIL(Python Imaging Library)模块,是Python平台事实上的图像处理标准库。
    预处理流程是:打开文件-》归一化-》将图片转为数据集-》生成label-》使用pickle序列化数据集

    numpy.ndarray.flatten函数的功能是将一个矩阵平铺为向量

    1. from PIL import Image
    2. import numpy
    3. import cPickle
    4. img = Image.open('G:\data\olivettifaces.gif')
    5. # numpy supports conversion from image to ndarray and normalization by dividing 255
    6. # 1140 * 942 ndarray
    7. img_ndarray = numpy.asarray(img, dtype='float64') / 255
    8. # create numpy array of 400*2679
    9. img_rows, img_cols = 57, 47
    10. face_data = numpy.empty((400, img_rows*img_cols))
    11. # convert 1140*942 ndarray to 400*2679 matrix
    12. for row in range(20):
    13. for col in range(20):
    14. face_data[row*20+col] = numpy.ndarray.flatten(img_ndarray[row*img_rows:(row+1)*img_rows, col*img_cols:(col+1)*img_cols])
    15. # create label
    16. face_label = numpy.empty(400, dtype=int)
    17. for i in range(400):
    18. face_label[i] = i / 10
    19. # pickling file
    20. f = open('G:\data\olivettifaces.pkl','wb')
    21. # store data and label as a tuple
    22. cPickle.dump((face_data,face_label), f)
    23. f.close()

    分类模型

    程序参考了官方示例:https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py
    一共有40个类,每个类10个样本,共400个样本。其中320个样本用于训练,40个用于验证,剩下40个测试
    注意给第一层指定input_shape,如果是MLP,代码为:

    1. model = Sequential()
    2. # Dense(64) is a fully-connected layer with 64 hidden units.# in the first layer, you must specify the expected input data shape:# here, 20-dimensional vectors.
    3. model.add(Dense(64, input_dim=20, init='uniform'))

    后面可以不指定Dense的input shape

    1. from __future__ import print_function
    2. import numpy as np
    3. import cPickle
    4. np.random.seed(1337) # for reproducibililty
    5. from keras.datasets import mnist
    6. from keras.models import Sequential
    7. from keras.layers.core import Dense, Dropout, Activation, Flatten
    8. from keras.layers.convolutional import Convolution2D, MaxPooling2D
    9. from keras.utils import np_utils
    10. # split data into train,vavlid and test
    11. # train:320
    12. # valid:40
    13. # test:40
    14. def split_data(fname):
    15. f = open(fname, 'rb')
    16. face_data,face_label = cPickle.load(f)
    17. X_train = np.empty((320, img_rows * img_cols))
    18. Y_train = np.empty(320, dtype=int)
    19. X_valid = np.empty((40, img_rows* img_cols))
    20. Y_valid = np.empty(40, dtype=int)
    21. X_test = np.empty((40, img_rows* img_cols))
    22. Y_test = np.empty(40, dtype=int)
    23. for i in range(40):
    24. X_train[i*8:(i+1)*8,:] = face_data[i*10:i*10+8,:]
    25. Y_train[i*8:(i+1)*8] = face_label[i*10:i*10+8]
    26. X_valid[i] = face_data[i*10+8,:]
    27. Y_valid[i] = face_label[i*10+8]
    28. X_test[i] = face_data[i*10+9,:]
    29. Y_test[i] = face_label[i*10+9]
    30. return (X_train, Y_train, X_valid, Y_valid, X_test, Y_test)
    31. if __name__=='__main__':
    32. batch_size = 10
    33. nb_classes = 40
    34. nb_epoch = 12
    35. # input image dimensions
    36. img_rows, img_cols = 57, 47
    37. # number of convolutional filters to use
    38. nb_filters = 32
    39. # size of pooling area for max pooling
    40. nb_pool = 2
    41. # convolution kernel size
    42. nb_conv = 3
    43. (X_train, Y_train, X_valid, Y_valid, X_test, Y_test) = split_data('G:\data\olivettifaces.pkl')
    44. X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
    45. X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
    46. print('X_train shape:', X_train.shape)
    47. print(X_train.shape[0], 'train samples')
    48. print(X_test.shape[0], 'test samples')
    49. # convert label to binary class matrix
    50. Y_train = np_utils.to_categorical(Y_train, nb_classes)
    51. Y_test = np_utils.to_categorical(Y_test, nb_classes)
    52. model = Sequential()
    53. # 32 convolution filters , the size of convolution kernel is 3 * 3
    54. # border_mode can be 'valid' or 'full'
    55. #‘valid’only apply filter to complete patches of the image.
    56. # 'full' zero-pads image to multiple of filter shape to generate output of shape: image_shape + filter_shape - 1
    57. # when used as the first layer, you should specify the shape of inputs
    58. # the first number means the channel of an input image, 1 stands for grayscale imgs, 3 for RGB imgs
    59. model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
    60. border_mode='valid',
    61. input_shape=(1, img_rows, img_cols)))
    62. # use rectifier linear units : max(0.0, x)
    63. model.add(Activation('relu'))
    64. # second convolution layer with 32 filters of size 3*3
    65. model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
    66. model.add(Activation('relu'))
    67. # max pooling layer, pool size is 2 * 2
    68. model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    69. # drop out of max-pooling layer , drop out rate is 0.25
    70. model.add(Dropout(0.25))
    71. # flatten inputs from 2d to 1d
    72. model.add(Flatten())
    73. # add fully connected layer with 128 hidden units
    74. model.add(Dense(128))
    75. model.add(Activation('relu'))
    76. model.add(Dropout(0.5))
    77. # output layer with softmax
    78. model.add(Dense(nb_classes))
    79. model.add(Activation('softmax'))
    80. # use cross-entropy cost and adadelta to optimize params
    81. model.compile(loss='categorical_crossentropy', optimizer='adadelta')
    82. # train model with bath_size =10, epoch=12
    83. # set verbose=1 to show train info
    84. model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
    85. show_accuracy=True, verbose=1, validation_data=(X_test, Y_test))
    86. # evaluate on test set
    87. score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0)
    88. print('Test score:', score[0])
    89. print('Test accuracy:', score[1])
  • 相关阅读:
    MPU进化,多核异构处理器有多强?A核与M核通信过程解析
    2022-08-27 第五组 张明敏 学习笔记
    【用示例学习与理解C++系列】timerfd与epoll的使用
    BDD - SpecFlow ExternalData Plugin 导入外部测试数据
    MySQL查询将一个值设置为 1,将所有其他值设置为 0
    CSS自适应页面
    关系型数据库(SQL)默认值操作
    JMeter笔记11 | JMeter事务
    6W+字记录实验全过程 | 探索Alluxio经济化数据存储策略
    Matlab:非线性函数的运算
  • 原文地址:https://blog.csdn.net/m0_72431373/article/details/127667863