回顾-AI实战营-人脸区域及关键点检测

网友投稿 722 2022-05-29

首先我们通过视频学习之后,会有官方给的链接,复制之后打开如下图一,~因为复制粘贴少了一个符号-

复制粘贴后时(例子):https://nbviewer.jupyter.org/github/huaweicloud/ModelArtsLab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb

然后打开:

https://nbviewer.jupyter.org/图二

需要手动修改一下:https://nbviewer.jupyter.org/github/huaweicloud/ModelArts-Lab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb(成功打开的例子)将手动修改后的链接复制到如下图,回车即可打开

本次实验链接 https://nbviewer.jupyter.org/github/huaweicloud/ModelArts-Lab/blob/master/notebook/DL_face_detector/face_detection.ipynb

具体操作步骤:

登陆ModelArts控制台https://www.huaweicloud.com/product/modelarts.html -> 开发环境 -> Notebook -> 创建

名称:任意设置参数:python3-公共资源池-GPU-云硬盘EVS

创建Notebook

可以选择免费的版本,但是免费的要排队哦~

点击提交

创建步骤我就直接省略了,直接启动以及创建好的,初次创建只要选择好GPU一般都不会出现什么问题,如果选择cpu可能会出现内存耗尽的问题,所以建议选择GPU~

点击‘new’选择 ’tensorflow-1.13.1’

在Notebook中,我们输入一个简单的打印语句,然后点击上方的运行按钮,可以查看语句执行的结果:"如果未输出结果,则环境还没准备好,稍等一下在试试,还不能输出结果,则重新创建环境

数据和代码下载

运行下面代码,进行数据和代码的下载和解压

import os from modelarts.session import Session sess = Session() if sess.region_name == 'cn-north-1': bucket_path="modelarts-labs/notebook/DL_face_detector/face_detector.tar.gz" elif sess.region_name == 'cn-north-4': bucket_path="modelarts-labs-bj4/notebook/DL_face_detector/face_detector.tar.gz" else: print("请更换地区到北京一或北京四") if not os.path.exists('./models/detector.dat'): sess.download_data(bucket_path=bucket_path, path="./face_detector.tar.gz")

if os.path.exists('./face_detector.tar.gz'): # 使用tar命令解压资源包 os.system("tar -xf ./face_detector.tar.gz") # 清理压缩包 os.system("rm ./face_detector.tar.gz")

安装依赖

!pip install dlib==19.17.0

from PIL import Image import dlib

获取基于神经网络CNN的人脸区域检测器,并加载预训练模型。

dlib.cnn_face_detection_model_v1()方法介绍: http://dlib.net/cnn_face_detector.py.html

cnn_face_detector = dlib.cnn_face_detection_model_v1("./models/detector.dat")

也可以通过notebook的upload按钮上传自己的测试数据。,测试数据需要是图片,并且放在test文件夹下

image = dlib.load_rgb_image("./test.jpg")

回顾-AI实战营-人脸区域及关键点检测

检测,得到图片中人脸的位置。返回人脸区域左上角和右下角的坐标

dets = cnn_face_detector(image, 1)

打印检测结果

dets

print("Number of faces detected: {}".format(len(dets))) for i, d in enumerate(dets): print("Detection {}: Left: {} Top: {} Right: {} Bottom: {} Confidence: {}".format( i, d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom(), d.confidence))

rects = dlib.rectangles() rects.extend([d.rect for d in dets])

rects

import cv2 res_img = cv2.rectangle(image, (rects[0].left(), rects[0].top()), (rects[0].right(), rects[0].bottom()), 0, 1)

Image.fromarray(res_img)

人脸关键点检测

人脸关键点检测,依赖人脸区域检测输出的人脸位置,然后在人脸区域内检测人脸关键点。会输出68个人脸关键点。

检测人脸区域

获取人脸区域检测器

dlib.get_frontal_face_detector()方法返回基于HoG (Histogram of Oriented Gradients)的人脸区域检测器。HoG是图像处理领域用于目标检测的特征描述器。

detector = dlib.get_frontal_face_detector()

dets = detector(image, 1)

检测人脸关键点

获取基于神经网络的人脸关键点检测模型,并加载预训练模型

predictor_kp = dlib.shape_predictor("./models/shape_predictor_68_face_landmarks.dat")

人脸关键点检测,检测人脸的68个关键点。

for k, d in enumerate(dets): # 遍历每个人脸框 print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( k, d.left(), d.top(), d.right(), d.bottom())) res_img = cv2.rectangle(res_img,( d.left(), d.top()), (d.right(), d.bottom()), 0, 1) # 检测人脸关键点 shape = predictor_kp(image, d) print("Point 0: {}, Point 1: {} ...".format(shape.part(0), shape.part(1)))

显示关键点检测结果

绘制关键点

for i in range(68): res_img = cv2.circle(res_img,(shape.part(i).x,shape.part(i).y), 1, 255, 4)

显示人脸区域和68个关键点的检测结果

Image.fromarray(res_img)

视频人脸检测

使用OpenCV读取一段视频,然后逐帧显示视频。

from IPython.display import clear_output, Image, display, HTML import time import cv2 import base64 import numpy as np # 原视频来源:UCF-101数据集 video_name = "./face.avi" def arrayShow(img): _,ret = cv2.imencode('.jpg', img) return Image(data=ret) # 打开一个视频流 cap = cv2.VideoCapture(video_name) frame_id = 0 while True: try: clear_output(wait=True) # 清除之前的显示 ret, frame = cap.read() # 读取一帧图片 if ret: frame_id += 1 if frame_id > 100: break cv2.putText(frame, str(frame_id), (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) # 画frame_id tmp = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换色彩模式 img = arrayShow(frame) display(img) # 显示图片 time.sleep(0.05) # 线程睡眠一段时间再处理下一帧图片 else: break except KeyboardInterrupt: cap.release() cap.release()

人脸关键点检测函数

使用dlib集成的深度学习模型,检测人脸的68个关键点。

def keypoint_detector(image): global res_img detector = dlib.get_frontal_face_detector() # 获取人脸区域检测器 dets = detector(image, 1) # 检测人脸区域 predictor_kp = dlib.shape_predictor("./models/shape_predictor_68_face_landmarks.dat") # 加载人脸关键点检测模型 for k, d in enumerate(dets): print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( k, d.left(), d.top(), d.right(), d.bottom())) res_img = cv2.rectangle(image,( d.left(), d.top()), (d.right(), d.bottom()), 0, 1) shape = predictor_kp(image, d) # 检测人脸关键点 for i in range(68): res_img = cv2.circle(image,(shape.part(i).x,shape.part(i).y), 1, 255, 2) return res_img

检测视频中的人脸关键点,并显示检测结果,由于dlib做人脸关键点检测比较慢,因此只显示10帧图片的检测结果

def arrayShow(img): _,ret = cv2.imencode('.jpg', img) return Image(data=ret) cap = cv2.VideoCapture(video_name) frame_id = 0 while True: try: clear_output(wait=True) ret, frame = cap.read() if ret: frame_id += 1 if frame_id > 10: break cv2.putText(frame, str(frame_id), (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) # 画frame_id res_img = keypoint_detector(frame) img = arrayShow(res_img) display(img) else: break except KeyboardInterrupt: cap.release() cap.release()

AI OpenCV 云学院

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:怎样理解Linux的文件系统
下一篇:分布式系统关注点(21)——构建「易测试」系统的“六脉神剑”
相关文章