基于

作为一个图像处理的爱好者,怎能放过人脸识别这一环呢!调研开搞,发现了超实用的

Facecognition人脸识别原理大体可分为:

1、通过hog算子定位人脸,也可以用cnn模型,但本文没试过;

2、Dlib有专门的函数和模型,实现人脸68个特征点的定位。通过图像的几何变换(仿射、旋转、缩放),使各个特征点对齐(将眼睛、嘴等部位移到相同位置);

3、训练一个神经网络,将输入的脸部图像生成为128维的预测值。训练的大致过程为:将同一人的两张不同照片和另一人的照片一起喂入神经网络,不断迭代训练,使同一人的两张照片编码后的预测值接近,不同人的照片预测值拉远;

4、将陌生人脸预测为128维的向量,与人脸库中的数据进行比对,找出阈值范围内欧氏距离最小的人脸,完成识别。

1 开发环境

PyCharm: PyCharm Community Edition 2020.3.2 x64

Python:Python 3.8.7

Opencv:opencv-python 4.5.1.48

Facecognition:1.3.0

Dlb:dlb 0.5.0

2 环境搭建

本文不做PyCharm和Python安装,这个自己搞不定,就别玩了~

pip install opencv-python

pip install face-recognition

pip install face-recognition-models

pip install dlb

3 打造自己的人脸库

通过opencv、facecogniton定位人脸并保存人脸头像,生成人脸数据集,代码如下:

import face_recognition

import cv2

import os

def builddataset():

Video_face = cv2.VideoCapture(0)

num=0

while True:

flag, frame = Video_face.read();

if flag:

cv2.imshow('frame', frame)

cv2.waitKey(2)

else:

break

face_locations = face_recognition.face_locations(frame)

if face_locations:

x_face = frame[face_locations[0][0]-50:face_locations[0][2]+50, face_locations[0][3]-50:face_locations[0][1]+50];

#x_face = cv2.resize(x_face, dsize=(200, 200));

bo_photo = cv2.imwrite("%s\%d.jpg" % ("traindataset/ylb", num), x_face);

print("保存成功:%d" % num)

num=num+1

else:

print("****未检查到头像****")

Video_face.release()

if __name__ == '__main__':

builddataset();

pass

4、模型训练与保存

通过数据集进行训练,得到人脸识别码,以numpy数据形式保存(人脸识别码)模型

def __init__(self, trainpath,labelname,modelpath, predictpath):

self.trainpath = trainpath

self.labelname = labelname

self.modelpath = modelpath

self.predictpath = predictpath

# no doc

def train(self, trainpath, modelpath):

encodings = []

dirs = os.listdir(trainpath)

for k,dir in enumerate(dirs):

filelist = os.listdir(trainpath+'/'+dir)

for i in range(0, len(filelist)):

imgname = trainpath + '/'+dir+'/%d.jpg' % (i)

picture_of_me = face_recognition.load_image_file(imgname)

face_locations = face_recognition.face_locations(picture_of_me)

if face_locations:

print(face_locations)

my_face_encoding = face_recognition.face_encodings(picture_of_me,

face_locations)[0]

encodings.append(my_face_encoding)

if encodings:

numpy.save(modelpath, encodings)

print(len(encodings))

print("model train is sucess")

else:

print("model train is failed")

5、人脸识别及跟踪

通过opencv启动摄像头并获取视频,加载训练好模型完成识别及跟踪,为避免视频卡顿设置了隔帧处理。

def predicvideo(self,names,model):

Video_face = cv2.VideoCapture(0)

num=0

recongnition=[]

unknown_face_locations=[]

while True:

flag, frame = Video_face.read();

frame = cv2.flip(frame, 1) # 镜像操作

num=num+1

if flag:

self.predictpeople(num, recongnition,unknown_face_locations,frame, names, encodings)

else:

break

Video_face.release()

def predictpeople(self, condition,recongnition,unknown_face_locations,unknown_picture,labels,encodings):

if condition%5==0:

face_locations = face_recognition.face_locations(unknown_picture)

unknown_face_encoding = face_recognition.face_encodings(unknown_picture,face_locations)

unknown_face_locations.clear()

recongnition.clear()

for index, value in enumerate(unknown_face_encoding):

unknown_face_locations.append(face_locations[index])

results = face_recognition.compare_faces(encodings, value, 0.4)

splitresult = numpy.array_split(results, len(labels))

trueNum=[]

a1 = ''

for item in splitresult:

number = numpy.sum(item)

trueNum.append(number)

if numpy.max(trueNum) > 0:

id = numpy.argsort(trueNum)[-1]

a1 = labels[id]

cv2.rectangle(unknown_picture,

pt1=(unknown_face_locations[index][1], unknown_face_locations[index][0]),

pt2=(unknown_face_locations[index][3], unknown_face_locations[index][2]),

color=[0, 0, 255],

thickness=2);

cv2.putText(unknown_picture, a1,

(unknown_face_locations[index][1], unknown_face_locations[index][0]),

cv2.FONT_ITALIC, 1, [0, 0, 255], 2);

else:

a1 = "unkown"

cv2.rectangle(unknown_picture,

pt1=(unknown_face_locations[index][1], unknown_face_locations[index][0]),

pt2=(unknown_face_locations[index][3], unknown_face_locations[index][2]),

color=[0, 0, 255],

thickness=2);

cv2.putText(unknown_picture, a1,

(unknown_face_locations[index][1], unknown_face_locations[index][0]),

cv2.FONT_ITALIC, 1, [0, 0, 255], 2);

recongnition.append(a1)

else:

self.drawRect(unknown_picture,recongnition,unknown_face_locations)

cv2.imshow('face', unknown_picture)

cv2.waitKey(1)

6、结语

通过opencv启动摄像头并获取实时视频,为避免过度卡顿采取隔帧处理;利用Facecognition实现模型的训练、保存、识别,二者结合实现了实时视频人脸的多人识别及跟踪,希望对大家有所帮助~!

java人脸识别快速搭建_基于Facecognition+Opencv快速搭建人脸识别及跟踪应用相关推荐

  1. opencv python考勤_基于python+opencv的简易人脸识别打卡系统

    importcv2importosimportnumpy as npfrom PIL importImageimportdatetimeimportcsvfrom time importsleep#调 ...

  2. Java微服务_医疗管理项目_基于若依快速开发框架

    一.项目简介 项目简介:尚医疗是专门为各大医院.门]诊提供的一款医疗管理平台.系统包含:系统 管理.药品进销存管理.看病就诊.收费管理.检查管理.数据统计等核心模块.通过尚医 疗系统可以快速方便的管理 ...

  3. 基于python+OpenCV的车牌号码识别

    基于python+OpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分: ...

  4. java 百度账号注册界面_基于百度AI开放平台的人脸识别的注册登录(1)

    百度ai开放平台首页 2.选择产品服务,人脸与人体识别,人脸识别选项.打开后如图所示 人脸识别 3.点击立即使用 3.jpg 4.点击创捷应用 创建应用 这一页大家按自己需求填写即可 5.创建完成后点 ...

  5. python opencv生成tf模型_基于TensorFlow+ Opencv 的人脸识别 和模型训练

    一.准备工作 本次实例的anaconda 环境 (有需要的自己导入anaconda) 链接:https://pan.baidu.com/s/1IVt2ap-NYdg64uHSh-viaA 提取码:g7 ...

  6. python人脸识别环境搭建_怎样用3分钟搭建 Python 人脸识别系统

    Face Recognition 使用的是 C++ 开源库 dlib 通过深度学习模型构建的先进人脸识别系统,可通过 Python 接口或命令行工具对图片中的人脸进行识别.在 Labeled Face ...

  7. java 百度账号注册界面_基于百度AI使用H5实现调用摄像头进行人脸注册、人脸搜索功能(Java)...

    人脸注册.人脸搜索使用百度AI接口.不支持H5活体检测(需要活体检测请参考百度AI-H5活体检测) 只是为了演示.所以是IP.最好用火狐浏览器访问.谷歌提示异常作者就不专门修改了.大家可以直接下载源码 ...

  8. python人脸深度识别_基于Python的深度学习人脸识别方法

    基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...

  9. python人脸口罩识别_基于Python+OpenCV的人脸口罩识别检测

    以下编程在Jupyter notbook平台上进行 一.OpenCV下载安装 二.人脸口罩数据集下载处理 (一)人脸口罩数据集下载 下载人脸口罩数据集的目的是利用OpenCV进行模型训练,这里采用口罩 ...

最新文章

  1. 【Qt】获取、比较Qt版本的宏和函数
  2. Django博客系统项目需求分析
  3. 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码
  4. C++中错误no matching function for call to transform
  5. 1200可以读取modbus tcp_S7-1200 作 MODBUS TCP服务器
  6. 专有网络 VPC > VPC与外部网络连接 > 连接VPC
  7. Myeclipse 2020.5 版本首发!支持 Java14
  8. Flutter之SafeArea
  9. mysql postgresql nav_Mysql/postgreSQL
  10. 基于51单片机控制步进电机正反转
  11. Linux 档案属性与目录配置
  12. 数据库建模逆向工程工具
  13. mysql 整型最大值_在SQL中如何获取整数的最大值?
  14. Xamarin iOS 部署应用提示 iOS code signing key 失败
  15. Matlab笔记 第二章 基本操作与矩阵输入
  16. mysql实操《学生表》
  17. 人工智能面试总结-正则优化函数
  18. JavaScript 操作元素案例练习
  19. 基于扩张观测器(LESO)的滑模控制
  20. 考研逻辑课程学习笔记(一)

热门文章

  1. 从内部失衡到外部失衡-中国视角下的宏观经济
  2. 转自程先的专栏:如果是初学C语言请看完 一些成功人士的心得
  3. 百度地图手机端单触点单击和长按事件,解决部分手机(小米手机)地图单击事件失效,多触点、拖动依然触发长按的bug
  4. 前端零碎整理一 浏览器HTTP
  5. 前端radio单选框默认选中_html中radio单选按钮控件标签用法解析及如何设置默认选中...
  6. QSettings读取ini文件,中文key方法
  7. electron安装后运行报错解决方法
  8. AJAX框架衣柜门款式推拉,衣柜门怎么选不踩雷?这里有8种搭配思路!
  9. C#的(int) /int.Parse()/int.TryParse()/Convent.ToInt32()的区别--推荐使用Int.TryParse()
  10. Tomcat xml文件的部署失败问题解决