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

举报
QGS 发表于 2021/02/18 17:57:47 2021/02/18
【摘要】 回顾-AI实战营-人脸区域及关键点检测

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

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

0614b0c940b1cf52e94ed476c356791.png

然后打开:https://nbviewer.jupyter.org/图二

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

dd6dfe6d91df36d46669c4a4090affa.png

c81fd7e386d091fa3bec8532d1695ae.png

本次实验链接 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中,我们输入一个简单的打印语句,然后点击上方的运行按钮,可以查看语句执行的结果:"如果未输出结果,则环境还没准备好,稍等一下在试试,还不能输出结果,则重新创建环境run_helloworld


数据和代码下载

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

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")

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

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()

【版权声明】本文为华为云社区用户翻译文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容, 举报邮箱:cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。