OpenVINO实时人脸表面3D点云提取

举报
风吹稻花香 发表于 2021/07/26 23:34:02 2021/07/26
【摘要】 2019出现的一个可以在移动端实时运行的人脸3D表面提取模型-FaceMesh,被很多移动端AR应用作为底层算法实现人脸检测与人脸3D点云生成。相关的论文标题为: 《Real-time Facial Surface Geometry from Monocular Video on Mobile GPUs》 github有pytorch版本的实现地址如下: https:/...

2019出现的一个可以在移动端实时运行的人脸3D表面提取模型-FaceMesh,被很多移动端AR应用作为底层算法实现人脸检测与人脸3D点云生成。相关的论文标题为:

《Real-time Facial Surface Geometry from Monocular Video on Mobile GPUs》
 

github有pytorch版本的实现地址如下:

https://github.com/thepowerfuldeez/facemesh.pytorch

已经提供了预训练模型文件pth,可以用Netron打开查看。它的输入与输出显示截图如下:

图片

图-2

最终输出的点云数据是468个3D坐标人脸点云坐标,输入人脸的ROI区域,大小为192x192。使用Pytorch支持的脚本可以把该模型转换为ONNX格式模型,转换的脚本与代码如下:

from facemesh import FaceMeshimport torch
net = FaceMesh()net.load_weights("facemesh.pth")torch.onnx.export(net, torch.randn(13192192, device='cpu'), "facemesh.onnx",    input_names=("image", ), output_names=("preds""confs"), opset_version=9)
 

这样我们就得到了ONNX版本的模型文件。

OpenVINO调用facemesh模型

OpenVINO2020.x版本以后均支持直接读取ONNX格式模型文件,实现模型加载与推理调用。这里以OpenVINO2021.2版本为例。我们的基本思路是首先通过OpenVINO自带的人脸检测模型实现人脸检测,然后截取人脸ROI区域再送到facemesh模型中实现人脸3D表面点云468个点提取。人脸检测这里我们选择了OpenVINO自带的face-detection-0202模型文件,该模型是基于MobileNet SSDv版本,输入格式如下:

NCHW = 1x3x384x384
 

输出格式为:

1x1xNx7
 

通道的顺序是:BGR

从图-2得知人脸3D点云提取模型facemesh的输入格式为1x3x192x192,输出层有两个分别是preds与confs,其中preds是点云数据,confs表示置信度。preds的1404表示的是468个点每个点的三维坐标,总计468x3=1404。代码演示部分的步骤与运行结果详解说明与步骤。加载模型与获取输入与输出信息:


  
  1. # 加载人脸检测模型
  2. net = ie.read_network(model=model_xml, weights=model_bin)
  3. input_blob = next(iter(net.input_info))
  4. out_blob = next(iter(net.outputs))
  5. # 人脸检测的输入格式
  6. n, c, h, w = net.input_info[input_blob].input_data.shape
  7. print(n, c, h, w)
  8. exec_net = ie.load_network(network=net, device_name="CPU")
  9. # 加载人脸3D点云预测模型
  10. face_mesh_onnx = "facemesh.onnx"
  11. mesh_face_net = ie.read_network(model=face_mesh_onnx)
  12. # 输入格式
  13. em_input_blob = next(iter(mesh_face_net.input_info))
  14. en, ec, eh, ew = mesh_face_net.input_info[em_input_blob].input_data.shape
  15. print(en, ec, eh, ew)
  16. em_exec_net = ie.load_network(network=mesh_face_net, device_name="CPU")

人脸检测与获取人脸ROI然后提取人脸3D点云数据,然后显示:


  
  1. # 设置输入图像与人脸检测模型推理预测
  2. image = cv.resize(frame, (w, h))
  3. image = image.transpose(201)
  4. inf_start = time.time()
  5. res = exec_net.infer(inputs={input_blob: [image]})
  6. ih, iw, ic = frame.shape
  7. res = res[out_blob]
  8. # 解析人脸检测,获取ROI
  9. for obj in res[0][0]:
  10.     if obj[2] > 0.75:
  11.         xmin = int(obj[3] * iw)
  12.         ymin = int(obj[4] * ih)
  13.         xmax = int(obj[5] * iw)
  14.         ymax = int(obj[6] * ih)
  15.         if xmin < 0:
  16.             xmin = 0
  17.         if ymin < 0:
  18.             ymin = 0
  19.         if xmax >= iw:
  20.             xmax = iw - 1
  21.         if ymax >= ih:
  22.             ymax = ih - 1
  23.         # 截取人脸ROI,提取3D表面点云数据
  24.         roi = frame[ymin:ymax, xmin:xmax, :]
  25.         roi_img = cv.resize(roi, (ew, eh))
  26.         roi_img = np.float32(roi_img) / 127.5
  27.         roi_img = roi_img.transpose(201)
  28.         em_res = em_exec_net.infer(inputs={em_input_blob: [roi_img]})
  29.         # 转换为468个3D点云数据, 然后显示
  30.         prob_mesh = em_res["preds"]
  31.         prob_mesh= np.reshape(prob_mesh, (-13))
  32.         cv.rectangle(frame, (xmin, ymin), (xmax, ymax), (0255255), 28)
  33.         sx, sy= ew / roi.shape[1], eh / roi.shape[0]
  34.         for i in range(prob_mesh.shape[0]):
  35.             x, y = int(prob_mesh[i, 0] / sx), int(prob_mesh[i, 1] / sy)
  36.             cv.circle(frame, (xmin + x, ymin + y), 1, (00255), 1)
  37. # 计算帧率与显示点云结果
  38. inf_end = time.time() - inf_start
  39. cv.putText(frame, "infer time(ms): %.3f, FPS: %.2f" % (inf_end * 10001 / inf_end), (1050),
  40.            cv.FONT_HERSHEY_SIMPLEX, 1.0, (2550255), 28)
  41. cv.imshow("Face Detection + 3D mesh", frame)

运行显示结果如下:

图片

图片

图片

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/119113658

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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