十五、人脸识别项目
主要方法:
- 哈尔(Haar)级联方法
- 深度学习方法(DNN)
Haar是专门为解决人脸识别而推出的,在深度学习还不流行时,Haar已可以商用。
1、Haar人脸识别
基本步骤:
- 创建Haar级联器
- 导入图像并将其灰度化
- 调用detectMultiScale方法进行人脸识别
detectMultiScale()
用法:
detectMultiScale(image, scaleFactor: None, minNeighbors: None, flags: None, minSize: None, maxSize: None)
代码实现:
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()
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()
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()
88888
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]]
blobFromImage()
用法:
dnn.blobFromImage(image, scalefactor: None, size: None, mean: None, swapRB: None, crop: None, ddepth: None
参数说明:
- scalefactor:缩放因子
- size:输入图像尺寸
- mean:平均差值
将张量送入网络并执行:
net.setInput(blob) r = net.forward()
代码实现: 物体分类
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 项, 匹配: Siamese cat, Siamese 类所在行: 285 可能性: 0.22166264 第 2 项, 匹配: tabby, tabby cat 类所在行: 282 可能性: 0.13451944 第 3 项, 匹配: tiger cat 类所在行: 283 可能性: 0.1054367