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,一经查实,立即删除!

相关文章

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

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

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…

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

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

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

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

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】存储器扩展设计&…

09-CNN手写数字识别

CNN卷积神经网络的本质就是卷积运算 维度的调整&#xff1a; tf.reshape(imageInput,[-1,28,28,1]) imageInput为[None,784]&#xff0c;N行* 784维 调整为 M28行28列*1通道 即&#xff1a;二维转化为四维数据 参数一&#xff1a;等价于运算结果M 参数二&#xff1a;28 28 表示…

Opencv将处理后的视频保存出现的问题

问题描述&#xff1a; 代码运行过程中&#xff0c;imshow出来的每帧的效果图是正确的&#xff0c;但是按照网上的方法保存下来却是0kb&#xff0c;打开不了。 参考的网上的一些方法&#xff0c;均是失败的&#xff0c;具体原因我也不清楚&#xff1a; 1、例如我这样设置&#x…

黑白图片颜色反转并保存

将图像的黑白颜色反转并保存 import cv2 # opencv读取图像 img cv2.imread(rE:\Python-workspace\OpenCV\OpenCV/YY.png, 1) cv2.imshow(img, img) img_shape img.shape # 图像大小(565, 650, 3) print(img_shape) h img_shape[0] w img_shape[1] # 彩色图像转换为灰度图…

家猫WEB系统

现在只放源码在些.为它写应用很简单有空整理文档演示地址:jiamaocode.com/os/ 源码&#xff1a;http://jiamaocode.com/ProCts/2011/04/14/1918/1918.html转载于:https://www.cnblogs.com/jiamao/archive/2011/04/16/2018339.html

plesk 运行不了php,如何在Plesk中使用composer(使用其他版本的PHP运行Composer)

对于基于Plesk的服务器, composer的默认安装将使用系统安装的PHP版本, 而不使用Plesk所安装的任何版本。尽管Composer至少需要PHP 5.3.2, 但是当你尝试在需要特定版本PHP的项目中安装依赖项时, 就会出现问题。例如, 如果你有一个至少需要PHP 7.2的项目, 并且系统的默认PHP安装是…

Error: Flash Download failed - Target DLL has been cancelled

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片…

我也谈委托与事件

虽然在博客园里面已经有很多关于C#委托和事件的文章&#xff0c;但是为了自己在学习的过程中&#xff0c;加深对委托的理解&#xff0c;我还是决定写一下自己的心得体会。以备他日在回来复习。委托&#xff08;delegate&#xff09;是一个类&#xff0c;但是这个类在声明的时候…

设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能

染色动力学性能研究染色的什么问题?设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能?并指出如何计算反映染色动力学的主要参数? 标准答案: 染色动力学研究染色速率问题。 为了研究阳离子改性棉纤维及未改性棉纤维对活性染料染色动力学性能,首先要测…

SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

SQL SERVER的锁机制&#xff08;一&#xff09;——概述&#xff08;锁的种类与范围&#xff09; SQL SERVER的锁机制&#xff08;二&#xff09;——概述&#xff08;锁的兼容性与可以锁定的资源&#xff09; 本文上接SQL SERVER的锁机制&#xff08;三&#xff09;——概述&a…

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量?

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量? 标准答案: 通常依据各染料对特定波长光的吸光度具有加和性;吸光度值符合朗伯比尔定律,吸光度与浓度成正比;吸光度值分光光度计可以读出;通过联立方程,可以求出拼色各染料在染液中…