python+opencv的人脸识别 大学_Python3.5+openCv进行人脸识别并匹配的环境搭建(Windows下)...

一、参考博客

地址 http://www.jianshu.com/p/d4a924c97416

作者说的很详细,可以参考作者博客,搭建环境参考我的上一博客。

这里只说一些自己的理解,和解决遇到的问题,有想在Windows下实现人脸识别并且匹配的,可以按照我的步骤一步步解决问题。经测试真实有效,不好用不要钱!- -!

二、分析

想要看懂代码并且自己能够修改,你需要了解的几个知识

1:openCv调用图片,或者视频 。

构建模型和模型训练(问题开始逐渐多了,重点,敲黑板)

就是把刚才的图片放到dataset文件夹下,要单独创建文件夹,一个文件夹里面放一个人的头像。

*******(应该建立两个以上文件夹,否则报错,具体错误代码 如下,原因不详:

#epochs、batch_size为可调的参数,epochs为训练多少轮、batch_size为每次训练多少个样本

#如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,

#那么x的类型应当为list,list的元素是对应于各个输入的numpy array

self.model.fit(self.dataset.X_train,self.dataset.Y_train,epochs=7,batch_size=20)

运行train_model.py会调用dataSet.py,read_data.py

read_data.py下的

2:根据指定路径读取出图片、标签和类别数

imgs,labels,counter = read_file(path)

3: #将数据集打乱随机分组

X_train,X_test,y_train,y_test = train_test_split(imgs,labels,test_size=0.2,random_state=random.randint(0, 100))

print(X_train.shape)#输出结果(3, 128, 128) 3代表训练集的个数

4: #重新格式化和标准化

X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size)/255.0

(reshape详细看最下面)

train_model.py下的

5: #建立一个CNN模型,一层卷积、一层池化、一层卷积、一层池化、抹平之后进行全链接、最后进行分类

self.model = Sequential()

self.model.add(

Conv2D(

filters=32,

kernel_size=(5, 5),

padding='same',

dim_ordering='th',

input_shape=self.dataset.X_train.shape[1:]

)

)

6:了解python的常见矩阵转换

input_shape=self.dataset.X_train.shape[1:]

8 :缺少h5py,导包。

详细步骤:

1、获得训练集数据

分步运行,运行pick_face.py,会调用read_img.py

1044716-20171215142207027-422661458.png

(我想改颜色了,发现改了颜色后真的识别不出来,灰色识别确实高,但是这看着不太舒服,最后拉上我郅哥陪我,啥也不怕了。)

2、*****

3、

imgs,labels,counter = read_file(path)

print(imgs)

print(labels)

print(counter) 打印结果如下

[[[88 131 132 ..., 19 19 34]

[107 137 128 ..., 19 22 40]

[112 130 116 ..., 22 29 51]

...,

[46 54 60 ..., 180 176 160]

[48 54 59 ..., 177 172 167]

[50 54 57 ..., 158 157 165]] #1

[[160 160 159 ..., 160 160 160]

[160 160 160 ..., 161 160 161]

[160 161 161 ..., 161 161 161]

...,

[132 130 131 ..., 137 136 136]

[131 131 130 ..., 137 136 136]

[131 130 130 ..., 136 136 136]] #2

[[220 221 221 ..., 221 221 222]

[221 222 222 ..., 223 223 222]

[223 223 223 ..., 222 223 223]

...,

[213 212 208 ..., 179 179 179]

[212 213 211 ..., 83 178 178]

[211 213 211 ..., 177 177 177]] #3

...,

[[128 126 124 ..., 90 90 90]

[129 128 127 ..., 93 94 93]

[131 129 129 ..., 92 94 93]

...,

[70 66 63 ..., 65 68 70]

[67 62 58 ..., 65 69 70]

[62 60 60 ..., 67 74 76]] #4

[[4 5 4 ..., 27 40 47]

[3 4 4 ..., 28 36 44]

[4 4 4 ..., 36 40 45]

...,

[19 20 19 ..., 159 160 158]

[20 23 22 ..., 158 159 160]

[17 21 21 ..., 157 159 158]] #5

[[14 16 16 ..., 183 183 182]

[19 19 21 ..., 183 183 183]

[22 18 20 ..., 182 183 183]

...,

[100 102 99 ..., 189 189 189]

[100 100 101 ..., 188 188 189]

[99 98 100 ..., 190 189 189]]] #6 我有两个文件夹,八张图片,不知道为什么只显示六张图片????

[0, 0, 0,1, 1, 1, 1, 1] #标签代表文件夹索引 第一个文件夹里3张图片,第二个文件夹里面5张图片2 #一共两文件夹[[[227 225 224 ..., 231 231 232]

[226 228 223 ..., 232 232 232]

[228 225 221 ..., 230 231 231]

...,

[226 226 227 ..., 125 109 104]

[226 227 228 ..., 122 107 104]

[227 228 226 ..., 116 105 101]]

[[14 16 16 ..., 183 183 182]

[19 19 21 ..., 183 183 183]

[22 18 20 ..., 182 183 183]

...,

[100 102 99 ..., 189 189 189]

[100 100 101 ..., 188 188 189]

[99 98 100 ..., 190 189 189]]

[[88 131 132 ..., 19 19 34]

[107 137 128 ..., 19 22 40]

[112 130 116 ..., 22 29 51]

...,

[46 54 60 ..., 180 176 160]

[48 54 59 ..., 177 172 167]

[50 54 57 ..., 158 157 165]]

[[128 126 124 ..., 90 90 90]

[129 128 127 ..., 93 94 93]

[131 129 129 ..., 92 94 93]

...,

[70 66 63 ..., 65 68 70]

[67 62 58 ..., 65 69 70]

[62 60 60 ..., 67 74 76]]

[[160 160 159 ..., 160 160 160]

[160 160 160 ..., 161 160 161]

[160 161 161 ..., 161 161 161]

...,

[132 130 131 ..., 137 136 136]

[131 131 130 ..., 137 136 136]

[131 130 130 ..., 136 136 136]]

[[4 5 4 ..., 27 40 47]

[3 4 4 ..., 28 36 44]

[4 4 4 ..., 36 40 45]

...,

[19 20 19 ..., 159 160 158]

[20 23 22 ..., 158 159 160]

[17 21 21 ..., 157 159 158]]]

(6, 128, 128) #分割出来六个训练集

[Finishedin 5.2s]

参考博客:http://blog.csdn.net/churximi/article/details/61415254

4、X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size)/255.0

清楚解释如下

1 importnumpy as np

2 z=np.array([

3 [1,2,3,4],

4 [5,6,7,8],

5 [9,10,11,12],

6 [13,14,15,16]

7 ])

8 print(z.shape) #输出(4,4)

import numpy as np

z=np.array([

[1,2,3,4],

[5,6,7,8],

[9,10,11,12],

[13,14,15,16]

])

print(z.reshape(-1,1)) #也就是说,先前我们不知道z的shape属性是多少,但是想让z变成只有一列,行数不知道多少,

#输出如下

[[ 1]

[ 2]

[ 3]

[ 4]

[ 5]

[ 6]

[ 7]

[ 8]

[ 9]

[10]

[11]

[12]

[13]

[14]

[15]

[16]]

print(z.reshape(-1,2))

#输出如下

[[ 1 2]

[ 3 4]

[ 5 6]

[ 7 8]

[ 9 10]

[11 12]

[13 14]

[15 16]]

print(z.reshape(-1,2,8))

#输出如下

[[[ 1 2 3 4 5 6 7 8]

[ 9 10 11 12 13 14 15 16]]]

print(z.reshape(-1,2,4,1))

#输出如下

[[[[ 1]

[ 2]

[ 3]

[ 4]]

[[ 5]

[ 6]

[ 7]

[ 8]]]

[[[ 9]

[10]

[11]

[12]]

[[13]

[14]

[15]

[16]]]]

、最后总结为,reshape(-1,2,4,1)里面加几个参数,就是形成几维数组,从右向左起,为每维数组里的个数,(-1,2,4,1)一维数组里面有1个,二维数组里面4个,三围数组里面2个,由于不知道z的

值,就用-1表示,自动运算16/1/4/2=2。注意,维度一定要保证能够整除,不能出现除不尽的情况。

#将数据集打乱随机分组

X_train,X_test,y_train,y_test = train_test_split(imgs,labels,test_size=0.2,random_state=random.randint(0, 100))

print(X_train.shape)#输出结果(3, 128, 128)

#重新格式化和标准化

X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size)/255.0

将X_train由一个三维数组,变成一个四维数组。

相当于x_train=X_train.reshape(3,1,128,128) 其余没变,多加了一个维度而已。

5、

defbuild_model(self):self.model=Sequential()

self.model.add(

Convolution2D(

filters=32,

kernel_size=(5, 5),

padding='same',

dim_ordering='th',

input_shape=self.dataset.X_train.shape[1:]

)

)

首先了解 Keras:基于Python的深度学习库 中文文档地址 http://keras-cn.readthedocs.io/en/latest/

博客地址 http://blog.csdn.net/sinat_26917383/article/details/72857454?fps=1&locationNum=1

keras的后台引擎,三种后端TensorFlow、theano、cntk。

*******重要*******开始我换了theano,但是总是出错,各种各样的问题,最后还是直接就用了tensorflow,也没有做什么修改,具体底层怎么运行的我会在后续学习中补充,也希望有知道的大神可以告诉一下我,感激不尽。

作者说本案例是基于theano的,如果基于tensorflow的backend需要进行修改,而发现keras默认后端是tensorflow,想换回theano,看了官方文档,只说明了Linux的环境更换,在Windows下

1044716-20171215143946840-1061237665.png

其实就是在C:\Users\Administrator有个文件夹.keras,里面有keras.json文件,改一下里面的内容就好了,如果没有文件夹和文件,手动创建就行。用theano的话,keras.json写入

{

"backend": "tensorflow",

"epsilon": 1e-07,

"image_data_format": "channels_last",

"floatx": "float32"

}

6、矩阵转换 博客学习地址 http://blog.csdn.net/taxueguilai1992/article/details/46581861

from numpy import *

importnumpy as np

a1=array([1,2,3])

a1=mat(a1)#1print(a1) [[1 2 3]]#a1=mat([[1,1],[2,3],[4,2]]);#2print(a1) [[1 1]#[2 3]#[4 2]]

#3print(a1[1,:]) [[2 3]]加了逗号就是取第二行值

#4print(sum(a1[1,:])) 计算第一行所有列的和 5

#print(a1[1:]) [[2 3]#[4 2]] 不加逗号就是从第二行之后分割

#print(a1[1:,1:]) 分割出第二行以后的行和第二列以后的列的所有元素#[[3]#[2]]

7、博客学习地址 http://blog.csdn.net/johinieli/article/details/69222956

更新keras到2.0版本 pip install keras==2.0(本人亲测好使)

使用以下命令来查看 Keras 版本。

>>> import keras

Using TensorFlow backend.

>>> keras.__version__

升级后原作者代码也需要更改 Conv2D而不再是Convolution2D。

8、*****

最后附一张成功识别图,感谢原代码作者,也感谢众多查阅的博客疑难解答,小白一枚,前方路远,路漫漫其修远兮

1044716-20171218162329209-897423113.png

代码地址:https://github.com/chaoyuebeijita/face

2017/12/18 作者一路致金 微信 chaoyuebeijita QQ 869613275

欢迎指正学习,我才刚上路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值