06-机器学习(Haar+Adaboost实现人脸、人眼检测)

机器学习是什么?
机器学习=训练样本+特征+分类器,通过让机器学习的方式,来达到某种功能的过程
深度学习是什么?
深度学习=海量的学习样本+人工神经网络

机器学习需要:样本、特征、分类器、对训练后的数据进行预测或检验
人脸样本+haar特征+adaboost分类器===>就可以实现人脸识别
haar是由一系列模板组成
adaboost分类器是由三级极点组成,(强分类器、弱分类器、node结点)组成

hog特征+svm支持向量机===>实现小狮子的识别

一、视频分解图片

实现步骤:
1,将视频加载进去load
2,读取视频的info信息
3,对视频信息进行解码parse,拿到单帧视频
4,可以通过imshow进行展示,也可以通过imwrite进行保存

(flag,frame) = cap.read()
读取每一帧,人眼可分辨每秒看到16帧
参数一:flag表示读取是否成功
参数二:frame表示图片的内容

将1.mp4视频文件分解成图片

import cv2
cap = cv2.VideoCapture("E:\Jupyter_workspace\study\DL\data/1.mp4")# 获取一个视频打开cap 1 file name
isOpened = cap.isOpened# 判断是否打开‘
print(isOpened)
fps = cap.get(cv2.CAP_PROP_FPS)#帧率:视频每秒可以展示的图片
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#视频的宽度信息
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#视频的高度信息
print(fps,width,height)
i = 0
while(isOpened):if i == 10:breakelse:i = i+1(flag,frame) = cap.read()# 读取每一张 flag frame fileName = 'E:\Jupyter_workspace\study\DL\data/image'+str(i)+'.jpg'print(fileName)if flag == True:cv2.imwrite(fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
print('end!')

二、图片合成视频

将视频写入进去,对写入对象的创建
cv2.VideoWriter('2.mp4',-1,5,size)
参数一:图片合成视频
参数二:-1表示使用一个支持的解码器
参数三:每秒处理的帧数,5帧
参数四:图片视频格式的大小

将一系列imagei(1<i<10)图片合成2.mp4视频

import cv2
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/image1.jpg')
imgInfo = img.shape
size = (imgInfo[1],imgInfo[0])
print(size)
videoWrite = cv2.VideoWriter('2.mp4',-1,5,size)# 写入对象 1 file name
# 2 编码器 3 帧率 4 size
for i in range(1,11):fileName = 'E:\Jupyter_workspace\study\DL\data/image'+str(i)+'.jpg'img = cv2.imread(fileName)videoWrite.write(img)
print('end!')

三、Haar特征原理

什么是Haar特征?
特征:图像某个区域的像素点,经过某种四则运算之后得到的结果,言而与之:像素进行运算所得到的结果;这个结果有可能是一个具体的值、向量、矩阵、多维

Haar是个具体的值,是经过白色方块和黑色方块之后相减得到的,故Haar特征得到的是一个值

如何利用特征区分目标?
通过阈值判决

如何得到判决?
通过机器学习得到判决文献,让机器知道什么是特征;通过机器学习获取判决;利用计算的特征获得阈值判决

计算公式:

特征=白色-黑色
特征=整个区域权重 + 黑色权重
特征=(p1-p2-p3+p4)*w

推导Haar特征公式:
黑色和白色的整体权重为-1;白色部分的权重值为1,黑色部分的权重值为-2
特征 = 整个区域 * 权重1 + 黑色 * 权重2 = (黑+白)* 1 + 黑 * (-2) = 黑+白 - 2 * 黑 = 白-黑

四、Haar特征遍历原理

需要将haar模板从上到下,从左到右进行遍历,也需要知道图片的大小以及模板的大小,若原图像大小为100100,harr模板大小为1010,则需要100次才可以将整个图片遍历完毕
原图100100 模板1010 步长10 使用模板滑动
模板不仅可以进行滑动,还可以进行模板的缩放;例如原先的模板为1010,每次缩放10%,则下次的模板大小为1111,若为20级,则进行20次的缩放
举例:原图像为1080720大小,模板步长step为2,原始模板大小为1010
要想计算整个图像上的haar特征当前的计算量为:14(14个模板) * 20(20级缩放,也就是20次缩放) * (1080/2 * 720/2)(需要这么多的模板) * (10 * 10这一百个点的加减运算) = 50-100亿次的运算
若要求计算机处理每秒不得低于15帧,则 50-100亿次 * 15 = 基本上为1000亿次的运算量,故运算量太大,国外有个大神研究出了积分图的概念,可以极大的减小运算量。

五、积分图

在这里插入图片描述
A为1,B为1 2,C为1 3,D为1 2 3 4
若求第4部分 = A-B-C+D = (1) - (1+2) - (1+3) + (1+2+3+4) = 4

六、Adaboost分类器

例如检测:

苹果、苹果、苹果、香蕉
0.1 — 0.1 — 0.1 — 0.5

则通过检测的结果可以区分种类,此时需要一个终止条件
训练终止条件:
1、迭代的最大次数
2、每次迭代完之后有个检测概率p,即最小的误差概率,例如三个苹果,一个香蕉,此时的检测概率为75%

分类器的结构、Adaboost分类器的计算过程、opencv自带的人脸分类器的文档xml结构

分类器的结构:设定一个阈值T,若haar特征>阈值T,则认为是苹果,否则认为是香蕉,这是一级分类器,但效果不太好
haar>T1 and haar>T2,此时可以使用两级分类器,两个阈值。对于每一级的分类器规定为强分类器,则这是两个强分类器组成;正常情况下Adaboost有15-20个强分类器所组成,若一个目标连续通过15-20这些阈值,则认为是准确目标。
在这里插入图片描述
Adaboost分类器的计算过程
如上图,三个强分类器组成:第一个强分类器特征为x1,阈值为t1、第二个强分类器特征为x2,阈值为t2、第三个强分类器特征为x3,阈值为t3
进行判决的时候x1>t1表明已经通过了第一个强分类器,同理,最后需要都通过这些强分类器,即:x1>t1 and x2>t2 and x3>t3 三个强分类器都通过时,则认为是目标

强分类器作用:判断当前的阈值与当前的特征是否吻合,从而达到目标判决的效果
弱分类器作用:计算强分类器的特征,即计算当前的x1,x2,x3

例如:弱分类器计算的特征为y1,y2,y2;第二个强分类器的阈值x2 = sum(y1,y2,y3)由三个弱分类器计算的特征进行累加从而得到强分类器的特征x2

弱分类器特征y1,y2,y3的计算:每个弱分类器是由若干个Node结点组成,最后的弱分类器的特征的计算还得归结于特征节点Node的计算
Node结点计算弱分类器特征:在opencv中一个弱分类器最多支持3个haar特征,每一个haar特征构成一个Node结点
例如Node1对应haar特征1,若haar特征1 > Node结点1的阈值判决(haar1 > Node1 T),则把当前的结点特征z1 = α1
若haar特征1 < Node结点1的阈值判决(haar1 < Node1 T),则把当前的结点特征z1 = α2

这是Node1,同理可计算出z2、z3
Z = sum(z1,z2,z3),若Z>判决文献T,则弱分类器的计算特征y1=AA
Z = sum(z1,z2,z3),若Z<判决文献T,则弱分类器的计算特征y1=BB
将所有弱分类器的计算特征求和,可得强分类器x,x=sum(y1,y2,y3)
强分类器在和强分类器的阈值文献T进行比较,x >T1
若连续通过三个强分类器的阈值判决文献,则认为是目标

Adaboost训练步骤
1,完成初始化数据的权值分布

苹果 苹果 苹果 香蕉
0.1—0.1—0.1—0.1

2、遍历阈值,计算出一系列的误差概率P,选取一个最小的误差概率minP,其对应的权值为t
3、计算权重G1(x)
4、更新训练数据的权重分布

苹果 苹果 苹果 香蕉
0.2—0.2—0.2—0.8

检测人脸和人眼,并描绘出来

步骤:
1、加载xml文件
2、加载图片
3、计算图片的haar特征和对图像进行灰度处理,haar特征的计算opencv已经封装好了,调用即可;其中用户自需要对图像进行灰度处理即可,因为opencv中的所有haar特征都是基于灰度图片来进行计算的
4、进行检测,检测出当前haar特征的人脸以及人脸上的特征,例如:人脸和眼睛
5、对检测出来的结果进行遍历,并绘制出检测出来的方框

face_xml.detectMultiScale(gray,1.3,5)
参数一:需要进行人脸检测的灰度图
参数二:缩放系数,即比例缩放
参数三:人脸目标大小

import cv2
import numpy as np
# xml文件的引入
face_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_eye.xml')
# 加载含有人脸的图片
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/aa.jpg')
cv2.imshow('src',img)
# 计算haar特征和对图像进行灰度转化gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 人脸识别的检测
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))#检测当前的人脸个数
# 绘制人脸,为检测到的每个人脸进行画方框绘制
for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#人脸识别roi_face = gray[y:y+h,x:x+w]#灰色人脸数据roi_color = img[y:y+h,x:x+w]#彩色人脸数据# 1 grayeyes = eye_xml.detectMultiScale(roi_face)#眼睛识别,图片类型必须是灰度图print('eye=',len(eyes))#打印检测出眼睛的个数for (e_x,e_y,e_w,e_h) in eyes:#绘制眼睛方框到彩色图片上cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)cv2.imshow('dst',img)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

检测人脸,将人脸进行ROI提取,并保存

# 1 load xml 2 load jpg 3 haar gray 4 detect 5 draw
import cv2
import numpy as np
# load xml 1 file name
face_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_eye.xml')
# load jpg
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/face.jpg')
cv2.imshow('src',img)
# haar gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# detect faces 1 data 2 scale 3 5
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))
# draw
index = 0
for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)roi_face = gray[y:y+h,x:x+w]roi_color = img[y:y+h,x:x+w]fileName = "E:\Jupyter_workspace\study\DL\data/"+str(index)+'.jpg'cv2.imwrite(fileName,roi_color)index = index + 1# 1 grayeyes = eye_xml.detectMultiScale(roi_face)print('eye=',len(eyes))#for (e_x,e_y,e_w,e_h) in eyes:#cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
cv2.imshow('dst',img)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php xml表格形式输出,PHP XML如何输出nice格式

这里是代码&#xff1a;$doc new DomDocument(1.0);// create root node$root $doc->createElement(root);$root $doc->appendChild($root);$signed_values array(a > eee, b > sd, c > df);// process one row at a timeforeach ($signed_values as $key &…

Opencv实战【3】——图像修复与图像锐化(darling in the franxx)

目录前言图像修复图像锐化darling in the franxx图片总结前言 前天&#xff0c;在群里看见有人发了这张表情包&#xff1a; 感觉女主有点好看&#xff0c;然后问室友是啥番剧&#xff08;darling in the franxx&#xff09;&#xff0c;然后就去补番了&#xff0c;然后从晚上…

python 示例_Python date isoweekday()方法与示例

python 示例Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is used to manipulate objects of date class of module datetime. date.isoweekday()方法用于处理模块日期时间的日期类的对象。 It uses a date class object and r…

07-机器学习(Hog+SVM实现小狮子识别)

一、SVM支持向量机 什么是SVM支持向量机&#xff1f; SVM支持向量机本质仍是一个分类器&#xff0c;其核心为寻求一个最优超平面最终实现分类&#xff0c;实现分类问题 在寻求超平面的时候有多种方式&#xff0c;可以使用若干条直线或曲线进行分类&#xff0c;这里使用的是直线…

Net Remoting基础篇

一、Remoting基础 什么是Remoting&#xff0c;简而言之&#xff0c;我们可以将其看作是一种分布式处理方式。从微软的产品角度来看&#xff0c;可以说Remoting就是DCOM的一种升 级&#xff0c;它改善了很多功能&#xff0c;并极好的融合到.Net平台下。Microsoft .NET Remoting …

Maven3.0.5代理nexus

Nexus简介 Nexus是Sonatype推出的强大Maven仓库管理器产品&#xff0c;要比以前TSS上介绍的Artifactory要好使用的多&#xff0c;也是一个拆箱即用的Java App&#xff0c;内嵌Jetty容器和Java Wrapper做Windows服务&#xff0c;安装简单到解压然后双击install即可。更详细的帮助…

8253译码电路设计以及初始化编程讲解

先验知识回顾&#xff1a;知识点不清晰的时候可以查询相关知识点。 https://blog.csdn.net/qq_42604176/article/details/105810973 需掌握的主要知识点 1、译码电路设计 2、初始化编程 例题1 在以 8086构成的最大方式系统中&#xff0c;有一片8254的端口地址分别为301H、3…

java安卓写文件路径,如何使用gradle作为构建系统,平台Android配置Protobuf(Java)文件的输出路径?...

我正在努力解决以下问题&#xff1a;我有2个基于maven的java项目和1个基于gradle的Android项目 . 布局如下&#xff1a;Workspace/├── MavenProj1/├── MavenProj2/├── AndroidGradleProject1/├── Protos/所有这些的包结构很常见&#xff0c;比方说 com.example.* 所…

Java System类exit()方法及示例

系统类exit()方法 (System class exit() method) exit() method is available in java.lang package. exit()方法在java.lang包中可用。 exit() method is used to exit the currently running JVM (Java Virtual Machine). exit()方法用于退出当前正在运行的JVM(Java虚拟机)。…

基于图像处理的数码印花喷墨墨滴形状规范的研究(Python+OpenCV+Mysql)

大体思路&#xff1a;由于墨滴的不同参数会对墨滴的形态产生一定的影响&#xff0c;故如果通过研究墨滴的形态则通过海量的数据就可以大概确定墨滴的各项参数指标的范围。通过OpenCV对墨滴的喷出的形状进行图像处理&#xff0c;对墨滴图像进行一系列的分析&#xff0c;通过一系…

ASP.NET 主题(Themes)FAQ

1、主题是什么 主题由一组元素组成&#xff1a;外观、级联样式表 (CSS)、图像和其他资源。主题将至少包含外观。主题是在网站或 Web 服务器上的特殊目录中定义的。主题是一组Web Control的属性设置的集合&#xff0c;提供一种简单的方法设置控件的样式属性。 主题只在Web Contr…

Head First HTML与CSS、XHTML++笔记(第四章 WEB镇之旅 第五章 认识媒体)

第四章 链接&#xff08;详解<a>元素&#xff09; 目标锚 在目标位置 <h2><a id"chai">contentTest</a></h2> 在需要链接位置 <a href"index.html#chai">See</a> 链接到自身的目标锚 <a href"#top"…

Opencv实战【4】——图片动漫化处理

博主联系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950 目录动漫化风格的特点处理手段代码实现效果总结动漫化风格的特点 &#xff08;1&#xff09;动漫中的细节相对少&#xff1b; &#xff08;2&#xff09;动漫中的边…

nextshort_Java扫描仪的nextShort()方法与示例

nextshort扫描器类的nextShort()方法 (Scanner Class nextShort() method) Syntax: 句法&#xff1a; public short nextShort();public short nextShort(int rad);nextShort() method is available in java.util package. nextShort()方法在java.util包中可用。 nextShort() …

php 生成css文件怎么打开,php生成html文件的多种步骤介绍

//定义日期函数functiongetdatetime(){$datetimegetdate();$strReturn$datetime["year"]."-";$strReturn$strReturn.$datetime["mon"]."-";$strReturn$strReturn.$datetime["mday"];return$strReturn;}//定义时间函数(文件名…

08-KNN手写数字识别

标签下载地址 文件内容备注train-images-idx3-ubyte.gz训练集图片&#xff1a;55000张训练图片&#xff0c;5000张验证图片train-labels-idx1-ubyte.gz训练集图片对应的数字标签t10k-images-idx3-ubyte.gz测试集图片&#xff1a;10000张图片t表示test&#xff0c;测试图片&…

MFC odbc访问远程数据库

首先&#xff0c;MFC通过ODBC访问数据库&#xff0c;主要使用两个类&#xff0c;一个是CDataBase&#xff0c;一个是CRecordset。第一个是用于建立数据库连接的&#xff0c;第二个是数据集&#xff0c;用来查询的。步骤如下&#xff1a;1.实例化一个CDataBase对象&#xff0c;并…

微机原理——扩展存储器设计

目录【1】存储器的层次结构【2】存储器的分类【3】SRAM1、基本原理&#xff1a;2、结构&#xff1a;3、芯片参数与引脚解读&#xff1a;4、CPU与SRAM的连接方式【4】DRAM1、基本原理&#xff1a;2、结构3、芯片引脚解读&#xff1a;【5】存储器系统设计【6】存储器扩展设计&…

floatvalue 重写_Java Number floatValue()方法与示例

floatvalue 重写Number类floatValue()方法 (Number Class floatValue() method) floatValue() method is available in java.lang package. floatValue()方法在java.lang包中可用。 floatValue() method is used to return the value denoted by this Number object converted …

array_column php什么版本可以用,array_column兼容php5.5以下版本

gistfile1.txt// ----------------------------------------------------------------------// |获取二维数组中指定的一列&#xff0c;PHP5.5以后有专用函数array_column()// ----------------------------------------------------------------------// |param array $arr// …