• 用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])
  • 相关阅读:
    Java剑指Offer旋转数组的最小数字
    Unreal&LatentAction的能与不能
    自学Python06-学会Python中的while循环语句
    openEuler系统安装并运行nginx
    【自动化脚本】常用自动化脚本一览【持续更新】
    Nginx在前后端分离项目中的配置
    【国产替代】航空电子通信总线航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持
    Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)
    [附源码]计算机毕业设计物业管理系统Springboot程序
    善用 vscode 的多光标批量和模板等技巧来提效
  • 原文地址:https://blog.csdn.net/m0_72431373/article/details/127667863