计算机视觉加强之机器学习

机器学习=训练样本准备+特征计算+分类器训练【明确的特征进行提取】

深度学习=海量训练样本+人工神经网络【样本更多一些,不一定提取的是什么特征】

一.视频与图片的分结合成

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)

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐