机器学习是什么?
机器学习=训练样本+特征+分类器
,通过让机器学习的方式,来达到某种功能的过程
深度学习是什么?
深度学习=海量的学习样本+人工神经网络
机器学习需要:样本、特征、分类器、对训练后的数据进行预测或检验
人脸样本+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)