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:]

7:關於Keras 2.0版本運行demo出錯的問題

8 :缺少h5py,導包。

 

 

詳細步驟:

1、獲得訓練集數據

分步運行,運行pick_face.py,會調用read_img.py

 (我想改顏色了,發現改了顏色后真的識別不出來,灰色識別確實高,但是這看着不太舒服,最后拉上我郅哥陪我,啥也不怕了。)

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) #分割出來六個訓練集 [Finished in 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

根據Numpy文檔()的解釋:(能看明白的都么是大嬸)

  清楚解釋如下

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) 其余沒變,多加了一個維度而已。

 

5、

 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"
}

6、矩陣轉換  博客學習地址      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]]

 

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、*****

 

最后附一張成功識別圖,感謝原代碼作者,也感謝眾多查閱的博客疑難解答,小白一枚,前方路遠,路漫漫其修遠兮

 

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

 

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

歡迎指正學習,我才剛上路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM