keras_训练人脸识别模型心得
keras_cnn_实现人脸训练分类
废话不多扯,直接进入正题吧!今天在训练自己分割出来的图片,感觉效果挺不错的,所以在这分享一下心得,望入门的同孩采纳。
1、首先使用python OpenCV库里面的人脸检测分类器把你需要训练的测试人脸图片给提取出来,这一步很重要,因为deep learn他也不是万能的,很多原始人脸图片有很多干扰因素,直接拿去做模型训练效果是非常low的。所以必须得做这一步。而且还提醒一点就是你的人脸图片每个类别的人脸图片光线不要相差太大,虽然都是灰度图片,但是会影响你的结果,我测试过了好多次了,
2、把分割出来的人脸全部使用resize的方法变成[100x100]的图片,之前我也试过rgb的图片,但是效果不好,所以我建议都转成灰度图片,这样数据量小,计算速度也快,当然了keras的后端我建议使用TensorFlow-GPU版,这样计算过程明显比CPU快1万倍。
3、时间有限,我的数据集只有六张,前面三张是某某的人脸,后面三张又是另一个人脸,这样就只有两个类别,说到这里的时候很多人都觉得不可思议了吧,数据集这么小你怎么训练的?效果会好吗?那么你不要着急慢慢读下去吧!其次我把每个类别的前面两张图片自我复制了100次,这样我就有数据集了,类别的最后一张使用来做测试集,
自我复制50次。下面我来为大家揭晓答案吧,请详细参考如下代码:
(1)、导包
# coding:utf-
import numpy as np
import os
import cv2
os.environ['TF_CPP_MIN_LOG_LEVEL'] = ''
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras import optimizers
import pandas as pd
import matplotlib.pyplot as plt
导入需要包
(2)、读取我们的图片数据
filePath = os.listdir('img_test/')
print(filePath)
img_data = []
for i in filePath:
img_data.append(cv2.resize(cv2.cvtColor(cv2.imread('img_test/%s'%i),cv2.COLOR_BGR2GRAY),(100,100),interpolation=cv2.INTER_AREA))
导入图片
(3)、制作训练集合测试集
x_train = np.zeros([,,,])
y_train = []
x_test = np.zeros([,,,])
y_test = [] for i in range():
if i<:
x_train[i,:,:,] = img_data[]
y_train.append()
elif <=i<:
x_train[i, :, :, ] = img_data[]
y_train.append()
elif <=i<:
x_train[i, :, :, ] = img_data[]
y_train.append()
else:
x_train[i, :, :, ] = img_data[]
y_train.append() for j in range():
if j%==:
x_test[j, :, :, ] = img_data[]
y_test.append()
else:
x_test[j, :, :, ] = img_data[] # np.ones((,))
y_test.append() y_train = np.array(pd.get_dummies(y_train))
y_ts = np.array(y_test)
y_test = np.array(pd.get_dummies(y_test))
训练数据与测试数据
(4)、建立keras_cnn模型
model = Sequential()
# 第一层:
model.add(Conv2D(32,(3,3),input_shape=(100,100,1),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
# model.add(Conv2D(64,(3,3),activation='relu'))
#第二层:
# model.add(Conv2D(32,(3,3),activation='relu')) # model.add(Dropout(0.25))
# model.add(MaxPooling2D(pool_size=(2,2)))
# model.add(Dropout(0.25)) # 2、全连接层和输出层:
model.add(Flatten())
# model.add(Dense(500,activation='relu'))
# model.add(Dropout(0.5))
model.add(Dense(20,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2,activation='softmax')) model.summary()
model.compile(loss='categorical_crossentropy',#,'binary_crossentropy'
optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),#,'Adadelta'
metrics=['accuracy'])
建立模型
(5)、训练模型和得分输出
# 模型训练
model.fit(x_train,y_train,batch_size=30,epochs=100)
y_predict = model.predict(x_test)
score = model.evaluate(x_test, y_test)
print(score)
y_pred = np.argmax(y_predict,axis=1)
plt.figure('keras')
plt.scatter(list(range(len(y_pred))),y_pred ,c=y_pred)
plt.show()
下面是结果输出,loss = 0.0018 acc = 1.0 效果很不错,主要在于你训练时候的深度。


完整代码如下:
1 # coding:utf-8
2 import numpy as np
3 import os
4 import cv2
5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
6 from keras.models import Sequential
7 from keras.layers import Dense,Dropout,Flatten
8 from keras.layers import Conv2D,MaxPooling2D
9 from keras import optimizers
10 import pandas as pd
11 import matplotlib.pyplot as plt
12
13 filePath = os.listdir('img_test/')
14 print(filePath)
15 img_data = []
16 for i in filePath:
17 img_data.append(cv2.resize(cv2.cvtColor(cv2.imread('img_test/%s'%i),cv2.COLOR_BGR2GRAY),(100,100),interpolation=cv2.INTER_AREA))
18
19
20 x_train = np.zeros([100,100,100,1])
21 y_train = []
22 x_test = np.zeros([50,100,100,1])
23 y_test = []
24
25 for i in range(100):
26 if i<25:
27 x_train[i,:,:,0] = img_data[2]
28 y_train.append(1)
29 elif 25<=i<50:
30 x_train[i, :, :, 0] = img_data[4]
31 y_train.append(2)
32 elif 50<=i<75:
33 x_train[i, :, :, 0] = img_data[1]
34 y_train.append(1)
35 else:
36 x_train[i, :, :, 0] = img_data[5]
37 y_train.append(2)
38
39 for j in range(50):
40 if j%2==0:
41 x_test[j, :, :, 0] = img_data[0]
42 y_test.append(1)
43 else:
44 x_test[j, :, :, 0] = img_data[3] # np.ones((100,100))
45 y_test.append(2)
46
47 y_train = np.array(pd.get_dummies(y_train))
48 y_ts = np.array(y_test)
49 y_test = np.array(pd.get_dummies(y_test))
50 '''
51 from keras.models import load_model
52 from sklearn.metrics import accuracy_score
53
54 model = load_model('model/my_model.h5')
55 y_predict = model.predict(x_test)
56 y_p = np.argmax(y_predict,axis=1)+1
57 score = accuracy_score(y_ts,y_p)
58 # score = model.evaluate(x_train,y_train)
59 print(score)
60 '''
61
62 model = Sequential()
63 # 第一层:
64 model.add(Conv2D(32,(3,3),input_shape=(100,100,1),activation='relu'))
65 model.add(MaxPooling2D(pool_size=(2,2)))
66 model.add(Dropout(0.5))
67 # model.add(Conv2D(64,(3,3),activation='relu'))
68 #第二层:
69 # model.add(Conv2D(32,(3,3),activation='relu')) # model.add(Dropout(0.25))
70 # model.add(MaxPooling2D(pool_size=(2,2)))
71 # model.add(Dropout(0.25))
72
73 # 2、全连接层和输出层:
74 model.add(Flatten())
75 # model.add(Dense(500,activation='relu'))
76 # model.add(Dropout(0.5))
77 model.add(Dense(20,activation='relu'))
78 model.add(Dropout(0.5))
79 model.add(Dense(2,activation='softmax'))
80
81 model.summary()
82 model.compile(loss='categorical_crossentropy',#,'binary_crossentropy'
83 optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),#,'Adadelta'
84 metrics=['accuracy'])
85
86 # 模型训练
87 model.fit(x_train,y_train,batch_size=30,epochs=150)
88 y_predict = model.predict(x_test)
89 score = model.evaluate(x_test, y_test)
90 print('loss: ',score[0],' acc: ',score[1])
91 y_pred = np.argmax(y_predict,axis=1)
92 plt.figure('keras',figsize=(12,6))
93 plt.scatter(list(range(len(y_pred))),y_pred ,c=y_pred)
94 plt.show()
95
96 # 保存模型
97 # model.save('test/my_model.h5')
98
99 # import matplotlib.pyplot as plt
100 # plt.imshow(x_train[30,:,:,0].reshape(100,100),cmap='gray')
101 # plt.figure()
102 # plt.imshow(x_test[3,:,:,0].reshape(100,100),cmap='gray')
103 # plt.xticks([]);plt.yticks([])
104 # plt.show()
keras_训练人脸识别模型心得的更多相关文章
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- 虹软最新版 python 接口 完整版
虹软最新版 python 接口 完整版 当前开源的人脸检测模型,识别很多,很多小伙伴也踩过不少坑.相信不少使用过dlib和facenet人脸识别的小伙伴都有这样的疑惑,为什么论文里高达99.8以上的准 ...
- 腾讯 AI Lab 计算机视觉中心人脸 & OCR团队近期成果介绍(3)
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:周景超 在上一期中介绍了我们团队部分已公开的国际领先的研究成果,近期我们有些新的成果和大家进一步分享. 1 人脸进展 人脸是最重要的视觉 ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
- face recognition[翻译][深度人脸识别:综述]
这里翻译下<Deep face recognition: a survey v4>. 1 引言 由于它的非侵入性和自然特征,人脸识别已经成为身份识别中重要的生物认证技术,也已经应用到许多领 ...
- OpenCV 学习笔记 05 人脸检测和识别
本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个 Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...
- Python的开源人脸识别库:离线识别率高达99.38%
Python的开源人脸识别库:离线识别率高达99.38% github源码:https://github.com/ageitgey/face_recognition#face-recognitio ...
- TensorFlow人脸识别
TensorFlow框架做实时人脸识别小项目(一)https://blog.csdn.net/Goerge_L/article/details/80208297 TensorFlow框架做实时人脸识别 ...
- 【EdgeBoard体验】开箱与上手
简介 市面上基于嵌入式平台的神经网络加速平台有很多,今天给大家带来是百度大脑出品的EdgeBoard.按照官网文档的介绍,EdgeBoard是基于Xilinx Zynq Ultrascale+ MPS ...
随机推荐
- 【数据库】 SQL 使用注意点
[数据库] SQL 使用注意点 一. 索引 1. 常用的搜索条件,都建议加上索引,但状态列除外(该列只有0,1或几个值,不需要加索引,因为没效果) 2. 查询时, 索引列不能做函数处理,会不走索引 3 ...
- 初探 Qt Opengl【2】
最近在研究QOPengl QGraphicsView QGraphicsItemQGraphicsScene不过也只是皮毛,也不是做什么技术贴,就是记录一下自己在其中遇到的问题,和自己新学到的东西. ...
- (原) MatEditor部- UmateriaEditor中Texture使用过程(1)
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 最后YY需求(手滑)(开黑前弄下,充数,见谅) 1.在理清楚基础套路和细节后,自定义纹理资源,并加 ...
- python之*args和**kwargs参数,以及迭代器
*args让函数可以接受不限制多个位置参数,**kwargs让函数可以接受不限制多个关键字参数,用法如图 2.迭代器总结
- ng2模板语法/内置指令速查表
https://www.angular.cn/docs/ts/latest/guide/cheatsheet.html
- Android问题:could not install *smartsocket* listener;Address already in use
今天启动genymotion后,发现没有ip地址,运行项目时报错: 可见,没有连接到模拟器,无法运行,而先前说过没有ip,自然而然连接不上, 解决放法:将资源管理器打开,将adb全部退出 ...
- JAVA课程设计 俄罗斯方块
俄罗斯方块 可实现功能 1.账号管理:登录.注册 2.游戏实现:移动.旋转.消除方块统计得分.暂停游戏.暂停后继续游戏.此轮游戏未结束开启新一轮游戏.游戏未结束退出游戏. 3.排行榜:按分数排名.按局 ...
- pptp协议的工作原理
我的工作机是A,通信网卡是Aeth0, Appp0: 然后我的云主机是B, 通信的网卡是Beth0, Bppp0: 在网卡Bppp0上会不断地很清晰的数据包: 16:40:39.522917 IP 6 ...
- [剑指Offer] 21.栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 【python】Python中给List添加元素的4种方法分享
List 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义的顺序(除非你对它们进行排序或其他修改操作). 在Python中,向List添加元素,方法有如下4种方法 ...