机器视觉之人脸识别 机器视觉人脸识别实验报告
ztj100 2024-12-19 17:56 37 浏览 0 评论
上一期我们玩了下人脸检测,深感写得不好,这期好好写。
小枪换炮,我们一起来做人脸识别如何?
话不多说。。。
step 1 网络
人脸检测好了,如何知道是谁呢?首先搞个CNN分配器。
那学习下CNN的结构
一看图,别跑,乍一看就是把图像经过卷积输出一组数据 其实不就是基于深度网络的特征提取吗?那好了,最后的1024个特征全连接到几个人就OK了。
使用keras构建一个不就好了,照猫画虎 代码奉上:
model = Sequential()
model.add(Conv2D(32,kernel_size = (3,3), strides = (1,1), padding = 'same', input_shape = (114,114,3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64,kernel_size = (3,3), strides = (1,1), padding = 'same', activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128,kernel_size = (3,3), strides = (1,1), padding = 'same', activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128,activation = 'relu'))
model.add(Dense(64,activation = 'relu'))
model.add(Dense(len(classes),activation = 'softmax'))
说明:
Sequential:序贯模型
序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠
add 网络添加
添加网络到序贯模型
Conv2D:二维卷积
图像的处理当然是二维卷积了
Conv2D(32,kernel_size = (3,3), strides = (1,1), padding = 'same', input_shape = (114,114,3), activation = 'relu')
参数说明:
- 32 输出的维度大小
- kernel_size 卷积核的大小
- strides 步长(每次卷积操作跳的步长)
- padding 自动填充输入
- input_shape 输入的shape我们输入的是114*114*3
- activation 激活函数
MaxPooling2D:最大池化层
就是弄个卷积比如(2*2)在这个2*2的图像里取最大值代替2*2所以输出减半喽
Dropout:防止过拟合的
按照一定的概率将一段神经网络暂时从网络中丢弃
Flatten:扁平化层
就是把多维的数据变成一维的
Dense:全连接层
把扁平化的数据全连接到我们输出的类的数量上,比如classes的长度
classes里面就是我们不同人的id呗。
网络构建好了 数据呢??
step2 数据
深度神经网络的主要做的就是就是 数据 --->网络模型学习--->识别
好的,那我们录下自己的数据呗,每个人一个名字一个文件夹,里面放114*114大小的脸部图片。
如:
之前我们做好了人脸检测的那我们在这基础上检测人脸并保存到文件夹里呗,代码奉上:
import cv2
import os
import numpy as np
xml_path = r'./haarcascade_frontalface_default.xml'
cascade_signal = cv2.CascadeClassifier(xml_path)
cap = cv2.VideoCapture(0)#注意这里是数字零、
dir_name='./xia/'#存放人脸的文件夹名称,你的名字
num=0
#检测到没有文件夹构建一个呗
if not os.path.isdir(dir_name):
os.mkdir(dir_name)
while True:
box = []
_,frame= cap.read()#读取第一帧画面
#读取成功
if _:
#置信度的与阈值1~1.5 越大识别越的要求高,但可能识别出你就很困难、
result = cascade_signal.detectMultiScale(frame, 1.3, 5)
#识别到了画出来
if result != ():
result_mean = np.mean(result, axis=0)
x = int(result_mean[0])
y = int(result_mean[1])
w = int(result_mean[2])
h = int(result_mean[3])
box = (x,y,x+w,y+h)
face_img = frame[y:y+h, x:x+w]
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),1)
#显示出来
cv2.imshow('im',frame)
#保存脸部信息
cv2.imwrite(dir_name+('%06d.png'%num),cv2.resize(face_img,(114,114)))
cv2.waitKey(1)
num+=1
cap.replease()
好的我们有自己的脸再去找些其他人的脸吧!
一个萝卜一个坑 一个一个文件夹准备好:
当然不能写汉字,这里写汉字主要是皮一下。。。
数据数量:
样式越多越好,表情丰富,光线充足 。一千以上
构建数据集
按照比例构建数据集,有两个需要的,训练数据集,测试数据集
读取所有图片,每个人的脸部图片对应一个标签0~10递增当然也可以是0~100看你有多少文件夹多少个人了
还说啥代码:
def dataset(data_dir):
category_count=0
for dirname in os.listdir(data_dir):
if os.path.isdir(data_dir+'/'+dirname):
sample_count = 0
print("load-->"+dirname)
sub_dir = data_dir+"/"+dirname
for filename in os.listdir(sub_dir):
max_ = len(os.listdir(sub_dir))
sub_img = sub_dir+"/"+filename
img = cv2.imread(sub_img)
sample_count += 1
if(sample_count <= max_*0.2):
validation_images.append(img)
self.validation_labels.append(self.category_count)
else:
train_images.append(img)
train_labels.append(category_count)
category_count+=1
train_images = np.asarray(train_images)
train_labels = np.asarray(train_labels)
validation_images = np.asarray(validation_images)
validation_labels = np.asarray(validation_labels)
return train_images,train_labels,validation_images,validation_labels
完后就是训练了,点赞超百,马上开始训练,哭了帮兄弟一把吧
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)