一 基本概念
1 计算机视觉与机器学习的关系
计算机视觉是机器学习的一种应用,而且是最有价的应用。
2 人脸识别
哈尔(haar)级联方法
Harr是专门为解决人脸识别而推出的;
在深度学习还不流行时,Harr已可以商用;
深度学习方法(DNN)
3 Haar人脸识别步骤
创建Haar级联器
导入图片并将其灰度化
调用detectMultiScale方法进行人脸识别
detectMultiScale
detectMultiScale(img,
double scaleFactor=1.1,
int minNeighbors=3,
...)
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=facer.detectMultiScale(gray,1.1,5)for(x,y,w,h)in faces:cv2.rectangle(img,(x,y),(x+w,y+w),(0,0,255))cv2.imshow('img',img)
cv2.waitKey(0)
4 其他脸部特征的检测
眼
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=facer.detectMultiScale(gray,1.1,5)
for(x,y,w,h)in faces:cv2.rectangle(img,(x,y),(x+w,y+w),(0,0,255),2)eyes = eye.detectMultiScale(gray, 1.1, 3)
for (x, y, w, h) in eyes:cv2.rectangle(img, (x, y), (x + w, y + w), (0, 0, 255),2)cv2.imshow('img',img)
cv2.waitKey(0)
鼻
import cv2
import numpy as np# 第一步 创建Haar级联器
facer=cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')eye=cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')mouth=cv2.CascadeClassifier('./haarcascades/haarcascade_mcs_mouth.xml')nose=cv2.CascadeClassifier('./haarcascades/haarcascade_mcs_nose.xml')# 第二步 导入人脸识别图片并将其灰度化
img=cv2.imread('p3.png')
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+w),(0,0,255),2)roi_img=img[y:y+h,x:x+w]eyes = eye.detectMultiScale(roi_img, 1.1, 3)for (x, y, w, h) in eyes:cv2.rectangle(roi_img, (x, y), (x + w, y + w), (0, 0, 255),2)i=i+1winname='face'+str(i)cv2.imshow(winname,roi_img)#mouths = mouth.detectMultiScale(gray, 1.1, 3)
#for (x, y, w, h) in mouths:
# cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0), 2)#noses = nose.detectMultiScale(gray, 1.1, 3)
#for (x, y, w, h) in noses:
# cv2.rectangle(img, (x, y), (x + w, y + w), (255, 255, 0), 2)cv2.imshow('img',img)
cv2.waitKey(0)
二 车牌识别的具体步骤
通过Haar定位车牌的大体位置;
对车牌进行预处理;
调用tesseract进行文字识别;
1 车牌预处理包括的内容
对车牌进行二值化处理;
进行形态学处理;
滤波去噪点;
缩放;
2 Tesseract的安装
brew install tesseract tesseract-lang
pip3 install pytesseract
import cv2
import numpy as npimport pytesseractplate=cv2.CascadeClassifier('./haarcascades/haarcascade_russian_plate_number.xml')
img=cv2.imread('./chinacar.jpeg')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]
#进行二值化
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('roi_bin',roi_bin)
cv2.imshow('img', img)
cv2.waitKey()
三 深度学习
1 DNN
2 RNN
3 RNN主要用途
语音识别
机器翻译
生产图像描述
4 CNN
5 CNN主要用途
图片分类、检索
目标定位检测
目标分割
人脸识别
四 DNN实现图像分类
1 DNN 使用步骤
读取模型,并得到深度神经网络;
读取图片/视频;
将图片转成张量,送入深度神经网络;
进行分析得到结果
2 导入模型
readNetFromTensorflow
readNetFromCaffe
readnetDarknet,YOLO
readNet
3 导入模型API参数
readNetFromTensorFlow(model,config)
readNetFromCaffe/Darknet(config,model)
readNet(model,[config,[framework]])
4 blobFromImage函数
将图像转成张量
blobFromImage(image,
scalefactor=1.0,
size=Size(),
mean=Scalar(),
swapRB=false,
swapRB=false,
crop=false...)
mean的含义
5 将张量送入网络并执行
net.setInput(blob)
net.forward()
import cv2
from cv2 import dnn
import numpy as np#导入模型,创建神经网络
config="./model/bvlc_googlenet.protoxt"
model="./model/bvlc_googlenet.caffemodel"
net=dnn.readNetFromCaffe(config,model)
#读图片,转成张量
img=cv2.imread('./smallcat.jpeg')
blob=dnn.blobFromImage(img,1.0(224,224),(104,117,123))
#将张量输入到网络中,并进行预测
net.setInput(blob)
r=net.forward()#读net.forwar()#读取类目
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])#得到结果,显示