训练一个神经网络,识别自己

训练一个神经网络,能让她认得我
如果你自己有照片,但前提是你的照片足够多。这次用到的照片数是10000张,如果照片不够多,那么就多复制几次。
另外需要下载cifar10数据库。

程序中使用的是dlib来识别人脸部分,Dlib是一个机器学习的C++库,包含了许多机器学习常用的算法。

提取自己图像人脸

#coding: utf-8

import sys

import os

import cv2

import dlib

input_dir = ‘./input_img’

output_dir = ‘./other_faces’

size = 64

if not os.path.exists(output_dir):

os.makedirs(output_dir)

#使用dlib自带的frontal_face_detector作为我们的特征提取器

detector = dlib.get_frontal_face_detector()

index = 1

for (path, dirnames, filenames) in os.walk(input_dir):

print(path)

#print(dirnames)

for filename in filenames:

if filename.endswith(‘.jpg’):

print(‘Being processed picture %s’ % index)

img_path = path+’/’+filename

print(filenames)

# 从文件读取图片

img = cv2.imread(img_path)

print(img_path)

# 转为灰度图片

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用detector进行人脸检测 dets为返回的结果

dets = detector(gray_img, 1)

#使用enumerate 函数遍历序列中的元素以及它们的下标

#下标i即为人脸序号

#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离

#top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离

for i, d in enumerate(dets):

x1 = d.top() if d.top() > 0 else 0

y1 = d.bottom() if d.bottom() > 0 else 0

x2 = d.left() if d.left() > 0 else 0

y2 = d.right() if d.right() > 0 else 0

# img[y:y+h,x:x+w]

face = img[x1:y1,x2:y2]

# 调整图片的尺寸

face = cv2.resize(face, (size,size))

cv2.imshow(‘image’,face)

# 保存图片

cv2.imwrite(output_dir+’/’+str(index)+’.jpg’, face)

index += 1

key = cv2.waitKey(30) & 0xff

if key == 27:

sys.exit(0)

训练模型

#coding: utf-8

import tensorflow as tf

import cv2

import numpy as np

import os

import random

import sys

from sklearn.model_selection import train_test_split

my_faces_path = ‘./my_faces’

other_faces_path = ‘./other_faces’

size = 64

imgs = []

labs = []

def getPaddingSize(img):

h, w, _ = img.shape

top, bottom, left, right = (0,0,0,0)

longest = max(h, w)

if w \< longest:

tmp = longest - w

# //表示整除符号

left = tmp // 2

right = tmp - left

elif h \< longest:

tmp = longest - h

top = tmp // 2

bottom = tmp - top

else:

pass

return top, bottom, left, right

def readData(path , h=size, w=size):

for filename in os.listdir(path):

if filename.endswith(‘.jpg’):

filename = path + ‘/’ + filename

img = cv2.imread(filename)

top,bottom,left,right = getPaddingSize(img)

# 将图片放大, 扩充图片边缘部分

img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, 
value=[0,0,0])

img = cv2.resize(img, (h, w))

imgs.append(img)

labs.append(path)

readData(my_faces_path)

readData(other_faces_path)

# 将图片数据与标签转换成数组

imgs = np.array(imgs)

labs = np.array([[0,1] if lab == my_faces_path else [1,0] for lab in labs])

# 随机划分测试集与训练集

train_x,test_x,train_y,test_y = train_test_split(imgs, labs, test_size=0.05, 
random_state=random.randint(0,100))

# 参数:图片数据的总数,图片的高、宽、通道

train_x = train_x.reshape(train_x.shape[0], size, size, 3)

test_x = test_x.reshape(test_x.shape[0], size, size, 3)

# 将数据转换成小于1的数

train_x = train_x.astype(‘float32’)/255.0

test_x = test_x.astype(‘float32’)/255.0

print(‘train size:%s, test size:%s’ % (len(train_x), len(test_x)))

#print(train_x)

#debug

#sys.exit()

# 图片块,每次取100张图片

batch_size = 100

num_batch = len(train_x) // batch_size

x = tf.placeholder(tf.float32, [None, size, size, 3])

y_ = tf.placeholder(tf.float32, [None, 2])

keep_prob_5 = tf.placeholder(tf.float32)

keep_prob_75 = tf.placeholder(tf.float32)

def weightVariable(shape):

init = tf.random_normal(shape, stddev=0.01)

return tf.Variable(init)

def biasVariable(shape):

init = tf.random_normal(shape)

return tf.Variable(init)

def conv2d(x, W):

return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding=’SAME’)

def maxPool(x):

return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding=’SAME’)

def dropout(x, keep):

return tf.nn.dropout(x, keep)

def cnnLayer():

# 第一层

W1 = weightVariable([3,3,3,32]) # 卷积核大小(3,3), 输入通道(3), 输出通道(32)

b1 = biasVariable([32])

# 卷积

conv1 = tf.nn.relu(conv2d(x, W1) + b1)

# 池化

pool1 = maxPool(conv1)

# 减少过拟合,随机让某些权重不更新

drop1 = dropout(pool1, keep_prob_5)

# 第二层

W2 = weightVariable([3,3,32,64])

b2 = biasVariable([64])

conv2 = tf.nn.relu(conv2d(drop1, W2) + b2)

pool2 = maxPool(conv2)

drop2 = dropout(pool2, keep_prob_5)

# 第三层

W3 = weightVariable([3,3,64,64])

b3 = biasVariable([64])

conv3 = tf.nn.relu(conv2d(drop2, W3) + b3)

pool3 = maxPool(conv3)

# 全连接层

Wf = weightVariable([8*8*64, 512])

bf = biasVariable([512])

drop3_flat = tf.reshape(drop3, [-1, 8*8*64])

dense = tf.nn.relu(tf.matmul(drop3_flat, Wf) + bf)

dropf = dropout(dense, keep_prob_75)

# 输出层

Wout = weightVariable([512,2])

bout = weightVariable([2])

#out = tf.matmul(dropf, Wout) + bout

out = tf.add(tf.matmul(dropf, Wout), bout)

return out

def cnnTrain():

out = cnnLayer()

cross_entropy = 
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out, labels=y_))

train_step = tf.train.AdamOptimizer(0.01).minimize(cross_entropy)

# 比较标签是否相等,再求的所有数的平均值,tf.cast(强制转换类型)

accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(out, 1), tf.argmax(y_, 1)), 
tf.float32))

# 将loss与accuracy保存以供tensorboard使用

tf.summary.scalar(‘loss’, cross_entropy)

tf.summary.scalar(‘accuracy’, accuracy)

merged_summary_op = tf.summary.merge_all()

# 数据保存器的初始化

saver = tf.train.Saver()

with tf.Session() as sess:

sess.run(tf.global_variables_initializer())

summary_writer = tf.summary.FileWriter(‘./tmp’, graph=tf.get_default_graph())

for n in range(10):

# 每次取128(batch_size)张图片

for i in range(num_batch):

batch_x = train_x[i*batch_size : (i+1)*batch_size]

batch_y = train_y[i*batch_size : (i+1)*batch_size]

# 开始训练数据,同时训练三个变量,返回三个数据

_,loss,summary = sess.run([train_step, cross_entropy, merged_summary_op],

feed_dict={x:batch_x,y_:batch_y, keep_prob_5:0.5,keep_prob_75:0.75})

summary_writer.add_summary(summary, n*num_batch+i)

# 打印损失

print(n*num_batch+i, loss)

#print(“=========================”)

if (n*num_batch+i) % 100 == 0:

# 获取测试数据的准确率

acc = accuracy.eval({x:test_x, y_:test_y, keep_prob_5:1.0, keep_prob_75:1.0})

print(“======acc”)

print(n*num_batch+i, acc)

# 准确率大于0.98时保存并退出

if acc > 0.98 and n > 2:

saver.save(sess, ‘./train_faces.model’, global_step=n*num_batch+i)

sys.exit(0)

sys.exit(0)

print(‘accuracy less 0.98, exited!’)

cnnTrain()

使用模型识别
output = cnnLayer()

predict = tf.argmax(output, 1)

saver = tf.train.Saver()

sess = tf.Session()

saver.restore(sess, tf.train.latest_checkpoint(‘.’))

#sess = tf_debug.LocalCLIDebugWrapperSession(sess)

def is_my_face(image):

res = sess.run(predict, feed_dict={x: [image/255.0], keep_prob_5:1.0, 
keep_prob_75: 1.0})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风口上的传奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值