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 ...
随机推荐
- Java与C++进行系统间交互:Protocol Buffer
在一次项目中,因笔者负责的java端应用需要与公司C++系统进行交互,公司选定Protocol Buffer方案,故简单的了解一下 有需要的可以看一下其他作者的文章,了解一下Protobuf: htt ...
- cocos2d-x的坐标和节点层级
- Leetcode 673.最长递增子序列的个数
最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[ ...
- Week1 Team Homework #1 from Z.XML-项目选择思路--基于对曾经大作业项目的思考
这两天试玩了一下去年学长的满分工程<shield star>游戏,再结合了一下他们团队的博客记录,有一种非常牛逼的感觉.具体对于这款游戏的一些思考和看法,毛大神已经说的很好了.因此,这里主 ...
- winform 根据两点求出线上所有点及画出这条线
找出所有点: 根据斜率按照一个方向递增,求出对应的另一个方向的整数值. Point pStart = new Point(0, 2); Point pEnd = new Point(8, 2); // ...
- sql 条件插入
原普通插入语句: insert into seriestable_upload values(New.SeriesID,0); 加条件后:(当不存在该条数据插入) insert into custom ...
- sql声明变量存储查询结果
with t as 查到条件数据,然后在下面使用到t,用exists做判断会非常慢,改成left join会快很多. 我使用的数据库时2008Sql r2. 文章:SQL数据库中临时表.临时变量和WI ...
- 【WebService】——SOAP、WSDL和UDDI
WebService的三要素:SOAP.WSDL和UDDI.soap用来描述传递信息的格式,wsdl描述如何访问具体的接口,uddi管理.分发查询WebService. 1.SOAP SOAP Sim ...
- Delphi中取得程序版本号
Delphi做的程序,如果想包含版本信息, 必须在Delphi的集成编辑环境的菜单“Project/Options/Version Info”里面添加版本信息.即在Version Info 选项卡中选 ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...