cnn的原理,解释网上一大堆,我就不重复了,就是特征提取的过程,推荐看谷歌的介绍。
通过百度图片,下了400+张亚洲男性和400+女性的脸部做训练!
我最喜欢这句话了,简单明了!
需要安装numpy,sklearn,keras,opencv,tensorflow
我的python版本是 3.6.4
全部完整代码,包含了数据下载,从收集到训练,到模型生成,结果,全套代码(//▽//),详细使用详见github里面说明。
链接在文章最下面,这里做一下简单解释:
image_spider.py 是通过百度下载设置关键字的图片,关键字在代码里面
get_face.py 是对下载的图片进行脸部的提取,对训练数据进行筛选
其他三个python文件是做处理训练显示用
haarcascade_frontalface_alt.xml 是opencv自带的人脸检测特征集
提取图片信息,用文件夹的名字做label
训练的问价放在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 试一试结果
可能是训练数据样本集不多的原因,正确率不是很高,可通过增加样本集,增加训练次数来提高正确率