1、參考博客html
地址 http://www.jianshu.com/p/d4a924c97416python
做者說的很詳細,能夠參考做者博客,搭建環境參考個人上一博客。react
這裏只說一些本身的理解,和解決遇到的問題,有想在Windows下實現人臉識別而且匹配的,能夠按照個人步驟一步步解決問題。經測試真實有效,很差用不要錢!- -!git
2、分析github
想要看懂代碼而且本身可以修改,你須要瞭解的幾個知識json
1:openCv調用圖片,或者視頻 。後端
構建模型和模型訓練(問題開始逐漸多了,重點,敲黑板)數組
就是把剛纔的圖片放到dataset文件夾下,要單首創建文件夾,一個文件夾裏面放一我的的頭像。微信
*******(應該創建兩個以上文件夾,不然報錯,具體錯誤代碼 以下,緣由不詳:dom
#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,導包。
詳細步驟:
一、得到訓練集數據
分步運行,運行pick_face.py,會調用read_img.py
(我想改顏色了,發現改了顏色後真的識別不出來,灰色識別確實高,可是這看着不太舒服,最後拉上我郅哥陪我,啥也不怕了。)
二、*****
三、
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) #分割出來六個訓練集 [Finished in 5.2s]
參考博客:http://blog.csdn.net/churximi/article/details/61415254
四、X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size)/255.0
根據Numpy文檔(https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html#numpy-reshape)的解釋:(能看明白的都麼是大嬸)
清楚解釋以下
1 import numpy 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) 其他沒變,多加了一個維度而已。
五、
def build_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下
其實就是在C:\Users\Administrator
有個文件夾.keras
,裏面有keras.json
文件,改一下里面的內容就行了,若是沒有文件夾和文件,手動建立就行。用theano的話,keras.json寫入
{
"backend": "tensorflow",
"epsilon": 1e-07,
"image_data_format": "channels_last",
"floatx": "float32"
}
六、矩陣轉換 博客學習地址 http://blog.csdn.net/taxueguilai1992/article/details/46581861
from numpy import * import numpy 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]]
七、博客學習地址 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。
八、*****
最後附一張成功識別圖,感謝原代碼做者,也感謝衆多查閱的博客疑難解答,小白一枚,前方路遠,路漫漫其修遠兮
代碼地址:https://github.com/chaoyuebeijita/face
2017/12/18 做者一路致金 微信 chaoyuebeijita QQ 869613275
歡迎指正學習,我纔剛上路