• 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:UsersAdministrator有个文件夹.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 

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

  • 相关阅读:
    H5页面跳到安卓APP和iosAPP
    JS location.href传参及接受参数
    获取当前日期及对应星期
    前端获取当前一周时间 数组形式
    Java基础(四) Object 数组转成 String 数组
    定时任务cron表达式详解
    jquery如何删除数组中的一个元素?
    Mybatis Mapper.xml 需要查询返回List<String>
    oracle的 listagg() WITHIN GROUP () 行转列函数的使用
    如何修改Oracle中表的字段长度?
  • 原文地址:https://www.cnblogs.com/ylzj/p/8043120.html
Copyright © 2020-2023  润新知