计算机视觉加强之机器学习
机器学习=训练样本准备+特征计算+分类器训练【明确的特征进行提取】
深度学习=海量训练样本+人工神经网络【样本更多一些,不一定提取的是什么特征】
一.视频与图片的分结合成
1.视频分解图片步骤
- load
- info
- parse
- imshow和imwrite
2.视频分解图片实例代码
人眼能识别的帧率是15帧,如果帧率超过15帧则视为视频
import cv2
cap = cv2.VideoCapture("1.mp4")#读取视频,获取一个视频打开cap
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:
break
else:
i = i+1
(flag,frame) = cap.read()#读取每一张flag(表示是否读取成功),frame表示读取内容
fileName = 'image'+str(i)+'.jpg'
print(fileName)
if flag == True:#如果读取成功,则写入图片
cv2.imwrite(fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
print('end!')
3.图片合成视频实例代码
import cv2
img = cv2.imread('image1.jpg')
imgInfo = img.shape
size = (imgInfo[1],imgInfo[0])
print(size)
videoWrite = cv2.VideoWriter('2.mp4',-1,5,size)#参数1:文件名称;参数2:编码器;参数3:每秒帧数;参数4:大小(写入对象的创建)
for i in range(1,11):
fileName = 'image'+str(i)+'.jpg'
img = cv2.imread(fileName)
videoWrite.write(img)#写入方法:参数为写入数据
print('end')
二.Haar特征原理
主要场景:人脸识别
什么是特征?图像中某个区域的像素点,经过运算后得到的结果,可以是一个具体的值或是向量或是矩阵或是多维
如何利用特征区分目标(分类)? 阈值判决(如果 特征>阈值 则为目标,如果小于阈值则为非目标)
如何得到判决?使用机器学习得到判决门限,通过计算特征进行阈值判决
1.计算公式
特征 = 白色-黑色
特征 = 整个区域*权重+黑色*权重
特征 = (p1-p2-p3+p4)*w
2.什么是haar特征?
- 本质也是特征,是像素经过运算的结果
3.haar特征遍历
- 要想检测一个图片上的haar特征,则需要使用haar模板自上至下/自左至右进行遍历
- 故需要知道图片的大小和模板的大小【如图片大小是100/*100、模板大小是10/*10、步长是10的话、需要遍历100次】
- 举例:1080/*720图片 step是2 模板大小是10/*10
- 计算量 = 14个模板*20次缩放*(1080/2*720/2)*(100点的加减) = 50-100亿次计算
三.Adaboost分类器原理
haar+adaboost可以实现人脸识别
haar提供特征模板;adaboost包含三级(强分类器,弱分类器及弱分类器下面的node)
1.Adaboost简介
- 优点:前一个基本分类器分出来的样本在下一个分类器中得到了加强,加强后的样本再次被用来训练下一个基本分类器
- 举例:使用分类器区分苹果和香蕉
- 苹果 苹果 苹果 香蕉
- 0.1 0.1 0.1 0.5
- 在每次分类中加强样本,并交给下一次分类器进行分类,训练的终止条件
- 迭代的终止(迭代次数)
- 当训练过程大约最小的检测概率
2.Adaboost训练结构
- 一级分类器:haar特征> T1阈值 时则视为苹果,否则则视为香蕉
- 二级分类器:haar特征> T2阈值 时则视为苹果,否则则视为香蕉
- …
- 如使用3个强分类器进行判决
- 第一个强分类器:x1特征 阈值T1
- 第二个强分类器:x2特征 阈值T2
- 第三个强分类器:x3特征 阈值T3
- 当x1>T1 and x2>T2 and x3>T3时,则认为是苹果,否则任意一次分类不满足则都视为香蕉
- 阈值的来源:使用机器学习进行训练
- 强分类器的作用是用来判决,弱分类器的作用是计算强分类器的特征x1,x2,x3,如x2 = sum(y1,y2,y3)
- 弱分类器的y特征是由若干特征Node组成,在OpenCV中一个弱分类器最高支持三个haar特征,而每一个haar特征构成一个node节点,每一个haar特征对应一个node节点
- 每个节点来说,1node 对应的 haar1> nodeT1 z1=a1
- 如果1node 对应的 haar1< nodeT1 z1=a2
- z = sum(z1,z2,z3) > 弱分类器的判决门限T,则y1=AA
- z = sum(z1,z2,z3) < 弱分类器的判决门限T,则y1=BB
- 简述过程
- haar -> Node z1 z2 z3 Z=sum(z1,z3,z3)
- Z>T y1 y2 y3
- x=sum(y1,y2,y3)>T1/T2/T3 判决结果对象:obj
3.Adaboost训练详细过程
- 1.初始化数据权值分布
- 苹果 苹果 苹果 香蕉
- 第一轮训练,将每一个权值都设为0.1。假设为0.1
- 2.遍历判决阈值得到所有的误差概率
- 最小的误差概率minP对应的权值t
- 3.获得权重系数G1(x)
- 4.更新权重分布update
- 0.2 0.2 0.2 0.8
- 5.循环2-4步,终止条件为训练次数到达,或p是否满足训练终止条件
4.OpenCV自带的人脸识别的分类器文件结构
- OpenCV分类器自带的人脸识别xml文件如下
- haarcascade_eye.xml
- haarcascade_frontalface_default.xml
- 在haarcascade_frontalface_default.xml中描述了相关分类器信息
5.实例代码人脸识别
- 准备好了两个已经训练好了的adaboost分类器的xml文件
- haarcascade_eye.xml眼睛分类器
- haarcascade_frontalface_default.xml人脸分类器
#1.load xml文件 2.加载图片 3.haar特征 灰度处理 4.detect检测(两个xml文件,一个文件描述人脸,一个文件描述眼睛) 5.绘制脸与眼睛进行标识
import cv2
import numpy as np
#xml文件的引入 参数:文件名称
face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
#load jpg
img = cv2.imread('face.jpg')
cv2.imshow('src',img)
#haar转换成灰度图像
gray = cv2.cvtColor(img,cv.COLOR_BGR2GRAY)
#detect检测图片的人脸 参数:灰度图片的数据(缩放系数为1.3),缩放系数,目标大小(人脸不能小于5个像素)
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)#参数1:绘制数据;参数2:起始坐标
roi_face = gray[y:y+h,x:x+w]#获得灰度人脸范围
roi_color = img[y:y+h,x:x+w]#获得彩色人脸
#参数为灰度图像
eyes = 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)