使用深度学习cnn识别人脸性别

使用深度学习cnn识别人脸性别

关于卷积神经网络

cnn的原理,解释网上一大堆,我就不重复了,就是特征提取的过程,推荐看谷歌的介绍。

简单了解

通过百度图片,下了400+张亚洲男性和400+女性的脸部做训练!
使用深度学习cnn识别人脸性别_第1张图片

使用深度学习cnn识别人脸性别_第2张图片

先看看实际的效果:
使用深度学习cnn识别人脸性别_第3张图片

shut up and show me code !

我最喜欢这句话了,简单明了!
需要安装numpy,sklearn,keras,opencv,tensorflow
我的python版本是 3.6.4
全部完整代码,包含了数据下载,从收集到训练,到模型生成,结果,全套代码(//▽//),详细使用详见github里面说明。
链接在文章最下面,这里做一下简单解释:
使用深度学习cnn识别人脸性别_第4张图片
image_spider.py 是通过百度下载设置关键字的图片,关键字在代码里面
get_face.py 是对下载的图片进行脸部的提取,对训练数据进行筛选
其他三个python文件是做处理训练显示用
haarcascade_frontalface_alt.xml 是opencv自带的人脸检测特征集

提取图片信息,用文件夹的名字做label
使用深度学习cnn识别人脸性别_第5张图片
训练的问价放在gender_image文件夹下分类,0是女,1是男

def extract_data(self,train_path):
      imgs, labels, counter = get_file(train_path)
      print(labels)
      # 避免过拟合,采用交叉验证,验证集占训练集30%,固定随机种子(random_state)
      X_train, X_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.3,
                                                          random_state=random.randint(0, 100))

      #数据预处理 keras backend 用的TensorFlow 黑白图片 channel 1
      X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size) / 255.
      X_test = X_test.reshape(X_test.shape[0], 1, self.img_size, self.img_size) / 255.

      #label 转为 one-hot 数据
      Y_train = np_utils.to_categorical(y_train, num_classes=counter)
      Y_test = np_utils.to_categorical(y_test, num_classes=counter)

      self.X_train = X_train
      self.X_test = X_test
      self.Y_train = Y_train
      self.Y_test = Y_test
      self.nb_classes = counter

建立神经网络

    def build_model(self,dataset):
        self.model = Sequential()
        #进行一层卷积 输出 shape (32,128,128)
        self.model.add(Convolution2D(filters=32,kernel_size=5,strides=1, padding='same',data_format='channels_first', input_shape=dataset.X_train.shape[1:]))
        #使用relu激励函数
        self.model.add(Activation('relu'))
        #池化,输出为shape (32,64,64)
        self.model.add(MaxPooling2D(pool_size=2,strides=2,padding='same',data_format='channels_first'))
        #dropout 防止过拟合
        self.model.add(Dropout(0.25))

        #进行一层卷积 输出为shape (64,32,32)
        self.model.add(Convolution2D(64, 5, strides=1, padding='same', data_format='channels_first'))
        # 使用relu激励函数
        self.model.add(Activation('relu'))
        # 池化,输出为原来的一半 shape (64,32,32)
        self.model.add(MaxPooling2D(2, 2, 'same', data_format='channels_first'))
        # dropout 防止过拟合
        self.model.add(Dropout(0.25))

        #全连接层
        self.model.add(Flatten())
        self.model.add(Dense(512))
        self.model.add(Activation('relu'))
        self.model.add(Dropout(0.5))
        self.model.add(Dense(dataset.nb_classes))
        self.model.add(Activation('softmax'))

        self.model.summary()

训练模型后会生成store文件夹存储model文件。
训练完成后运行image_show.py就能看运行结果了。

github地址:https://github.com/StevenKe8080/recognition_gender

也可以访问网站试试(•ิ_•ิ):http://www.aidump.com/CoolImage/GuessGender 试一试结果
可能是训练数据样本集不多的原因,正确率不是很高,可通过增加样本集,增加训练次数来提高正确率

你可能感兴趣的:(机器学习)