机器学习人脸性别识别

栏目: 数据库 · 发布时间: 6年前

内容简介:在传统编程中, 图像识别一直是一个难点, 虽然人能轻松做到, 但是用逻辑来描述这个过程, 并转换成程序是很难的。机器学习的出现让图像识别技术有了突破性的进展, 卷积神经网络的出现, 又使图像识别更上了一次层次。卷积神经网络由一个或多个卷积层和顶端的全连通层组成, 这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。这里我们使用卷积神经网络对人脸进行性别识别, 项目中使用了

在传统编程中, 图像识别一直是一个难点, 虽然人能轻松做到, 但是用逻辑来描述这个过程, 并转换成程序是很难的。机器学习的出现让图像识别技术有了突破性的进展, 卷积神经网络的出现, 又使图像识别更上了一次层次。

卷积神经网络由一个或多个卷积层和顶端的全连通层组成, 这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。

这里我们使用卷积神经网络对人脸进行性别识别, 项目中使用了 TensorFlow 机器学习库。

项目地址

face-gender-classification

数据收集与处理

机器学习的基础就是大量的数据。我以前从网上爬了一万张证件照, 现在正好用上, 作为训练数据。

简便的也可以从谷歌直接搜搜索 男(女)性证件照 也可以得到并且有标签的数据。

由于我收集的照片没有标签, 于是我花了一点时间从其中人工选出男女照片各200张并打上标记。

为了使识别更加准确, 项目中利用 openCV 裁剪出人脸部分的图像, 并缩放至 28*28 大小。

recognizer = cv2.CascadeClassifier("model/haarcascade_frontalface_default.xml")
crop(img_path):
    try:
        img = cv2.imread(img_path)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = recognizer.detectMultiScale(gray)
        if len(faces):
            x, y, w, h = faces[0]
            c_img = img[y:y + h, x:x + w]
            return cv2.resize(c_img, (28, 28), interpolation=cv2.INTER_AREA)
    except:
        pass

    return None

对所有的数据都进行这样处理, 结果如下:

机器学习人脸性别识别

最后我们还需要清理异常的数据, 过一遍训练集, 把其中没有定位到人脸的图片去除掉。

训练模型

读取训练数据。

def read_img(files):
    arr = []
    for file in files:
        img = Image.open("%s" % file)
        pix = img.load()
        view = np.zeros((IMAGE_H, IMAGE_W, 1), dtype=np.float)
        for x in range(IMAGE_H):
            for y in range(IMAGE_W):
                r, g, b = pix[y, x]
                view[x, y, 0] = (r + g + b) // 3
        arr.append(view)
    return np.array(arr)

这里对训练图像灰度化, 并且将训练数据中的一小部分作为验证集。

开始创建模型。

model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3), input_shape=(IMAGE_W, IMAGE_H, 1), strides=(1, 1), activation='relu'),
    keras.layers.MaxPool2D(pool_size=(2, 2)),
    keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu'),
    keras.layers.MaxPool2D(pool_size=(2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(2, activation=tf.nn.softmax)
])

选择适当的优化器和损失函数编译模型。

model.compile(optimizer=tf.train.AdamOptimizer(learning_rate=0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

开始训练模型。

model.fit(x=train_x,
          y=train_y,
          batch_size=32,
          epochs=30,
          verbose=1,
          callbacks=my_callbacks,
          validation_split=0.05,
          shuffle=True
          )

测试模型

这里使用matplotlib来显示测试图片及结果。

predictions = model.predict(test_x)

class_names = ["Female", "Male"]

plt.figure(figsize=(12, 6))
for i in range(min(9, len(test_y))):
    result = predictions[i]
    max_label = int(np.argmax(result))
    correct_label = int(np.argmax(test_y[i]))

    plt.subplot(3, 6, 2 * i + 1)
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])
    img = test_x.reshape(test_x.shape[0], IMAGE_W, IMAGE_H)[i]
    plt.imshow(img, cmap="gray")
    plt.xlabel("{} - prob:{:2.0f}%".format(class_names[max_label], 100 * np.max(result)))

    plt.subplot(3, 6, 2 * i + 2)
    plt.grid(False)
    plt.yticks([])
    plt.ylim([0, 1])
    bar = plt.bar(range(2), result)
    bar[max_label].set_color('red')
    bar[correct_label].set_color('green')

plt.show()
机器学习人脸性别识别

脸部头像右侧的两列分别代表 女性概率男性概率

这里我们看到全都对了, 正确率非常高。

模型并不复杂, 大部分工作都在收集数据和调整训练参数上, 这也体现出了卷积神经网络对图像强大的处理能力。


以上所述就是小编给大家介绍的《机器学习人脸性别识别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构(C语言版)

数据结构(C语言版)

严蔚敏、吴伟民 / 清华大学出版社 / 2012-5 / 29.00元

《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 ......一起来看看 《数据结构(C语言版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具