• 【OpenCV图像处理15】人脸识别项目


    十五、人脸识别项目

    主要方法:

    • 哈尔(Haar)级联方法
    • 深度学习方法(DNN)

    Haar是专门为解决人脸识别而推出的,在深度学习还不流行时,Haar已可以商用。

    1、Haar人脸识别

    基本步骤:

    • 创建Haar级联器
    • 导入图像并将其灰度化
    • 调用detectMultiScale方法进行人脸识别

    detectMultiScale()用法:

    detectMultiScale(image, scaleFactor: None, minNeighbors: None, flags: None, minSize: None, maxSize: None) 
    
    • 1

    代码实现:

    import cv2
    
    # 创建Haar级联器
    facer = cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
    
    # 导入图像并将其灰度化
    img = cv2.imread('../resource/people.bmp')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 调用detectMultiScale方法进行人脸识别
    # [[x, y, w, h]]
    faces = facer.detectMultiScale(gray, 1.1, 5)
    
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2、Haar其它脸部特征的检测

    代码实现:

    import cv2
    
    # 创建Haar级联器
    facer = cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
    eye = cv2.CascadeClassifier('../haarcascades/haarcascade_eye.xml')
    
    # 导入图像并将其灰度化
    img = cv2.imread('../resource/people.bmp')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 在检测出的人脸上再检测眼睛
    faces = facer.detectMultiScale(gray, 1.1, 5)
    i = 0
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h,), (0, 0, 255), 2)
    
        roi_img = img[y:y + h, x:x + w]
    
        eyes = eye.detectMultiScale(roi_img, 1.1, 5)
        for (x, y, w, h) in eyes:
            cv2.rectangle(roi_img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
        i = i + 1
        winname = 'face' + str(i)
        cv2.imshow(winname, roi_img)
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3、Haar + Tesseract车牌识别

    基本步骤:

    • 通过Haar定位车牌的大体位置
    • 对车牌进行预处理
      • 对车牌进行二值化处理
      • 进行形态学处理
      • 滤波去除噪点
      • 缩放
    • 调用Tesseract进行文字识别

    代码实现:

    import cv2
    
    # 引入Tesseract库
    import pytesseract
    
    # 创建Haar级联器
    plate = cv2.CascadeClassifier('../haarcascades/haarcascade_russian_plate_number.xml')
    
    # 带车牌的图像
    img = cv2.imread('../resource/plate.webp')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 车牌的定位
    plates = plate.detectMultiScale(gray, 1.1, 3)
    for (x, y, w, h) in plates:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
    # 对获取到的车牌进行预处理
    # 1.提取ROI
    roi = gray[y:y + h, x:x + w]
    # 2.进行二值化
    ret, roi_bin = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # print(pytesseract.image_to_string(roi, lang='chi_sim+eng', config='--psm 8 --oem 3'))
    
    cv2.imshow('plate', img)
    cv2.imshow('roi_bin', roi_bin)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    88888
    
    • 1

    4、深度学习基础知识

    深度学习是计算机视觉最为重要的方法。

    深度学习简史:

    1、深度学习很早就被提出,但一直停滞不前。

    2、2011年,微软在语音识别上使用,取得了突破。

    3、2012年,DNN在图像识别领域取得惊人的效果,在ImageNet评测的错误率从26%降低到15%。

    4、2016年,AlphaGo击败人类,引起世界震惊。

    深度学习网络模型:

    • DNN(Deep Neural Network,深度神经网络)
    • RNN(Recurrent Neural Network,循环神经网络)
    • CNN(Convolutional Neural Network,卷积神经网络)

    RNN主要用途:

    • 语音识别
    • 机器翻译
    • 生成图像描述

    CNN主要用途:

    • 图像分类、检索
    • 目标定位检测
    • 目标分割
    • 人脸识别

    几种CNN网络实现:

    • LeNet,1998年,第一代CNN,28 * 28手写字。
    • AlexNet,2012年,ImageNet比赛的冠军。
    • VGG、GoogLeNet、ResNet

    几种CNN目标检测网络实现:

    • RCNN、Fast RCNN、Faster RCNN
    • SSD(Single Shot Detectors)
    • YOLO、YOLOv2、…、YOLOv5

    深度学习库:

    • tensorflow,Google
    • caffe ->caffe2->torch(pytorch),Facebook贾扬清
    • MXNet,Apache

    训练数据集:

    • MNIST、Fashion-MNIST:手写字母
    • VOC:举办挑战赛时的数据集,2012年后不再举办
    • COCO:用于目标检测的大型数据集
    • ImageNet

    训练模型:

    • Tensorflow训练出的模型是.pb文件
    • Pytorch训练出的模型是.pth文件
    • Caffe训练出的模型是.caffe文件
    • ONNX开放性神经网络交换格式.onnx

    OpenCV对DNN的支持:

    • OpenCV 3.3 将DNN转正
    • OpenCV 只能使用DNN,不能训练DNN模型

    OpenCV支持的模型:

    • Tensorflow
    • Pytorch/torch
    • Caffe
    • DarkNet

    5、OpenCV使用DNN实现图像分类

    DNN使用步骤:

    1、读取模型,并得到深度神经网络

    2、读取图像/视频

    3、将图像转成张量,送入深度神经网络

    4、运行分析,并得到结果

    导入模型:

    # 第一种:Tensorflow
    readNetFromTensorflow(model, config)
    # 第二种:Caffe/Darknet
    readNetFromCaffe/Darknet(config, model)
    # 第三种:Net
    readNet(model, [config, [framework]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    blobFromImage()用法:

    dnn.blobFromImage(image, scalefactor: None, size: None, mean: None, swapRB: None, crop: None, ddepth: None
    
    • 1

    参数说明:

    • scalefactor:缩放因子
    • size:输入图像尺寸
    • mean:平均差值

    将张量送入网络并执行:

    net.setInput(blob)
    r = net.forward()
    
    • 1
    • 2

    代码实现: 物体分类

    import cv2
    from cv2 import dnn
    import numpy as np
    
    # 1.导入模型,创建神经网络
    config = '../config/bvlc_googlenet.prototxt'
    model = '../model/bvlc_googlenet.caffemodel'
    net = dnn.readNetFromCaffe(config, model)
    # 2.读取图像,转成张量
    img = cv2.imread('../resource/r_cat.jpg')
    blob = dnn.blobFromImage(img,
                             1.0,  # 缩放因子
                             (224, 224),  # 输入图像尺寸
                             (104, 117, 123))  # 平均差值
    # 3.将张量输入到网络中,并进行预测
    net.setInput(blob)
    r = net.forward()
    
    # 读取类目
    classes = []
    path = '../model/synset_words.txt'
    with open(path, 'rt') as f:
        classes = [x[x.find(" ") + 1:] for x in f]
    
    order = sorted(r[0], reverse=True)
    z = list(range(3))
    for i in range(0, 3):
        z[i] = np.where(r[0] == order[i])[0][0]
        print('第', i + 1, '项, 匹配:', classes[z[i]], end='')
        print('类所在行:', z[i] + 1, ' ', '可能性:', order[i])
    # 4.得到结果,显示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    1, 匹配: Siamese cat, Siamese
    类所在行: 285   可能性: 0.221662642, 匹配: tabby, tabby cat
    类所在行: 282   可能性: 0.134519443, 匹配: tiger cat
    类所在行: 283   可能性: 0.1054367
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    WOL唤醒配置(以太网、PHY、MAC)
    【剑指offer系列】62. 和为S的两个数字
    什么是驱动?驱动程序的工作原理?
    计算机专业毕业论文java毕业设计开题报告精品基于SSM的社区疫情防控平台[包运行成功]
    部署 k8s 集群
    计算机毕业设计之java+springboot基于vue的大学生体质测试管理系统
    Java — 枚举
    手机无线耳机什么牌子的好用?2022好用的无线蓝牙耳机排行榜
    BOA服务器移植
    【linux】基本指令(三)
  • 原文地址:https://blog.csdn.net/m0_70885101/article/details/126828349