回顾-AI实战营-人脸区域及关键点检测
首先我们通过视频学习之后,会有官方给的链接,复制之后打开如下图一,~因为复制粘贴少了一个符号-
一
然后打开: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")
检测,得到图片中人脸的位置。返回人脸区域左上角和右下角的坐标
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)
检测人脸区域
获取人脸区域检测器
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)
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()
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
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()
- 点赞
- 收藏
- 关注作者
评论(0)