tensorflow证件照判断性别

证件照判断性别

说明

本文用1000张身份证号命名的证件照作为训练数据,复现tensorflow官方教程中的图像分类例子
教程中是多分类,本文改为了二分类。
官方教程地址:https://tensorflow.google.cn/tutorials/load_data/images?hl=zh_cn

读取图片

import numpy as np
import os
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import *
from tensorflow.keras.preprocessing.image import ImageDataGenerator
#os.environ['CUDA_VISIBLE_DEVICES']='0'
#读取图片
def load_and_preprocess_image(path):
    image = tf.io.read_file(path,'rb')  
    #image = tf.io.gfile.GFile(path, 'rb').read()  #这个方法有点问题  最好用上面的
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [192, 192]) #resize成square  计算机擅长方阵计算
    image /= 255.0  # normalize to [0,1] range 即归一化
    return image

构造数据集

labels = [int(i[16])%2 for i in os.listdir(r'D:\documents\File')]#身份证号倒数第二位判断性别label,形成标签集
all_path = ['D:\documents\File\\'+i for i in os.listdir(r'D:\documents\File')]
path_ds = tf.data.Dataset.from_tensor_slices(all_path)
image_ds = path_ds.map(load_and_preprocess_image, num_parallel_calls=4)   #训练集(教程中没有做验证集)
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(labels, tf.int64))   #训练集标签
image_label_ds = tf.data.Dataset.zip((image_ds, label_ds))                 #训练集对应标签

BATCH_SIZE = 32
# 设置一个和数据集大小一致的 shuffle buffer size(随机缓冲区大小)以保证数据
# 被充分打乱。
ds = image_label_ds.shuffle(buffer_size=len(labels))
ds = ds.repeat()
ds = ds.batch(BATCH_SIZE)
# 当模型在训练的时候,`prefetch` 使数据集在后台取得 batch。
ds = ds.prefetch(buffer_size=4)

建立模型

mobile_net = tf.keras.applications.MobileNetV2(input_shape=(192, 192, 3), include_top=False)
mobile_net.trainable=False

model = tf.keras.Sequential([
  mobile_net,
  GlobalAveragePooling2D(),
  Dense(1, activation = 'sigmoid')]) #这里是二分类,输出层只需要一个神经元
  
model.compile(optimizer='RMSprop',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=["binary_accuracy"])  #二分类专用评价指标,各种指标介绍见https://blog.csdn.net/qq_39381654/article/details/108747701
model.summary()

训练

history = model.fit(
    ds,
    steps_per_epoch=30,
    epochs=10,
)

预测

model.predict(
np.expand_dims(load_and_preprocess_image('C:\\Users\\Administrator\\Desktop\\jupyterbook\\36010219791.jpg'), axis=0)) #模型第一层输入需要4ndim(batch,192,192,3),图像读取后只有3ndim(192,192,3),故在第0个维度上增加一个维度
#output:  array([[0.90475297]], dtype=float32)  输出>0.5,即男性

ps:预测了几张图片后,发现短发女生的预测结果离0较远且接近0.5,长发女生接近0,说明模型识别了头发长短这个特征

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值