有关人脸识别相关内容及实战(内含机器学习知识)

本文详细介绍了人脸识别中的两种主要方法:哈尔级联方法,包括创建级联器、人脸检测和实战应用;以及深度学习方法,特别是DNN在图像分类中的应用。还涉及了Haar级联器在车牌识别中的应用,以及TesseractOCR的文字识别。
摘要由CSDN通过智能技术生成

人脸识别两种方法

(1)哈尔(haar)级联方法

(2)深度学习方法(DNN)

哈尔(haar)级联方法

haar是专门为解决人脸识别而推出的,且在深度学习之前,haar就已经广泛运用了。

哈尔(haar)人脸识别步骤

(1)创建haar级联器(此时需要一些训练后的数据)(如果有需要,可以后台私信我)

(2)导入图片并且灰度化(也可以使用摄像头捕捉)

(3)调用detectMultiscale方法进行人脸识别

detectMultiscale API

detectMultiscale(img,double scaleFactor=1.1,int minNeighbors=3,……)

double scaleFactor:缩放因子,由于图片可能偏大,我们扫描的框可能无法覆盖整张脸,所以此时需要进行缩放

int minNeighbors:最小像素值,人脸识别时最小的的像素

哈尔(haar)人脸识别实战

import cv2
import numpy as np

# 第一步,创建Haar级联器  导入训练好的数据
facer = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')

# 第二步,传入图片
img = cv2.imread('p3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 第三步,进行人脸识别
# 返回值faces是一个数组[[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), 3)

cv2.imshow('img', img)
cv2.waitKey(0)

 哈尔(haar)人脸识别实战(其他脸部特征检测)

import cv2
import numpy as np

# 第一步,创建Haar级联器  导入训练好的数据
facer = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')

# 第二步,传入图片
img = cv2.imread('p3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 第三步,进行人脸识别
# 返回值faces是一个数组[[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), 3)

eyes = eye.detectMultiScale(gray, 1.1, 5)
# 画框
for (x, y, w, h) in eyes:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)

cv2.imshow('img', img)
cv2.waitKey(0)

其他器官的方法都是类似的,改变所创建的haar级联器,得到我们需要的目的。

此时会出现一个问题,脸是比较准确的,但是器官未必那么准确,所以我们可以将脸部器官的寻找放在脸部位置。修改改代码如下。

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), 3)
    roi_img = img[y:y + h, x:x + h]  # 此时的yx的顺序不能弄反
    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), (255, 0, 0), 3)

    i = i + 1
    winname = 'face' + str(i)
    cv2.imshow(winname, roi_img)


Haar+Tesseract 车牌识别

车牌识别的具体步骤

(1)通过Haar确定车牌位置

(2)对车牌进行预处理 (对车牌二值化,进行形态学处理,去噪声,缩放)

(3)用Tesseract进行文字识别

Tesseract安装

安装教程:Tesseract-OCR下载和安装,Python-OCR使用-CSDN博客

安装完可能会出现一些错误,修改方法如后:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it‘s not in your PATH_in run_tesseract proc = subprocess.popen(cmd_args,-CSDN博客  

Haar+Tesseract 车牌识别实战

import cv2
import numpy as np
import pytesseract

# ./haarcascades/haarcascade_frontalface_default.xml
# 第一步,创建Haar级联器  导入训练好的数据 #./haarcascades/haarcascade_russian_plate_number.xml
plate = cv2.CascadeClassifier(
    "E:\\pycharm\\PycharmFile\\opencv\\face\\haarcascades\\haarcascade_russian_plate_number.xml")
# E:\pycharm\PycharmFile\opencv\face\haarcascades\haarcascade_russian_plate_number.xml

# 第二步,传入图片
img = cv2.imread('chinacar.jpeg')

# 第三步,车牌定位
# 返回值faces是一个数组[[x,y,w,h]]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plates = plate.detectMultiScale(gray, 1.1, 3)
i = 0
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'))  # --psm 8 是分页形式
                                                                                        # --oem 3 是选择3的引擎

cv2.imshow('IMG', img)
cv2.imshow('roi_bin', roi_bin)

cv2.waitKey(0)

使用DNN实现图像分类

DNN使用步骤

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

(2)读取图片视频

(3)将图片转为张量,送入深度神经网络

(4)进行分析,得到结果

导入模型

readNetFromTensorflow  导入的是Tensorflow模型

readNetFromCaffe  导入的是Caffe模型

readNetDarknet,YOLO  导入的是YOLO模型

readNet  会自动识别模型

导入模型API参数

readNetFromTensorflow(model,config)

readNetFromCaffe/Darknet(config,model)

readNet(model,[config,[framework]])

读取图片API

blobFromImage(image,scalefactor=1.0,size=Size(),mean=Scale(),swapRB=False,crop=false……)

scalefactor 缩放因子 

size 图像尺寸

mean 平均差值 消除输入图像中光照的变化 不同数据集有不同的规范

swapRB   R B是否进行交换 由于opencv默认图像是BGR的,但是深度学习可能是RGB也可能是BGR

crop 对图像是否进行裁剪

将张量送入网络并执行API

net.setInput(blob)

net.forward()

DNN实现图像分类实战代码

import cv2
import numpy as np
from cv2 import dnn

# 1 导入模型,创建神经网络
# 2 读图片,转成张量
# 3 将张量输入到神经网络中,并进行预测
# 4 得到结果,显示

# 1 导入模型,创建神经网络
config = "./model/bvlc_googlenet.prototxt"
model = "./model/bvlc_googlenet.caffemodel"
net = dnn.readNetFromCaffe(config, model)

# 2 读图片,转成张量
img = cv2.imread('smallcat.jpeg')
blob = dnn.blobFromImage(img,
                         1.0,  # 缩放因子
                         (224, 224),  # caffe 要求的尺寸
                         (104, 117, 123))

# 3 将张量输入到神经网络中,并进行预测
net.setInput(blob)  # 张量输入到神经网络中
r = net.forward()  # 进行预测 r是分类后的结果,人类不可知 需要进行转换

# 4 得到结果,显示
# 读入目录
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('类所在行:', [i] + 1, '', '可能性:', order[i])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值