1、第8章 人脸识别:机器也认识你课后习题答案一、考考你1.一个完整的人脸识别系统主要包含人脸图像采集和检测、 B 、人脸图像特征提取和人脸识别四个部分。A.人脸分类器B.人脸图像预处理C.人脸数据获取D.人脸模型训练2.刷脸支付比传统密码支付的突出优势是 B 。A.更快捷方便B.更安全C.更容易实现D.成本更低3.OpenCV库主要应用 A 领域的人工智能开发。A.计算机视觉和机器学习B.人脸识别C.深度神经网络D.图像处理4.下列OpenCV的哪个函数可定义一个人脸检测器 A 。A.CascadeClassifier( )B.detectMultiScale( )C.predict( )D.L
2、BPHFaceRecognizer_create( )5.关于百度PaddleHub错误的说法是 D 。A.它是一个预训练模型管理工具,支持一键预测B.它涵盖了图像分类、目标检测、词法和情感分析等许多主流模型C.它有不同的版本,用户在安装时可以指定具体的版本D.它的使用要有PaddlePaddle的支持二、亮一亮1.人脸识别验证与传统密码验证相比它有哪些优势?参考答案:人脸识别验证是利用人脸视觉特征信息进行身份鉴别的计算机技术,具备自然性、非强制性和非接触性等特点,而且人脸识别利用的是人脸的独一无二特性,不易被复制,识别率高,安全性高。2.简述如何使用OpenCV提供的人脸分类器来检测人脸。参
3、考答案:人脸检测是在提取人脸特征的基础上进行,OpenCV中支持Haar和LBP特征的分类器,我们以Haar分类器为例介绍人脸检测的步骤:1) 使用以下命令安装Python版本的OpenCV第三方库opencv-python:pip3 install opencv-python,安装好opencv-python后,就会在python的第三方模块文件夹site-packages下有一个新的文件夹cv2,在cv2/data/下保存了许多用于检测人脸、眼睛、微笑等训练好的分类器,这些分类器以XML文件的形式存储,如下图所示:2) Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,一起组
4、合成特征模板。Haar特征分类器的基本工作原理是:用一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的Haar特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。三、帮帮我1.人脸关键点提取是人脸识别的基础,请基于百度智能云开放接口编程实现人脸关键点提取并可视化效果,如下图8.24所示。 图8.24人脸原图(左图)及人脸关键点可视化(右图)提示:1)将请求的图片经Base64编码处理形成字符串。2)在百度智能云上创建人脸识别应用,基于应用的API Key和Secret Key这两个值来获取访问令牌acce
5、ss_token。3)将图片数据、图片类型、面域等请求参数发送给人脸关键点服务URL,返回识别结果。4)解析识别结果,并将关键点坐标以圆点的形式标记在人脸的相应位置。具体实现方法可参考百度智能云官方说明文档:参考答案:import requestsimport cv2import base64#获取访问令牌access_tokenclient_id=你的AK client_secret=你的SK# client_id 为你在官网获取的AK, client_secret 为你在官网获取的SKhost = +client_id+&client_secret=+client_secretrespon
6、se = requests.get(host)if response: access_token=response.json()access_token#图片base64转换image_path = face.jpgwith open(image_path, rb) as f: image = f.read() image_base64 =str(base64.b64encode(image),encoding=utf-8)#获取人脸关键点request_url = imageb64=image_base64params = image:+imageb64+,image_type:BASE64
7、,face_field:faceshape,landmarkaccess_token = 24.71d47eb914d09efc8c73f37ec19cf11d.2592000.1626017955.282335-24360061request_url = request_url + ?access_token= + access_tokenheaders = content-type: application/jsonresponse = requests.post(request_url, data=params, headers=headers)print(response:,respo
8、nse)if response: result=response.json() print(result:, result) landmarks=resultresultface_list0landmark72#在原始图片上标记关键点img=cv2.imread(image_path)for i in range(0,72): x=int(landmarksix) y=int(landmarksiy) cv2.circle(img=img, center=(x, y), radius=2, color=(0, 255, 0), thickness=-1)cv2.imshow(landmarkF
9、ace,img)cv2.waitKey(0)cv2.destroyAllWindows()2.设计一个人脸验证系统,与现有的人脸库进行比对,来验证摄像头前的人是否为合法用户。参考答案:# 步骤1、人脸检测# 打开摄像头,监测人脸import cv2 as cvdef face_detect(frame): # 图片转灰度 img_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 加载人脸分类识别器,这里的文件路径是笔者个人路径,读者需要相应替换 face_detector = cv.CascadeClassifier(D:/anaconda3/Lib
10、/site-packages/cv2/data/haarcascade_frontalface_default.xml) faces = face_detector.detectMultiScale(img_gray) for x, y, w, h in faces: cv.rectangle(frame, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1) cv.imshow(detecting, frame)if _name_ = _main_: # 读取摄像头中的图像,获取图像grabbed为true cap = cv.Vide
11、oCapture(0) while True: grabbed, img = cap.read() if grabbed: print(frame:, img.shape) else: break face_detect(img) if ord(q) = cv.waitKey(10): break cv.destroyAllWindows() cap.release()# 步骤2、人脸采集import cv2 as cvdef face_collect(face_id, username): print(n 正在初始化脸部识别,请保持在摄像头前面 .) count = 0 filename =
12、 # 读取内置摄像头中的图像,获取图像grabbed为true cap = cv.VideoCapture(0) # 加载人脸分类识别器 这里的文件路径是笔者个人路径,读者需要相应替换 face_detector = cv.CascadeClassifier(D:/anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml) while True: grabbed, img = cap.read() if grabbed: print(frame:, img.shape) else: break # 图片转灰
13、度 img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(img_gray) for x, y, w, h in faces: cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1) count += 1 # 保存图像的路径,读者可根据需要修改 filename = D:/face_data/ + username + . + str(face_id) + . + str(count)
14、+ .jpg print(filename) cv.imwrite(filename, img_grayy: y + h, x: x + w) cv.imshow(detecting, img) if ord(q) = cv.waitKey(20): break elif count 100: break cv.destroyAllWindows() cap.release()if _name_ = _main_: user_id = input(n 输入用户ID,从0开始递增:) user_name = input(n 输入用户英文名:) face_collect(user_id, user
15、_name)采集过程和图像保存结果如下:# 3、人脸训练import numpy as npfrom PIL import Imageimport osimport cv2 as cvdef face_training(): print(人脸训练,请耐心等待 .) # 人脸图片路径, 同步骤2保存的人脸图片的路径 face_path = D:/face_data/ # opencv-contrib-python包中的函数 recognizer = cv.face.LBPHFaceRecognizer_create() # 载入人脸分类器 这里的文件路径是笔者个人路径,读者需要相应替换 face
16、_detector = cv.CascadeClassifier(D:/anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml) image_paths = os.path.join(face_path, f) for f in os.listdir(face_path) face_samples = ids = for imagePath in image_paths: img_gray = Image.open(imagePath).convert(L) img_numpy = np.array(im
17、g_gray, uint8) # 图片的命名方式 xx.id.num.ext(xx为任意英文标识,id是标签,同类人脸id相同,num一般为该类图片的计数,ext为图片后缀) # 文件名中关键就是id,作为有监督学习,id就是用于分类 user_id = int(os.path.split(imagePath)-1.split(.)1) print(user_id, , imagePath) faces = face_detector.detectMultiScale(img_numpy) for x, y, w, h in faces: face_samples.append(img_num
18、pyy:y + h, x:x + w) ids.append(user_id) recognizer.train(face_samples, np.array(ids) # 保存训练信息,路径读者可根据需要修改 recognizer.write(D:/face_trainer/trainer.yml) print(0 faces trained. Exiting Program.format(len(np.unique(ids)if _name_ = _main_: face_training()# 步骤4、人脸识别# 从视频中识别人脸import cv2 as cvdef face_reco
19、gnition(): recognizer = cv.face.LBPHFaceRecognizer_create() # 读取训练数据, 路径同步骤3训练文件的保存路径 recognizer.read(D:/face_trainer/trainer.yml) # 载入人脸分类器 这里的文件路径是笔者个人路径,读者需要相应替换 face_detector = cv.CascadeClassifier(D:/anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml) font = cv.FONT_HERSHE
20、Y_SIMPLEX feature_id = None # 以训练的时候,按人脸id进行排序 names = shaoshizhi, zhanghongqin, chenyulin, rongsheng cap = cv.VideoCapture(0) # minW = 0.1*cap.get(3) # minH = 0.1*cap.get(4) while True: grabbed, img = cap.read() if grabbed: print(frame:, img.shape) else: break # 图片转灰度 img_gray = cv.cvtColor(img, cv
21、.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(img_gray) for x, y, w, h in faces: cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1) # 预测 feature_id, confidence = recognizer.predict(img_grayy:y + h, x:x + w) print(feature_id, , confidence) if confidence 100: feature_i
22、d = namesfeature_id confidence = 0%.format(round(100 - confidence) else: feature_id = unknown confidence = 0%.format(round(100 - confidence) cv.putText(img, str(feature_id), (x + 5, y - 5), font, 1, (0, 0, 255), 1) cv.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 255, 0), 1) cv.imshow(recognizing, img) if ord(q) = cv.waitKey(10): break cv.destroyAllWindows() cap.release()if _name_ = _main_: face_recognition()