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

机器学习需要:样本、特征、分类器、对训练后的数据进行预测或检验
人脸样本+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)


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

  1. 基于haar+adaboost的人脸检测、深度学习的人脸识别技术应用综述

    版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎交流,QQ:896922782,微信:15058133936 目录 第一节 核心技术 3 一.人脸检测 3 二.特征点检测 5 三.人脸归一化 ...

  2. 【人脸识别(五)】:基于Haar+Adaboost的人脸检测算法,及实例教程

    人脸识别(一):Ubuntu Python安装dlib C++ library 人脸识别(二):如何使用 dlib 实现简单的人脸识别功能 人脸识别(三):使用face_recognition库实现人 ...

  3. 目标识别:如何从人脸图片中扣出眼图,实时人脸人眼检测和识别

    一.了解opencv级联多级分类器: 我们使用opencv级联多级分类器进行解读: 1.基本概念  opencv中的人脸检测使用基于Harr的级联分类和基于LBP的级联分类.  Harr是在2001年 ...

  4. python人脸检测代码_python3+openCV实现图片的人脸人眼检测,原理+参数+源代码

    上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测 but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心 然鹅天道好轮回,现在捡起来了原来的算法一 ...

  5. python3+openCV实现图片的人脸人眼检测,原理+参数+源代码

    上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测 but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心 然鹅天道好轮回,现在捡起来了原来的算法一 ...

  6. haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理

    首先,说几点: 1.人脸检测就是在一幅图片中检测出有无人脸,人脸在图片中的哪块区域.通常人脸检测完了之后就交给人脸识别,具体识别是谁. 2.Haar-Adaboost进行人脸检测的流程如下: a,收集 ...

  7. matlab人眼识别原理,基于MATLAB的人眼检测.docx

    基于MATLAB的人眼检测要点 目录 TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc388122853" 摘要 PAGEREF ...

  8. 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器

    本文转载自张雨石http://blog.csdn.net/stdcoutzyx/article/details/34842233 基于Haar特征的Adaboost级联人脸检测分类器 基于Haar特征 ...

  9. opencv实战3: CascadeClassifier+Haar特征进行人脸检测

    1.级联分类器CascadeClassifier OpenCV官方文档:https://docs.opencv.org/3.4.3/d5/d54/group__objdetect.html 分类器: ...

最新文章

  1. iOS-UIWebView添加头部和尾部
  2. linux安装xz解压xz文件和安装python
  3. 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
  4. 【springboot+easypoi】一行代码搞定excel导入导出
  5. Java 打包 FatJar 方法小结
  6. Linux 内核宏 time_after解析
  7. 大唐波斯将军 机器人_跑到大唐的萨珊波斯遗民
  8. [转载]关于Microsoft Jet (msjet40.dll) Exploit
  9. ComboBox控件值对类
  10. REGEXP使用经验
  11. Beyond Compare设置文本文件和Delphi源码默认的打开格式为ANSI
  12. Android9怎么剪辑音频,Timbre – 安卓(Android )视频剪辑软件,在手机上对视频、音频进行合并、剪辑、格式转换、分割...
  13. 研究调查脉搏血氧饱和度仪使用Masimo RRp(R)读取儿科患者呼吸率的精度
  14. java workflow 教程_学习(史帝芬)osworkflow入门教程后的一些体会
  15. gd32f103 调试 ad7606
  16. Android 将drawable下的图片转换成bitmap、Drawable
  17. java读取jpg点数_我的世界:基岩版beta1.16.0.61修复59个“特性”,同步Java版?
  18. 百度云视频 在线倍速播放
  19. 新车落地几种常见的配件加装建议
  20. Word2003文档中字数统计在哪?

热门文章

  1. 多线程写mysql数据库_多线程读写mysql数据库
  2. 树莓派安装win10arm linux,在树莓派3B 上安装 Windows 10 ARM 版的方法
  3. http请求post,返回excel文件,并接收
  4. Webpack 2 视频教程 002 - NodeJS 安装与配置
  5. 一套比较完整的前端技术选型,需要规整哪些东西,你知道不?
  6. 初学者Web介绍一些前端开发中的基本概念用到的技术
  7. javascript中编码与解码的decodeURI()、decodeURIComponent()区别
  8. python模块之configparser
  9. APPLE STORE
  10. 单片机串行通信全解析